Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DfFinanceDepositsMultiSig
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-08-03
*/
/**
*Submitted for verification at Etherscan.io on 2020-08-03
*/
// File: @openzeppelin\upgrades\contracts\Initializable.sol
pragma solidity >=0.4.24 <0.7.0;
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized);
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
// File: contracts\upgradable\OwnableUpgradable.sol
pragma solidity ^0.5.16;
// import "../openzeppelin/upgrades/contracts/Initializable.sol";
contract OwnableUpgradable is Initializable {
address payable public owner;
address payable internal newOwnerCandidate;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
// ** INITIALIZERS – Constructors for Upgradable contracts **
function initialize() public initializer {
owner = msg.sender;
}
function initialize(address payable newOwner) public initializer {
owner = newOwner;
}
function changeOwner(address payable newOwner) public onlyOwner {
newOwnerCandidate = newOwner;
}
function acceptOwner() public {
require(msg.sender == newOwnerCandidate);
owner = newOwnerCandidate;
}
uint256[50] private ______gap;
}
// File: contracts\utils\SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b);
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts\utils\Address.sol
pragma solidity ^0.5.5;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* This test is non-exhaustive, and there may be false-negatives: during the
* execution of a contract's constructor, its address will be reported as
* not containing a contract.
*
* IMPORTANT: It is unsafe to assume that an address for which this
* function returns false is an externally-owned account (EOA) and not a
* contract.
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount);
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success);
}
}
// File: contracts\interfaces\IToken.sol
pragma solidity ^0.5.16;
interface IToken {
function decimals() external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function balanceOf(address account) external view returns (uint);
function approve(address spender, uint value) external;
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function deposit() external payable;
function withdraw(uint amount) external;
}
// File: contracts\utils\SafeERC20.sol
pragma solidity ^0.5.16;
// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
// import "@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IToken token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IToken token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IToken token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0));
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IToken token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IToken token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IToken token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract());
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success);
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)));
}
}
}
// File: contracts\utils\UniversalERC20.sol
pragma solidity ^0.5.16;
// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
// import "./SafeMath.sol";
library UniversalERC20 {
using SafeMath for uint256;
using SafeERC20 for IToken;
IToken private constant ZERO_ADDRESS = IToken(0x0000000000000000000000000000000000000000);
IToken private constant ETH_ADDRESS = IToken(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
function universalTransfer(IToken token, address to, uint256 amount) internal {
universalTransfer(token, to, amount, false);
}
function universalTransfer(IToken token, address to, uint256 amount, bool mayFail) internal returns(bool) {
if (amount == 0) {
return true;
}
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
if (mayFail) {
return address(uint160(to)).send(amount);
} else {
address(uint160(to)).transfer(amount);
return true;
}
} else {
token.safeTransfer(to, amount);
return true;
}
}
function universalApprove(IToken token, address to, uint256 amount) internal {
if (token != ZERO_ADDRESS && token != ETH_ADDRESS) {
token.safeApprove(to, amount);
}
}
function universalTransferFrom(IToken token, address from, address to, uint256 amount) internal {
if (amount == 0) {
return;
}
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
require(from == msg.sender && msg.value >= amount, "msg.value is zero");
if (to != address(this)) {
address(uint160(to)).transfer(amount);
}
if (msg.value > amount) {
msg.sender.transfer(uint256(msg.value).sub(amount));
}
} else {
token.safeTransferFrom(from, to, amount);
}
}
function universalBalanceOf(IToken token, address who) internal view returns (uint256) {
if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
return who.balance;
} else {
return token.balanceOf(who);
}
}
}
// File: contracts\upgradable\FundsMgrUpgradable.sol
pragma solidity ^0.5.16;
// import "../openzeppelin/upgrades/contracts/Initializable.sol";
contract FundsMgrUpgradable is Initializable, OwnableUpgradable {
using UniversalERC20 for IToken;
// Initializer – Constructor for Upgradable contracts
function initialize() public initializer {
OwnableUpgradable.initialize(); // Initialize Parent Contract
}
function initialize(address payable newOwner) public initializer {
OwnableUpgradable.initialize(newOwner); // Initialize Parent Contract
}
function withdraw(address token, uint256 amount) public onlyOwner {
if (token == address(0x0)) {
owner.transfer(amount);
} else {
IToken(token).universalTransfer(owner, amount);
}
}
function withdrawAll(address[] memory tokens) public onlyOwner {
for(uint256 i = 0; i < tokens.length;i++) {
withdraw(tokens[i], IToken(tokens[i]).universalBalanceOf(address(this)));
}
}
uint256[50] private ______gap;
}
// File: contracts\upgradable\AdminableUpgradable.sol
pragma solidity ^0.5.16;
// import "../openzeppelin/upgrades/contracts/Initializable.sol";
contract AdminableUpgradable is Initializable, OwnableUpgradable {
mapping(address => bool) public admins;
modifier onlyOwnerOrAdmin {
require(msg.sender == owner ||
admins[msg.sender], "Permission denied");
_;
}
// Initializer – Constructor for Upgradable contracts
function initialize() public initializer {
OwnableUpgradable.initialize(); // Initialize Parent Contract
}
function initialize(address payable newOwner) public initializer {
OwnableUpgradable.initialize(newOwner); // Initialize Parent Contract
}
function setAdminPermission(address _admin, bool _status) public onlyOwner {
admins[_admin] = _status;
}
function setAdminPermission(address[] memory _admins, bool _status) public onlyOwner {
for (uint i = 0; i < _admins.length; i++) {
admins[_admins[i]] = _status;
}
}
uint256[50] private ______gap;
}
// File: contracts\constants\ConstantAddressesMainnet.sol
pragma solidity ^0.5.16;
contract ConstantAddresses {
address public constant COMPTROLLER = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B;
// address public constant COMPOUND_ORACLE = 0x1D8aEdc9E924730DD3f9641CDb4D1B92B848b4bd;
address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address public constant CDAI_ADDRESS = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
address public constant COMP_ADDRESS = 0xc00e94Cb662C3520282E6f5717214004A7f26888;
address public constant USDT_ADDRESS = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}
// File: contracts\utils\DSMath.sol
pragma solidity ^0.5.0;
contract DSMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x);
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x);
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x);
}
function min(uint x, uint y) internal pure returns (uint z) {
return x <= y ? x : y;
}
function max(uint x, uint y) internal pure returns (uint z) {
return x >= y ? x : y;
}
function imin(int x, int y) internal pure returns (int z) {
return x <= y ? x : y;
}
function imax(int x, int y) internal pure returns (int z) {
return x >= y ? x : y;
}
uint constant WAD = 10 ** 18;
uint constant RAY = 10 ** 27;
function wmul(uint x, uint y, uint base) internal pure returns (uint z) {
z = add(mul(x, y), base / 2) / base;
}
function wmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, RAY), y / 2) / y;
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
/*function rpow(uint x, uint n) internal pure returns (uint z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}*/
}
// File: contracts\flashloan\interfaces\IFlashLoanReceiver.sol
pragma solidity ^0.5.16;
/**
* @title IFlashLoanReceiver interface
* @notice Interface for the Aave fee IFlashLoanReceiver.
* @author Aave
* @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract
**/
interface IFlashLoanReceiver {
function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external;
}
// File: contracts\flashloan\interfaces\ILendingPoolAddressesProvider.sol
pragma solidity ^0.5.0;
/**
@title ILendingPoolAddressesProvider interface
@notice provides the interface to fetch the LendingPoolCore address
*/
interface ILendingPoolAddressesProvider {
function getLendingPool() external view returns (address);
function setLendingPoolImpl(address _pool) external;
function getLendingPoolCore() external view returns (address payable);
function setLendingPoolCoreImpl(address _lendingPoolCore) external;
function getLendingPoolConfigurator() external view returns (address);
function setLendingPoolConfiguratorImpl(address _configurator) external;
function getLendingPoolDataProvider() external view returns (address);
function setLendingPoolDataProviderImpl(address _provider) external;
function getLendingPoolParametersProvider() external view returns (address);
function setLendingPoolParametersProviderImpl(address _parametersProvider) external;
function getTokenDistributor() external view returns (address);
function setTokenDistributor(address _tokenDistributor) external;
function getFeeProvider() external view returns (address);
function setFeeProviderImpl(address _feeProvider) external;
function getLendingPoolLiquidationManager() external view returns (address);
function setLendingPoolLiquidationManager(address _manager) external;
function getLendingPoolManager() external view returns (address);
function setLendingPoolManager(address _lendingPoolManager) external;
function getPriceOracle() external view returns (address);
function setPriceOracle(address _priceOracle) external;
function getLendingRateOracle() external view returns (address);
function setLendingRateOracle(address _lendingRateOracle) external;
}
// File: contracts\utils\EthAddressLib.sol
pragma solidity ^0.5.0;
library EthAddressLib {
/**
* @dev returns the address used within the protocol to identify ETH
* @return the address assigned to ETH
*/
function ethAddress() internal pure returns(address) {
return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
}
}
// File: contracts\flashloan\base\FlashLoanReceiverBase.sol
pragma solidity ^0.5.0;
// import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol";
contract FlashLoanReceiverBase is IFlashLoanReceiver {
using SafeERC20 for IToken;
// Mainnet Aave LendingPoolAddressesProvider address
address public constant AAVE_ADDRESSES_PROVIDER = 0x24a42fD28C976A61Df5D00D0599C34c4f90748c8;
// Kovan Aave LendingPoolAddressesProvider addres
// address public constant AAVE_ADDRESSES_PROVIDER = 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5;
function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
address payable core = ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPoolCore();
transferInternal(core, _reserve, _amount);
}
function transferInternal(address _destination, address _reserve, uint256 _amount) internal {
if(_reserve == EthAddressLib.ethAddress()) {
address payable receiverPayable = address(uint160(_destination));
//solium-disable-next-line
(bool result, ) = receiverPayable.call.value(_amount)("");
require(result, "Transfer of ETH failed");
return;
}
IToken(_reserve).safeTransfer(_destination, _amount);
}
function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
if(_reserve == EthAddressLib.ethAddress()) {
return _target.balance;
}
return IToken(_reserve).balanceOf(_target);
}
}
// File: contracts\multisig\MultiOwnable.sol
pragma solidity ^0.5.16;
contract MultiOwnable is
Initializable
{
struct VoteInfo {
uint16 votesCounter;
uint64 curVote;
mapping(uint => mapping (address => bool)) isVoted; // [curVote][owner]
}
uint public constant MIN_VOTES = 2;
mapping(bytes => VoteInfo) public votes;
mapping(address => bool) public multiOwners;
uint public multiOwnersCounter;
event VoteForCalldata(address _owner, bytes _data);
modifier onlyMultiOwners {
require(multiOwners[msg.sender], "Permission denied");
uint curVote = votes[msg.data].curVote;
// vote for current call
if (!votes[msg.data].isVoted[curVote][msg.sender]) {
votes[msg.data].isVoted[curVote][msg.sender] = true;
votes[msg.data].votesCounter++;
}
if (votes[msg.data].votesCounter >= MIN_VOTES ||
votes[msg.data].votesCounter >= multiOwnersCounter
){
// iterate to new vote for this msg.data
votes[msg.data].votesCounter = 0;
votes[msg.data].curVote++;
_;
} else {
emit VoteForCalldata(msg.sender, msg.data);
}
}
// ** INITIALIZERS **
function initialize() public initializer {
_addOwner(msg.sender);
}
function initialize(address[] memory _newOwners) public initializer {
require(_newOwners.length > 0);
for (uint i = 0; i < _newOwners.length; i++) {
_addOwner(_newOwners[i]);
}
}
// ** ONLY_MULTI_OWNERS functions **
function addOwner(address _newOwner) public onlyMultiOwners {
_addOwner(_newOwner);
}
function addOwners(address[] memory _newOwners) public onlyMultiOwners {
require(_newOwners.length > 0);
for (uint i = 0; i < _newOwners.length; i++) {
_addOwner(_newOwners[i]);
}
}
function removeOwner(address _exOwner) public onlyMultiOwners {
_removeOwner(_exOwner);
}
function removeOwners(address[] memory _exOwners) public onlyMultiOwners {
require(_exOwners.length > 0);
for (uint i = 0; i < _exOwners.length; i++) {
_removeOwner(_exOwners[i]);
}
}
// ** INTERNAL functions **
function _addOwner(address _newOwner) internal {
require(!multiOwners[_newOwner]);
// UPD states
multiOwners[_newOwner] = true;
multiOwnersCounter++;
}
function _removeOwner(address _exOwner) internal {
require(multiOwners[_exOwner]);
require(multiOwnersCounter > 1);
// UPD states
multiOwners[_exOwner] = false;
multiOwnersCounter--; // safe
}
}
// File: contracts\compound\interfaces\IDfWalletFactory.sol
pragma solidity ^0.5.16;
interface IDfWalletFactory {
function createDfWallet() external returns (address dfWallet);
}
// File: contracts\compound\interfaces\ICompoundOracle.sol
pragma solidity ^0.5.16;
interface ICompoundOracle {
function getUnderlyingPrice(address cToken) external view returns (uint);
}
// File: contracts\compound\interfaces\IComptroller.sol
pragma solidity ^0.5.16;
contract IComptroller {
mapping(address => uint) public compAccrued;
function claimComp(address holder, address[] memory cTokens) public;
function enterMarkets(address[] calldata cTokens) external returns (uint256[] memory);
function exitMarket(address cToken) external returns (uint256);
function getAssetsIn(address account) external view returns (address[] memory);
function getAccountLiquidity(address account) external view returns (uint256, uint256, uint256);
function markets(address cTokenAddress) external view returns (bool, uint);
struct CompMarketState {
/// @notice The market's last updated compBorrowIndex or compSupplyIndex
uint224 index;
/// @notice The block number the index was last updated at
uint32 block;
}
function compSupplyState(address) view public returns(uint224, uint32);
function compBorrowState(address) view public returns(uint224, uint32);
// mapping(address => CompMarketState) public compBorrowState;
mapping(address => mapping(address => uint)) public compSupplierIndex;
mapping(address => mapping(address => uint)) public compBorrowerIndex;
}
// File: contracts\compound\interfaces\IDfWallet.sol
pragma solidity ^0.5.16;
interface IDfWallet {
function claimComp(address[] calldata cTokens) external;
function borrow(address _cTokenAddr, uint _amount) external;
function setDfFinanceClose(address _dfFinanceClose) external;
function deposit(
address _tokenIn, address _cTokenIn, uint _amountIn, address _tokenOut, address _cTokenOut, uint _amountOut
) external payable;
function withdraw(
address _tokenIn, address _cTokenIn, address _tokenOut, address _cTokenOut
) external payable;
function withdraw(
address _tokenIn, address _cTokenIn, uint256 amountRedeem, address _tokenOut, address _cTokenOut, uint256 amountPayback
) external payable returns(uint256);
function withdrawToken(address _tokenAddr, address to, uint256 amount) external;
}
// File: contracts\compound\interfaces\ICToken.sol
pragma solidity ^0.5.16;
interface ICToken {
function borrowIndex() view external returns (uint256);
function mint(uint256 mintAmount) external returns (uint256);
function mint() external payable;
function redeem(uint256 redeemTokens) external returns (uint256);
function redeemUnderlying(uint256 redeemAmount) external returns (uint256);
function borrow(uint256 borrowAmount) external returns (uint256);
function repayBorrow(uint256 repayAmount) external returns (uint256);
function repayBorrow() external payable;
function repayBorrowBehalf(address borrower, uint256 repayAmount) external returns (uint256);
function repayBorrowBehalf(address borrower) external payable;
function liquidateBorrow(address borrower, uint256 repayAmount, address cTokenCollateral)
external
returns (uint256);
function liquidateBorrow(address borrower, address cTokenCollateral) external payable;
function exchangeRateCurrent() external returns (uint256);
function supplyRatePerBlock() external returns (uint256);
function borrowRatePerBlock() external returns (uint256);
function totalReserves() external returns (uint256);
function reserveFactorMantissa() external returns (uint256);
function borrowBalanceCurrent(address account) external returns (uint256);
function borrowBalanceStored(address account) external view returns (uint256);
function totalBorrowsCurrent() external returns (uint256);
function getCash() external returns (uint256);
function balanceOfUnderlying(address owner) external returns (uint256);
function balanceOf(address owner) view external returns (uint256);
function underlying() external returns (address);
}
// File: contracts\flashloan\interfaces\ILendingPool.sol
pragma solidity ^0.5.16;
interface ILendingPool {
function addressesProvider () external view returns ( address );
function deposit ( address _reserve, uint256 _amount, uint16 _referralCode ) external payable;
function redeemUnderlying ( address _reserve, address _user, uint256 _amount ) external;
function borrow ( address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode ) external;
function repay ( address _reserve, uint256 _amount, address _onBehalfOf ) external payable;
function swapBorrowRateMode ( address _reserve ) external;
function rebalanceFixedBorrowRate ( address _reserve, address _user ) external;
function setUserUseReserveAsCollateral ( address _reserve, bool _useAsCollateral ) external;
function liquidationCall ( address _collateral, address _reserve, address _user, uint256 _purchaseAmount, bool _receiveAToken ) external payable;
function flashLoan ( address _receiver, address _reserve, uint256 _amount, bytes calldata _params ) external;
function getReserveConfigurationData ( address _reserve ) external view returns ( uint256 ltv, uint256 liquidationThreshold, uint256 liquidationDiscount, address interestRateStrategyAddress, bool usageAsCollateralEnabled, bool borrowingEnabled, bool fixedBorrowRateEnabled, bool isActive );
function getReserveData ( address _reserve ) external view returns ( uint256 totalLiquidity, uint256 availableLiquidity, uint256 totalBorrowsFixed, uint256 totalBorrowsVariable, uint256 liquidityRate, uint256 variableBorrowRate, uint256 fixedBorrowRate, uint256 averageFixedBorrowRate, uint256 utilizationRate, uint256 liquidityIndex, uint256 variableBorrowIndex, address aTokenAddress, uint40 lastUpdateTimestamp );
function getUserAccountData ( address _user ) external view returns ( uint256 totalLiquidityETH, uint256 totalCollateralETH, uint256 totalBorrowsETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor );
function getUserReserveData ( address _reserve, address _user ) external view returns ( uint256 currentATokenBalance, uint256 currentUnderlyingBalance, uint256 currentBorrowBalance, uint256 principalBorrowBalance, uint256 borrowRateMode, uint256 borrowRate, uint256 liquidityRate, uint256 originationFee, uint256 variableBorrowIndex, uint256 lastUpdateTimestamp, bool usageAsCollateralEnabled );
function getReserves () external view;
}
// File: contracts\interfaces\IOneInchExchange.sol
pragma solidity ^0.5.16;
interface IOneInchExchange {
function spender() external view returns (address);
}
// File: contracts\interfaces\IComptrollerLensInterface.sol
interface IComptrollerLensInterface {
function markets(address) external view returns (bool, uint);
function getAccountLiquidity(address) external view returns (uint, uint, uint);
function claimComp(address) external;
function compAccrued(address) external view returns (uint);
}
// File: contracts\deposits\DfFinanceDepositsMultiSig.sol
pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;
// **INTERFACES**
contract DfFinanceDepositsMultiSig is
Initializable,
DSMath,
ConstantAddresses,
FundsMgrUpgradable,
AdminableUpgradable,
FlashLoanReceiverBase,
MultiOwnable
{
using UniversalERC20 for IToken;
using SafeMath for uint256;
struct UserData {
address owner;
uint256 deposit; //
// uint256 targetAmount; // 6 decimals
uint64 compClaimed;
uint64 compClaimedinUSD; // 6 decimals
uint64 activeFeeScheme; // 0 - fee scheme is disabled
uint64 gap2;
}
// struct CompBalanceMetadataExt {
// uint balance;
// uint votes;
// address delegate;
// uint allocated;
// }
enum OP {
UNKNOWN,
OPEN,
CLOSE,
PARTIALLYCLOSE
}
IDfWalletFactory public dfWalletFactory;
uint256 public fee;
address public rewardWallet;
address public usdtExchanger;
mapping(address => UserData) public wallets;
OP private state;
event DfOpenDeposit(address indexed dfWallet, uint256 amount);
event DfAddDeposit(address indexed dfWallet, uint256 amount);
event DfCloseDeposit(
address indexed dfWallet, address indexed tokenReceiver, uint256 amountDAI, uint256 tokensSent
);
event CompSwap(uint256 timestamp, uint256 compPrice);
modifier balanceCheck {
uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));
_;
require(IToken(DAI_ADDRESS).balanceOf(address(this)) >= startBalance);
}
// ** INITIALIZER – Constructor for Upgradable contracts **
function initialize() public initializer {
AdminableUpgradable.initialize(); // Initialize Parent Contract
MultiOwnable.initialize(); // Initialize Parent Contract
// FundsMgrUpgradable.initialize(); // Init in AdminableUpgradable
// dfWalletFactory = IDfWalletFactory(0x0b7B605F6e5715933EF83505F1db9F2Df3C52FF4);
}
// ** PUBLIC VIEW functions **
// function isClosed(address addrWallet) public view returns(bool) {
// return wallets[addrWallet].deposit == 0 && wallets[addrWallet].owner != address(0x0);
// }
function getCompBalanceMetadataExt(address account) public returns (uint256 balance, uint256 allocated) {
IComptrollerLensInterface comptroller = IComptrollerLensInterface(COMPTROLLER);
IToken comp = IToken(COMP_ADDRESS);
balance = comp.balanceOf(account);
comptroller.claimComp(account);
uint256 newBalance = comp.balanceOf(account);
uint256 accrued = comptroller.compAccrued(account);
uint256 total = add(accrued, newBalance);
allocated = sub(total, balance);
}
// ** CREATE DEPOSIT PUBLIC functions **
// function createStrategyDepositMulti(uint256 amountDAI, uint256 flashLoanAmount, uint32 times) balanceCheck public {
// address dfWallet = createStrategyDeposit(amountDAI, flashLoanAmount, address(0x0));
// for(uint32 t = 0; t < times;t++) {
// createStrategyDeposit(amountDAI, flashLoanAmount, dfWallet);
// }
// }
function createStrategyDepositUsingAave(uint256 amountDAI, uint256 flashLoanAmount, address dfWallet) public returns (address) {
if (dfWallet == address(0x0)) {
dfWallet = dfWalletFactory.createDfWallet();
IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
wallets[dfWallet] = UserData(msg.sender, amountDAI, 0, 0, 0, 0);
emit DfOpenDeposit(dfWallet, amountDAI);
} else {
require(wallets[dfWallet].owner == msg.sender);
wallets[dfWallet].deposit = add(wallets[dfWallet].deposit, amountDAI);
emit DfAddDeposit(dfWallet, amountDAI);
}
// Transfer tokens to wallet
IToken(DAI_ADDRESS).universalTransferFrom(msg.sender, dfWallet, amountDAI);
ILendingPool lendingPool = ILendingPool(ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPool());
state = OP.OPEN;
lendingPool.flashLoan(address(this), DAI_ADDRESS, flashLoanAmount, abi.encodePacked(dfWallet, amountDAI));
state = OP.UNKNOWN;
return dfWallet;
}
function createStrategyDeposit(uint256 amountDAI, uint256 flashLoanAmount, address dfWallet) public balanceCheck returns (address) {
if (dfWallet == address(0x0)) {
dfWallet = dfWalletFactory.createDfWallet();
IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
wallets[dfWallet] = UserData(msg.sender, amountDAI, 0, 0, 0, 0);
emit DfOpenDeposit(dfWallet, amountDAI);
} else {
require(wallets[dfWallet].owner == msg.sender);
wallets[dfWallet].deposit = add(wallets[dfWallet].deposit, amountDAI);
emit DfAddDeposit(dfWallet, amountDAI);
}
// Transfer tokens to wallet
IToken(DAI_ADDRESS).universalTransferFrom(msg.sender, address(this), amountDAI);
uint256 totalFunds = flashLoanAmount + amountDAI;
IToken(DAI_ADDRESS).transfer(dfWallet, totalFunds);
IDfWallet(dfWallet).deposit(DAI_ADDRESS, CDAI_ADDRESS, totalFunds, DAI_ADDRESS, CDAI_ADDRESS, flashLoanAmount);
IDfWallet(dfWallet).withdrawToken(DAI_ADDRESS, address(this), flashLoanAmount);
return dfWallet;
}
// ** ONLY_MULTI_OWNERS functions **
function setRewardWallet(address _rewardWallet) public onlyMultiOwners {
require(_rewardWallet != address(0), "Address must not be zero");
rewardWallet = _rewardWallet;
}
function closeDepositDAIUsingAave(address dfWallet, address tokenReceiver, uint256 amountDAI, uint256 minAmountDAI) public onlyMultiOwners {
require(tokenReceiver != address(0x0));
uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));
ILendingPool lendingPool = ILendingPool(ILendingPoolAddressesProvider(AAVE_ADDRESSES_PROVIDER).getLendingPool());
uint256 flashLoanAmount;
if (amountDAI == uint(-1)) {
flashLoanAmount = ICToken(CDAI_ADDRESS).borrowBalanceCurrent(dfWallet);
state = OP.CLOSE;
} else {
flashLoanAmount = amountDAI.mul(3);
state = OP.PARTIALLYCLOSE;
}
lendingPool.flashLoan(address(this), DAI_ADDRESS, flashLoanAmount, abi.encodePacked(dfWallet));
state = OP.UNKNOWN;
uint256 tokensSent = sub(IToken(DAI_ADDRESS).balanceOf(address(this)), startBalance);
require(tokensSent >= minAmountDAI);
IToken(DAI_ADDRESS).transfer(tokenReceiver, tokensSent); // tokensSent will be less then amountDAI because of flash loan
emit DfCloseDeposit(dfWallet, tokenReceiver, amountDAI, tokensSent);
}
function closeDepositDAI(address dfWallet, address tokenReceiver, uint256 amountDAI, uint256 minAmountDAI, uint256 useOwnBalance) public balanceCheck onlyMultiOwners {
require(tokenReceiver != address(0x0));
uint256 startBalance = IToken(DAI_ADDRESS).balanceOf(address(this));
if (useOwnBalance > 0) IToken(DAI_ADDRESS).transferFrom(msg.sender, address(this), useOwnBalance);
if (IToken(DAI_ADDRESS).allowance(address(this), dfWallet) != uint256(-1)) {
IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
}
if (amountDAI == uint(-1)) {
IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, uint(-1), DAI_ADDRESS, CDAI_ADDRESS, uint(-1));
} else {
uint256 flashLoanAmount = amountDAI.mul(3);
uint256 cDaiToExtract = flashLoanAmount.add(amountDAI).mul(1e18).div(ICToken(CDAI_ADDRESS).exchangeRateCurrent());
IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, cDaiToExtract, DAI_ADDRESS, CDAI_ADDRESS, flashLoanAmount);
}
if (useOwnBalance > 0) IToken(DAI_ADDRESS).transfer(msg.sender, useOwnBalance);
uint256 tokensSent = sub(IToken(DAI_ADDRESS).balanceOf(address(this)), startBalance);
require(tokensSent >= minAmountDAI);
IToken(DAI_ADDRESS).transfer(tokenReceiver, tokensSent); // tokensSent will be less then amountDAI because of fee
emit DfCloseDeposit(dfWallet, tokenReceiver, amountDAI, tokensSent);
}
// Universal call
function externalCallEth(address payable[] memory _to, bytes[] memory _data, uint256[] memory ethAmount) public onlyMultiOwners payable {
require(msg.sender == owner);
for(uint16 i = 0; i < _to.length; i++) {
_cast(_to[i], _data[i], ethAmount[i]);
}
}
// ** ONLY_OWNER_OR_ADMIN functions **
function setDfWalletFactory(address _dfWalletFactory) public onlyOwnerOrAdmin {
require(_dfWalletFactory != address(0));
dfWalletFactory = IDfWalletFactory(_dfWalletFactory);
}
function changeFee(uint256 _fee) public onlyMultiOwners {
require(msg.sender == owner);
require(_fee < 100);
fee = _fee;
}
function setUSDTExchangeAddress(address _newAddress) public onlyOwnerOrAdmin {
usdtExchanger = _newAddress;
}
function claimComps(
address dfWallet, uint256 minUsdForComp, uint256 compPriceInUsdt, bytes memory data
) public onlyOwnerOrAdmin returns(uint256) {
require(rewardWallet != address(0), "Address of rewardWallet must not be zero");
uint256 compTokenBalance = IToken(COMP_ADDRESS).balanceOf(address(this));
address[] memory cTokens = new address[](1);
cTokens[0] = CDAI_ADDRESS;
IDfWallet(dfWallet).claimComp(cTokens);
compTokenBalance = sub(IToken(COMP_ADDRESS).balanceOf(address(this)), compTokenBalance);
if(minUsdForComp > 0) {
uint256 usdtAmount = _exchange(IToken(COMP_ADDRESS), compTokenBalance, IToken(USDT_ADDRESS), minUsdForComp, data);
usdtAmount = _distFees(USDT_ADDRESS, usdtAmount, dfWallet);
IToken(USDT_ADDRESS).universalTransfer(rewardWallet, usdtAmount);
wallets[dfWallet].compClaimedinUSD += uint64(usdtAmount);
return usdtAmount;
} else if(compPriceInUsdt > 0) {
// Swap COMPs to USDT
uint256 usdtAmount = wmul(compTokenBalance, compPriceInUsdt) / 10**18; // COMP to USDT
IToken(USDT_ADDRESS).universalTransferFrom(usdtExchanger, address(this), usdtAmount);
IToken(COMP_ADDRESS).transfer(usdtExchanger, compTokenBalance);
emit CompSwap(block.timestamp, compPriceInUsdt);
// distribution fee
usdtAmount = _distFees(USDT_ADDRESS, usdtAmount, dfWallet);
IToken(USDT_ADDRESS).universalTransfer(rewardWallet, usdtAmount);
wallets[dfWallet].compClaimedinUSD += uint64(usdtAmount);
return usdtAmount;
} else {
compTokenBalance = _distFees(COMP_ADDRESS, compTokenBalance, dfWallet);
IToken(COMP_ADDRESS).transfer(rewardWallet, compTokenBalance);
wallets[dfWallet].compClaimed += uint64(compTokenBalance / 1e12); // 6 decemals
return compTokenBalance;
}
}
// ** AAVE CALLBACK function **
function executeOperation(
address _reserve,
uint256 _amountFlashLoan,
uint256 _fee,
bytes memory _data
)
public {
require(state != OP.UNKNOWN);
address dfWallet = _bytesToAddress(_data);
require(_amountFlashLoan <= getBalanceInternal(address(this), _reserve));
if (IToken(DAI_ADDRESS).allowance(address(this), dfWallet) != uint256(-1)) {
IToken(DAI_ADDRESS).approve(dfWallet, uint256(-1));
}
uint256 totalDebt = add(_amountFlashLoan, _fee);
if (state == OP.OPEN) {
uint256 deposit;
assembly {
deposit := mload(add(_data,52))
}
uint256 totalFunds = _amountFlashLoan + deposit;
IToken(DAI_ADDRESS).transfer(dfWallet, _amountFlashLoan);
IDfWallet(dfWallet).deposit(DAI_ADDRESS, CDAI_ADDRESS, totalFunds, DAI_ADDRESS, CDAI_ADDRESS, totalDebt);
IDfWallet(dfWallet).withdrawToken(DAI_ADDRESS, address(this), totalDebt); // TODO: remove it
} else if (state == OP.CLOSE) {
IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, uint256(-1), DAI_ADDRESS, CDAI_ADDRESS, uint256(-1));
} else if (state == OP.PARTIALLYCLOSE) {
// _amountFlashLoan.div(3) - user token requested
uint256 cDaiToExtract = _amountFlashLoan.add(_amountFlashLoan.div(3)).mul(1e18).div(ICToken(CDAI_ADDRESS).exchangeRateCurrent());
IDfWallet(dfWallet).withdraw(DAI_ADDRESS, CDAI_ADDRESS, cDaiToExtract, DAI_ADDRESS, CDAI_ADDRESS, _amountFlashLoan);
// require(_amountFlashLoan.div(3) >= sub(receivedAmount, _fee), "Fee greater then user amount"); // user pay fee for flash loan
}
// Time to transfer the funds back
transferFundsBackToPoolInternal(_reserve, totalDebt);
}
// ** PRIVATE & INTERNAL functions **
function _bytesToAddress(bytes memory bys) private pure returns (address addr) {
assembly {
addr := mload(add(bys,20))
}
}
function _cast(address payable _to, bytes memory _data, uint256 ethAmount) internal {
bytes32 response;
assembly {
let succeeded := call(sub(gas, 5000), _to, ethAmount, add(_data, 0x20), mload(_data), 0, 32)
response := mload(0)
switch iszero(succeeded)
case 1 {
revert(0, 0)
}
}
}
// return new reward balance
function _distFees(address _token, uint256 _reward, address _dfWallet) internal returns (uint256) {
uint256 feeReward;
// global fee scheme
feeReward = uint256(fee) * _reward / 100;
if (feeReward > 0) {
IToken(_token).universalTransfer(owner, feeReward);
}
return sub(_reward, feeReward);
}
function _exchange(
IToken _fromToken, uint _maxFromTokenAmount, IToken _toToken, uint _minToTokenAmount, bytes memory _data
) internal returns(uint) {
IOneInchExchange ex = IOneInchExchange(0x11111254369792b2Ca5d084aB5eEA397cA8fa48B); // TODO: set state var
if (_fromToken.allowance(address(this), address(ex.spender())) != uint256(-1)) {
_fromToken.approve(address(ex.spender()), uint256(-1));
}
uint fromTokenBalance = _fromToken.universalBalanceOf(address(this));
uint toTokenBalance = _toToken.universalBalanceOf(address(this));
// Proxy call for avoid out of gas in fallback (because of .transfer())
// proxyEx.exchange(_fromToken, _maxFromTokenAmount, _data);
bytes32 response;
assembly {
// call(g, a, v, in, insize, out, outsize)
let succeeded := call(sub(gas, 5000), ex, 0, add(_data, 0x20), mload(_data), 0, 32)
response := mload(0) // load delegatecall output
}
require(_fromToken.universalBalanceOf(address(this)) + _maxFromTokenAmount >= fromTokenBalance, "Exchange error 1");
uint256 newBalanceToToken = _toToken.universalBalanceOf(address(this));
require(newBalanceToToken >= toTokenBalance + _minToTokenAmount, "Exchange error 2");
return sub(newBalanceToToken, toTokenBalance); // how many tokens received
}
// ** FALLBACK function **
function() external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"compPrice","type":"uint256"}],"name":"CompSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DfAddDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":true,"internalType":"address","name":"tokenReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountDAI","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensSent","type":"uint256"}],"name":"DfCloseDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dfWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DfOpenDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"VoteForCalldata","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"AAVE_ADDRESSES_PROVIDER","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CDAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMPTROLLER","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"COMP_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_VOTES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_newOwners","type":"address[]"}],"name":"addOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"uint256","name":"minUsdForComp","type":"uint256"},{"internalType":"uint256","name":"compPriceInUsdt","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"claimComps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"address","name":"tokenReceiver","type":"address"},{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"minAmountDAI","type":"uint256"},{"internalType":"uint256","name":"useOwnBalance","type":"uint256"}],"name":"closeDepositDAI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"address","name":"tokenReceiver","type":"address"},{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"minAmountDAI","type":"uint256"}],"name":"closeDepositDAIUsingAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"flashLoanAmount","type":"uint256"},{"internalType":"address","name":"dfWallet","type":"address"}],"name":"createStrategyDeposit","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"flashLoanAmount","type":"uint256"},{"internalType":"address","name":"dfWallet","type":"address"}],"name":"createStrategyDepositUsingAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dfWalletFactory","outputs":[{"internalType":"contract IDfWalletFactory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_amountFlashLoan","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"executeOperation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable[]","name":"_to","type":"address[]"},{"internalType":"bytes[]","name":"_data","type":"bytes[]"},{"internalType":"uint256[]","name":"ethAmount","type":"uint256[]"}],"name":"externalCallEth","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCompBalanceMetadataExt","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"allocated","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_newOwners","type":"address[]"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"multiOwners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"multiOwnersCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_exOwner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_exOwners","type":"address[]"}],"name":"removeOwners","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdminPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_admins","type":"address[]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdminPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dfWalletFactory","type":"address"}],"name":"setDfWalletFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardWallet","type":"address"}],"name":"setRewardWallet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setUSDTExchangeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"usdtExchanger","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"votes","outputs":[{"internalType":"uint16","name":"votesCounter","type":"uint16"},{"internalType":"uint64","name":"curVote","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wallets","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint64","name":"compClaimed","type":"uint64"},{"internalType":"uint64","name":"compClaimedinUSD","type":"uint64"},{"internalType":"uint64","name":"activeFeeScheme","type":"uint64"},{"internalType":"uint64","name":"gap2","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615f6a80620000216000396000f3fe6080604052600436106102515760003560e01c80638129fc1c11610139578063c1892058116100b6578063eb21d9c41161007a578063eb21d9c4146106a0578063ebbc4965146106c0578063ee872558146106d5578063f3fef3a3146106f5578063fb75b2c714610715578063fc6019551461072a57610251565b8063c189205814610623578063c4d66de814610638578063cb9d122314610658578063ddca3f431461066b578063e9bca3241461068057610251565b80639f6a18cf116100fd5780639f6a18cf1461058e578063a224cee7146105ae578063a6f9dae1146105ce578063a9a5e3af146105ee578063b2b8b7dc1461060e57610251565b80638129fc1c146104f2578063899b8bcd1461050757806389b08f11146105275780638da5cb5b146105595780639aba1ce01461056e57610251565b80635958621e116101d25780636c46a2c5116101965780636c46a2c5146104325780636ddc6322146104525780636ded3d76146104725780637065cb481461049257806375f3974b146104b257806377deeef2146104d257610251565b80635958621e146103a85780635f82c67e146103c85780636568a279146103dd5780636a1db1bf146103fd5780636a51b63d1461041d57610251565b806324308b0a1161021957806324308b0a146103035780632a4c0a1a146103185780632a53ecf91461032d578063429b62e51461034d5780634d0415141461037a57610251565b80630531b2ad14610253578063067369461461027e57806311b2e10e146102a0578063173825d9146102b55780632072cdd1146102d5575b005b34801561025f57600080fd5b5061026861074c565b6040516102759190615afb565b60405180910390f35b34801561028a57600080fd5b50610293610764565b6040516102759190615d83565b3480156102ac57600080fd5b50610268610769565b3480156102c157600080fd5b506102516102d03660046153f9565b610781565b3480156102e157600080fd5b506102f56102f03660046156f9565b6109dc565b604051610275929190615d68565b34801561030f57600080fd5b50610268610a0e565b34801561032457600080fd5b50610268610a1d565b34801561033957600080fd5b50610251610348366004615496565b610a2f565b34801561035957600080fd5b5061036d6103683660046153f9565b6113ef565b6040516102759190615ccb565b34801561038657600080fd5b5061039a6103953660046153f9565b611404565b604051610275929190615d91565b3480156103b457600080fd5b506102516103c33660046153f9565b61162e565b3480156103d457600080fd5b50610268611889565b3480156103e957600080fd5b506102516103f83660046155e1565b6118a1565b34801561040957600080fd5b5061025161041836600461572d565b611912565b34801561042957600080fd5b50610293611b57565b34801561043e57600080fd5b5061025161044d3660046155e1565b611b5d565b34801561045e57600080fd5b5061026861046d366004615769565b611db3565b34801561047e57600080fd5b5061026861048d366004615769565b6121e0565b34801561049e57600080fd5b506102516104ad3660046153f9565b61276c565b3480156104be57600080fd5b506102516104cd36600461550b565b61298a565b3480156104de57600080fd5b506102516104ed366004615435565b6129cc565b3480156104fe57600080fd5b50610251613013565b34801561051357600080fd5b506102516105223660046153f9565b613093565b34801561053357600080fd5b506105476105423660046153f9565b61310c565b60405161027596959493929190615c6b565b34801561056557600080fd5b5061026861315f565b34801561057a57600080fd5b506102516105893660046153f9565b61316e565b34801561059a57600080fd5b506102936105a9366004615575565b6131d4565b3480156105ba57600080fd5b506102516105c93660046155e1565b6136f6565b3480156105da57600080fd5b506102516105e93660046153f9565b613798565b3480156105fa57600080fd5b506102516106093660046155e1565b6137d1565b34801561061a57600080fd5b50610268613a21565b34801561062f57600080fd5b50610268613a39565b34801561064457600080fd5b506102516106533660046153f9565b613a51565b61025161066636600461564a565b613aca565b34801561067757600080fd5b50610293613d97565b34801561068c57600080fd5b5061036d61069b3660046153f9565b613d9d565b3480156106ac57600080fd5b506102516106bb366004615615565b613db2565b3480156106cc57600080fd5b50610251613e25565b3480156106e157600080fd5b506102516106f0366004615575565b613e60565b34801561070157600080fd5b50610251610710366004615545565b6143a3565b34801561072157600080fd5b50610268614422565b34801561073657600080fd5b5061073f614431565b6040516102759190615cd9565b735d3a536e4d6dbd6114cc1ead35777bab948e364381565b600281565b7324a42fd28c976a61df5d00d0599c34c4f90748c881565b33600090815260cd602052604090205460ff166107b95760405162461bcd60e51b81526004016107b090615d18565b60405180910390fd5b600060cc6000366040516107ce929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610801906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166108b457600160cc600036604051610846929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161088e91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516108c9929190615ad7565b9081526040519081900360200190205461ffff16101580610912575060ce5460cc6000366040516108fb929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161092c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610963906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614440565b6109d8565b600080516020615f08833981519152336000366040516109cf93929190615b9e565b60405180910390a15b5050565b805160208183018101805160cc8252928201919093012091525461ffff8116906201000090046001600160401b031682565b60d2546001600160a01b031681565b600080516020615ee883398151915281565b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610a63903090600401615b09565b60206040518083038186803b158015610a7b57600080fd5b505afa158015610a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab3919081019061574b565b33600090815260cd602052604090205490915060ff16610ae55760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051610afa929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610b2d906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16610be057600160cc600036604051610b72929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91610bba91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051610bf5929190615ad7565b9081526040519081900360200190205461ffff16101580610c3e575060ce5460cc600036604051610c27929190615ad7565b9081526040519081900360200190205461ffff1610155b1561132d57600060cc600036604051610c58929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610c8f906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038616610cde57600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610d12903090600401615b09565b60206040518083038186803b158015610d2a57600080fd5b505afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d62919081019061574b565b90508315610df3576040516323b872dd60e01b8152600080516020615ee8833981519152906323b872dd90610d9f90339030908990600401615b32565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df191908101906156db565b505b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90610e2a9030908d90600401615b17565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7a919081019061574b565b14610ee75760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390610eb4908b9060001990600401615c5d565b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050505b600019861415610fa357604051630d6b883f60e21b81526001600160a01b038916906335ae20fc90610f4b90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f9d919081019061574b565b50611129565b6000610fb687600363ffffffff61449f16565b90506000611078735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611044919081019061574b565b61106c670de0b6b3a7640000611060868d63ffffffff6144cf16565b9063ffffffff61449f16565b9063ffffffff6144e116565b604051630d6b883f60e21b81529091506001600160a01b038b16906335ae20fc906110d390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908a90600401615c03565b602060405180830381600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611125919081019061574b565b5050505b83156111b65760405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb906111629033908890600401615bbf565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906156db565b505b6040516370a0823160e01b815260009061124490600080516020615ee8833981519152906370a08231906111ee903090600401615b09565b60206040518083038186803b15801561120657600080fd5b505afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061123e919081019061574b565b83614523565b90508581101561125357600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90611286908b908590600401615c5d565b602060405180830381600087803b1580156112a057600080fd5b505af11580156112b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112d891908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f905524908898460405161131e929190615d91565b60405180910390a35050611358565b600080516020615f088339815191523360003660405161134f93929190615b9e565b60405180910390a15b506040516370a0823160e01b81528190600080516020615ee8833981519152906370a082319061138c903090600401615b09565b60206040518083038186803b1580156113a457600080fd5b505afa1580156113b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113dc919081019061574b565b10156113e757600080fd5b505050505050565b60996020526000908152604090205460ff1681565b6040516370a0823160e01b81526000908190733d9819210a31b4961b30ef54be2aed79b9c9cd3b9073c00e94cb662c3520282e6f5717214004a7f268889081906370a0823190611458908890600401615afb565b60206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114a8919081019061574b565b6040516374d7814960e11b81529094506001600160a01b0383169063e9af0292906114d7908890600401615afb565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03841691506370a0823190611538908990600401615afb565b60206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611588919081019061574b565b90506000836001600160a01b031663cc7ebdc4886040518263ffffffff1660e01b81526004016115b89190615afb565b60206040518083038186803b1580156115d057600080fd5b505afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611608919081019061574b565b905060006116168284614533565b90506116228188614523565b95505050505050915091565b33600090815260cd602052604090205460ff1661165d5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611672929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906116a5906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661175857600160cc6000366040516116ea929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161173291903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc60003660405161176d929190615ad7565b9081526040519081900360200190205461ffff161015806117b6575060ce5460cc60003660405161179f929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc6000366040516117d0929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611807906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b0382166118695760405162461bcd60e51b81526004016107b090615d58565b60d180546001600160a01b0319166001600160a01b0384161790556109d8565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6033546001600160a01b031633146118b857600080fd5b60005b81518110156109d85761190a8282815181106118d357fe5b6020026020010151610710308585815181106118eb57fe5b60200260200101516001600160a01b031661454390919063ffffffff16565b6001016118bb565b33600090815260cd602052604090205460ff166119415760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611956929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611989906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611a3c57600160cc6000366040516119ce929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611a1691903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611a51929190615ad7565b9081526040519081900360200190205461ffff16101580611a9a575060ce5460cc600036604051611a83929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611ab4929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611aeb906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614611b4057600080fd5b60648210611b4d57600080fd5b60d08290556109d8565b60ce5481565b33600090815260cd602052604090205460ff16611b8c5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611ba1929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611bd4906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611c8757600160cc600036604051611c19929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611c6191903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611c9c929190615ad7565b9081526040519081900360200190205461ffff16101580611ce5575060ce5460cc600036604051611cce929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611cff929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611d36906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790558151611d7d57600080fd5b60005b8251811015611dad57611da5838281518110611d9857fe5b6020026020010151614610565b600101611d80565b506109d8565b60006001600160a01b038216611fd65760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e4b9190810190615417565b60405163095ea7b360e01b8152909250600080516020615ee88339815191529063095ea7b390611e8390859060001990600401615c5d565b600060405180830381600087803b158015611e9d57600080fd5b505af1158015611eb1573d6000803e3d6000fd5b50506040805160c08101825233815260208082018981526000838501818152606085018281526080860183815260a087018481526001600160a01b038d811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a9674349150611fc9908790615d83565b60405180910390a261207b565b6001600160a01b03828116600090815260d36020526040902054163314611ffc57600080fd5b6001600160a01b038216600090815260d360205260409020600101546120229085614533565b6001600160a01b038316600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612072908790615d83565b60405180910390a25b61209b600080516020615ee883398151915233848763ffffffff61466616565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ea57600080fd5b505afa1580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121229190810190615417565b60d4805491925060019160ff191682800217905550806001600160a01b0316635cffe9de30600080516020615ee883398151915287878a60405160200161216a929190615ab1565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016121989493929190615b5a565b600060405180830381600087803b1580156121b257600080fd5b505af11580156121c6573d6000803e3d6000fd5b505060d4805460ff191690555083925050505b9392505050565b6040516370a0823160e01b81526000908190600080516020615ee8833981519152906370a0823190612216903090600401615b09565b60206040518083038186803b15801561222e57600080fd5b505afa158015612242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612266919081019061574b565b90506001600160a01b0383166124895760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fe9190810190615417565b60405163095ea7b360e01b8152909350600080516020615ee88339815191529063095ea7b39061233690869060001990600401615c5d565b600060405180830381600087803b15801561235057600080fd5b505af1158015612364573d6000803e3d6000fd5b50506040805160c08101825233815260208082018a81526000838501818152606085018281526080860183815260a087018481526001600160a01b038e811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a967434915061247c908890615d83565b60405180910390a261252e565b6001600160a01b03838116600090815260d360205260409020541633146124af57600080fd5b6001600160a01b038316600090815260d360205260409020600101546124d59086614533565b6001600160a01b038416600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612525908890615d83565b60405180910390a25b61254e600080516020615ee883398151915233308863ffffffff61466616565b60405163a9059cbb60e01b815284860190600080516020615ee88339815191529063a9059cbb906125859087908590600401615c5d565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125d791908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a599061263090600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908d90600401615c03565b600060405180830381600087803b15801561264a57600080fd5b505af115801561265e573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e3366791506126a090600080516020615ee88339815191529030908a90600401615bda565b600060405180830381600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b50505050839250506040516370a0823160e01b81528190600080516020615ee8833981519152906370a0823190612709903090600401615b09565b60206040518083038186803b15801561272157600080fd5b505afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612759919081019061574b565b101561276457600080fd5b509392505050565b33600090815260cd602052604090205460ff1661279b5760405162461bcd60e51b81526004016107b090615d18565b600060cc6000366040516127b0929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906127e3906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661289657600160cc600036604051612828929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161287091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516128ab929190615ad7565b9081526040519081900360200190205461ffff161015806128f4575060ce5460cc6000366040516128dd929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161290e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612945906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614610565b6033546001600160a01b031633146129a157600080fd5b6001600160a01b03919091166000908152609960205260409020805460ff1916911515919091179055565b33600090815260cd602052604090205460ff166129fb5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051612a10929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90612a43906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16612af657600160cc600036604051612a88929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91612ad091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051612b0b929190615ad7565b9081526040519081900360200190205461ffff16101580612b54575060ce5460cc600036604051612b3d929190615ad7565b9081526040519081900360200190205461ffff1610155b15612fe157600060cc600036604051612b6e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612ba5906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038416612bf457600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190612c28903090600401615b09565b60206040518083038186803b158015612c4057600080fd5b505afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c78919081019061574b565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cc957600080fd5b505afa158015612cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d019190810190615417565b90506000600019861415612dac576040516305eff7ef60e21b8152735d3a536e4d6dbd6114cc1ead35777bab948e3643906317bfdfbc90612d46908b90600401615afb565b602060405180830381600087803b158015612d6057600080fd5b505af1158015612d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d98919081019061574b565b60d4805460ff191660021790559050612dcd565b612dbd86600363ffffffff61449f16565b60d4805460ff1916600317905590505b816001600160a01b0316635cffe9de30600080516020615ee8833981519152848c604051602001612dfe9190615a9c565b6040516020818303038152906040526040518563ffffffff1660e01b8152600401612e2c9493929190615b5a565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505060d4805460ff1916905550506040516370a0823160e01b8152600090612ef690600080516020615ee8833981519152906370a0823190612ea0903090600401615b09565b60206040518083038186803b158015612eb857600080fd5b505afa158015612ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ef0919081019061574b565b85614523565b905085811015612f0557600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90612f38908b908590600401615c5d565b602060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f8a91908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f9055249088984604051612fd0929190615d91565b60405180910390a35050505061300c565b600080516020615f088339815191523360003660405161300393929190615b9e565b60405180910390a15b5050505050565b600054610100900460ff168061302c575061302c614787565b8061303a575060005460ff16155b61304357600080fd5b600054610100900460ff1615801561306e576000805460ff1961ff0019909116610100171660011790555b61307661478d565b61307e6147f0565b8015613090576000805461ff00191690555b50565b6033546001600160a01b03163314806130bb57503360009081526099602052604090205460ff165b6130d75760405162461bcd60e51b81526004016107b090615d18565b6001600160a01b0381166130ea57600080fd5b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b60d3602052600090815260409020805460018201546002909201546001600160a01b0390911691906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041686565b6033546001600160a01b031681565b6033546001600160a01b031633148061319657503360009081526099602052604090205460ff165b6131b25760405162461bcd60e51b81526004016107b090615d18565b60d280546001600160a01b0319166001600160a01b0392909216919091179055565b6033546000906001600160a01b03163314806131ff57503360009081526099602052604090205460ff165b61321b5760405162461bcd60e51b81526004016107b090615d18565b60d1546001600160a01b03166132435760405162461bcd60e51b81526004016107b090615d28565b6040516370a0823160e01b815260009073c00e94cb662c3520282e6f5717214004a7f26888906370a082319061327d903090600401615b09565b60206040518083038186803b15801561329557600080fd5b505afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132cd919081019061574b565b6040805160018082528183019092529192506060919060208083019080388339019050509050735d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061331557fe5b6001600160a01b03928316602091820292909201015260405163dd0c4d3f60e01b81529088169063dd0c4d3f90613350908490600401615cba565b600060405180830381600087803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b50506040516370a0823160e01b81526133bd925073c00e94cb662c3520282e6f5717214004a7f2688891506370a08231906111ee903090600401615b09565b915085156134a45760006133fc73c00e94cb662c3520282e6f5717214004a7f268888473dac17f958d2ee523a2206206994597c13d831ec78a89614854565b905061341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b60d1549091506134529073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03168363ffffffff614b6a16565b6001600160a01b038816600090815260d36020526040902060020180546001600160401b03600160401b808304821685019091160267ffffffffffffffff60401b1990911617905592506136ee915050565b84156135ed576000670de0b6b3a76400006134bf8488614b77565b816134c657fe5b60d25491900491506134fe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316308463ffffffff61466616565b60d25460405163a9059cbb60e01b815273c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613542916001600160a01b0316908790600401615c5d565b602060405180830381600087803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061359491908101906156db565b507f855da74d86689b845f6f0732c84e952fc55fcc5b81e077c74696aa606fb99d5242876040516135c6929190615d91565b60405180910390a161341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b61360c73c00e94cb662c3520282e6f5717214004a7f268888389614b1d565b60d15460405163a9059cbb60e01b815291935073c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613655916001600160a01b03909116908690600401615c5d565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136a791908101906156db565b50506001600160a01b038616600090815260d36020526040902060020180546001600160401b0380821664e8d4a510008504011667ffffffffffffffff1990911617905590505b949350505050565b600054610100900460ff168061370f575061370f614787565b8061371d575060005460ff16155b61372657600080fd5b600054610100900460ff16158015613751576000805460ff1961ff0019909116610100171660011790555b600082511161375f57600080fd5b60005b82518110156137825761377a838281518110611d9857fe5b600101613762565b5080156109d8576000805461ff00191690555050565b6033546001600160a01b031633146137af57600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b33600090815260cd602052604090205460ff166138005760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613815929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613848906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166138fb57600160cc60003660405161388d929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc916138d591903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613910929190615ad7565b9081526040519081900360200190205461ffff16101580613959575060ce5460cc600036604051613942929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051613973929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc906139aa906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff00001990911617905581516139f157600080fd5b60005b8251811015611dad57613a19838281518110613a0c57fe5b6020026020010151614440565b6001016139f4565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73dac17f958d2ee523a2206206994597c13d831ec781565b600054610100900460ff1680613a6a5750613a6a614787565b80613a78575060005460ff16155b613a8157600080fd5b600054610100900460ff16158015613aac576000805460ff1961ff0019909116610100171660011790555b613ab582614bac565b80156109d8576000805461ff00191690555050565b33600090815260cd602052604090205460ff16613af95760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613b0e929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613b41906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16613bf457600160cc600036604051613b86929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91613bce91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613c09929190615ad7565b9081526040519081900360200190205461ffff16101580613c52575060ce5460cc600036604051613c3b929190615ad7565b9081526040519081900360200190205461ffff1610155b15613d6657600060cc600036604051613c6c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90613ca3906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614613cf857600080fd5b60005b84518161ffff161015613d6057613d58858261ffff1681518110613d1b57fe5b6020026020010151858361ffff1681518110613d3357fe5b6020026020010151858461ffff1681518110613d4b57fe5b6020026020010151614c37565b600101613cfb565b50613d91565b600080516020615f0883398151915233600036604051613d8893929190615b9e565b60405180910390a15b50505050565b60d05481565b60cd6020526000908152604090205460ff1681565b6033546001600160a01b03163314613dc957600080fd5b60005b8251811015613e20578160996000858481518110613de657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101613dcc565b505050565b6034546001600160a01b03163314613e3c57600080fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b600060d45460ff166003811115613e7357fe5b1415613e7e57600080fd5b6000613e8982614c64565b9050613e953086614c6b565b841115613ea157600080fd5b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90613ed89030908690600401615b17565b60206040518083038186803b158015613ef057600080fd5b505afa158015613f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f28919081019061574b565b14613f955760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390613f6290849060001990600401615c5d565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b6000613fa18585614533565b9050600160d45460ff166003811115613fb657fe5b141561414c57603483015160405163a9059cbb60e01b815286820190600080516020615ee88339815191529063a9059cbb90613ff89087908b90600401615c5d565b602060405180830381600087803b15801561401257600080fd5b505af1158015614026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061404a91908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a59906140a390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908b90600401615c03565b600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e33667915061411390600080516020615ee88339815191529030908890600401615bda565b600060405180830381600087803b15801561412d57600080fd5b505af1158015614141573d6000803e3d6000fd5b505050505050614399565b600260d45460ff16600381111561415f57fe5b141561421757604051630d6b883f60e21b81526001600160a01b038316906335ae20fc906141bf90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b1580156141d957600080fd5b505af11580156141ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614211919081019061574b565b50614399565b600360d45460ff16600381111561422a57fe5b14156143995760006142e9735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142bc919081019061574b565b61106c670de0b6b3a76400006110606142dc8b600363ffffffff6144e116565b8b9063ffffffff6144cf16565b604051630d6b883f60e21b81529091506001600160a01b038416906335ae20fc9061434490600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908e90600401615c03565b602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614396919081019061574b565b50505b6113e78682614d1b565b6033546001600160a01b031633146143ba57600080fd5b6001600160a01b038216614402576033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611dad573d6000803e3d6000fd5b6033546109d8906001600160a01b0384811691168363ffffffff614b6a16565b60d1546001600160a01b031681565b60cf546001600160a01b031681565b6001600160a01b038116600090815260cd602052604090205460ff1661446557600080fd5b600160ce541161447457600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916905560ce8054600019019055565b6000826144ae575060006144c9565b828202828482816144bb57fe5b04146144c657600080fd5b90505b92915050565b6000828201838110156144c657600080fd5b60006144c683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614daf565b808203828111156144c957600080fd5b808201828110156144c957600080fd5b60006001600160a01b038316158061457757506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561458d57506001600160a01b038116316144c9565b6040516370a0823160e01b81526001600160a01b038416906370a08231906145b9908590600401615afb565b60206040518083038186803b1580156145d157600080fd5b505afa1580156145e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614609919081019061574b565b90506144c9565b6001600160a01b038116600090815260cd602052604090205460ff161561463657600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916600190811790915560ce80549091019055565b8061467057613d91565b6001600160a01b03841615806146a257506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561476c576001600160a01b038316331480156146bf5750803410155b6146db5760405162461bcd60e51b81526004016107b090615cf8565b6001600160a01b0382163014614723576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614721573d6000803e3d6000fd5b505b8034111561476757336108fc61473f348463ffffffff614de616565b6040518115909202916000818181858888f19350505050158015613d60573d6000803e3d6000fd5b613d91565b613d916001600160a01b03851684848463ffffffff614df216565b303b1590565b600054610100900460ff16806147a657506147a6614787565b806147b4575060005460ff16155b6147bd57600080fd5b600054610100900460ff161580156147e8576000805460ff1961ff0019909116610100171660011790555b61307e614e4d565b600054610100900460ff16806148095750614809614787565b80614817575060005460ff16155b61482057600080fd5b600054610100900460ff1615801561484b576000805460ff1961ff0019909116610100171660011790555b61307e33614610565b6000807311111254369792b2ca5d084ab5eea397ca8fa48b9050600019876001600160a01b031663dd62ed3e30846001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156148ba57600080fd5b505afa1580156148ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506148f29190810190615417565b6040518363ffffffff1660e01b815260040161490f929190615b17565b60206040518083038186803b15801561492757600080fd5b505afa15801561493b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061495f919081019061574b565b14614a3757866001600160a01b031663095ea7b3826001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156149ac57600080fd5b505afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506149e49190810190615417565b6000196040518363ffffffff1660e01b8152600401614a04929190615c5d565b600060405180830381600087803b158015614a1e57600080fd5b505af1158015614a32573d6000803e3d6000fd5b505050505b6000614a526001600160a01b0389163063ffffffff61454316565b90506000614a6f6001600160a01b0388163063ffffffff61454316565b90506000602060008751602089016000886113885a03f150506000518289614aa66001600160a01b038d163063ffffffff61454316565b011015614ac55760405162461bcd60e51b81526004016107b090615d08565b6000614ae06001600160a01b038a163063ffffffff61454316565b9050878301811015614b045760405162461bcd60e51b81526004016107b090615d48565b614b0e8184614523565b9b9a5050505050505050505050565b60008060648460d0540281614b2e57fe5b0490508015614b5757603354614b57906001600160a01b0387811691168363ffffffff614b6a16565b614b618482614523565b95945050505050565b613d918383836000614ece565b6000670de0b6b3a7640000614b9d614b8f8585614fa8565b6706f05b59d3b20000614533565b81614ba457fe5b049392505050565b600054610100900460ff1680614bc55750614bc5614787565b80614bd3575060005460ff16155b614bdc57600080fd5b600054610100900460ff16158015614c07576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156109d8576000805461ff00191690555050565b60006020600084516020860185886113885a03f16000519150801560018114614c5f576113e7565b600080fd5b6014015190565b6000614c75614fcc565b6001600160a01b0316826001600160a01b03161415614c9f57506001600160a01b038216316144c9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190614ccb908690600401615afb565b60206040518083038186803b158015614ce357600080fd5b505afa158015614cf7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144c6919081019061574b565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d6a57600080fd5b505afa158015614d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614da29190810190615417565b9050613e20818484614fe4565b60008183614dd05760405162461bcd60e51b81526004016107b09190615ce7565b506000838581614ddc57fe5b0495945050505050565b60006144c68383614de6565b604051613d919085906323b872dd60e01b90614e1690879087908790602401615be8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526150a7565b600054610100900460ff1680614e665750614e66614787565b80614e74575060005460ff16155b614e7d57600080fd5b600054610100900460ff16158015614ea8576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b031916331790558015613090576000805461ff001916905550565b600082614edd575060016136ee565b6001600160a01b0385161580614f0f57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15614f86578115614f46576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506136ee565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015614f7c573d6000803e3d6000fd5b50600190506136ee565b614fa06001600160a01b038616858563ffffffff61515316565b5060016136ee565b6000811580614fc357505080820282828281614fc057fe5b04145b6144c957600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b614fec614fcc565b6001600160a01b0316826001600160a01b0316141561508d5760008390506000816001600160a01b03168360405161502390615af0565b60006040518083038185875af1925050503d8060008114615060576040519150601f19603f3d011682016040523d82523d6000602084013e615065565b606091505b50509050806150865760405162461bcd60e51b81526004016107b090615d38565b5050613e20565b613e206001600160a01b038316848363ffffffff61515316565b6150b9826001600160a01b0316615175565b6150c257600080fd5b60006060836001600160a01b0316836040516150de9190615ae4565b6000604051808303816000865af19150503d806000811461511b576040519150601f19603f3d011682016040523d82523d6000602084013e615120565b606091505b50915091508161512f57600080fd5b805115613d91578080602001905161514a91908101906156db565b613d9157600080fd5b604051613e2090849063a9059cbb60e01b90614e169086908690602401615c5d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136ee5750141592915050565b80356144c981615ec1565b80516144c981615ec1565b600082601f8301126151d357600080fd5b81356151e66151e182615dc5565b615d9f565b9150818183526020840193506020810190508385602084028201111561520b57600080fd5b60005b83811015615237578161522188826151ac565b845250602092830192919091019060010161520e565b5050505092915050565b600082601f83011261525257600080fd5b81356152606151e182615dc5565b9150818183526020840193506020810190508385602084028201111561528557600080fd5b60005b83811015615237578161529b88826151ac565b8452506020928301929190910190600101615288565b600082601f8301126152c257600080fd5b81356152d06151e182615dc5565b81815260209384019390925082018360005b8381101561523757813586016152f88882615394565b84525060209283019291909101906001016152e2565b600082601f83011261531f57600080fd5b813561532d6151e182615dc5565b9150818183526020840193506020810190508385602084028201111561535257600080fd5b60005b83811015615237578161536888826153e3565b8452506020928301929190910190600101615355565b80356144c981615ed5565b80516144c981615ed5565b600082601f8301126153a557600080fd5b81356153b36151e182615de5565b915080825260208301602083018583830111156153cf57600080fd5b6153da838284615e68565b50505092915050565b80356144c981615ede565b80516144c981615ede565b60006020828403121561540b57600080fd5b60006136ee84846151ac565b60006020828403121561542957600080fd5b60006136ee84846151b7565b6000806000806080858703121561544b57600080fd5b600061545787876151ac565b9450506020615468878288016151ac565b9350506040615479878288016153e3565b925050606061548a878288016153e3565b91505092959194509250565b600080600080600060a086880312156154ae57600080fd5b60006154ba88886151ac565b95505060206154cb888289016151ac565b94505060406154dc888289016153e3565b93505060606154ed888289016153e3565b92505060806154fe888289016153e3565b9150509295509295909350565b6000806040838503121561551e57600080fd5b600061552a85856151ac565b925050602061553b8582860161537e565b9150509250929050565b6000806040838503121561555857600080fd5b600061556485856151ac565b925050602061553b858286016153e3565b6000806000806080858703121561558b57600080fd5b600061559787876151ac565b94505060206155a8878288016153e3565b93505060406155b9878288016153e3565b92505060608501356001600160401b038111156155d557600080fd5b61548a87828801615394565b6000602082840312156155f357600080fd5b81356001600160401b0381111561560957600080fd5b6136ee848285016151c2565b6000806040838503121561562857600080fd5b82356001600160401b0381111561563e57600080fd5b61552a858286016151c2565b60008060006060848603121561565f57600080fd5b83356001600160401b0381111561567557600080fd5b61568186828701615241565b93505060208401356001600160401b0381111561569d57600080fd5b6156a9868287016152b1565b92505060408401356001600160401b038111156156c557600080fd5b6156d18682870161530e565b9150509250925092565b6000602082840312156156ed57600080fd5b60006136ee8484615389565b60006020828403121561570b57600080fd5b81356001600160401b0381111561572157600080fd5b6136ee84828501615394565b60006020828403121561573f57600080fd5b60006136ee84846153e3565b60006020828403121561575d57600080fd5b60006136ee84846153ee565b60008060006060848603121561577e57600080fd5b600061578a86866153e3565b935050602061579b868287016153e3565b92505060406156d1868287016151ac565b60006157b883836157cf565b505060200190565b6157c981615e56565b82525050565b6157c981615e24565b6157c96157e482615e24565b615ea0565b60006157f482615e12565b6157fe8185615e16565b935061580983615e0c565b8060005b8381101561583757815161582188826157ac565b975061582c83615e0c565b92505060010161580d565b509495945050505050565b6157c981615e2f565b60006158578385615e16565b9350615864838584615e68565b61586d83615eb1565b9093019392505050565b60006158838385615e1f565b9350615890838584615e68565b50500190565b60006158a182615e12565b6158ab8185615e16565b93506158bb818560208601615e74565b61586d81615eb1565b60006158cf82615e12565b6158d98185615e1f565b93506158e9818560208601615e74565b9290920192915050565b6157c981615e5d565b6000615909601183615e16565b706d73672e76616c7565206973207a65726f60781b815260200192915050565b6000615936601083615e16565b6f45786368616e6765206572726f72203160801b815260200192915050565b6000615962601183615e16565b7014195c9b5a5cdcda5bdb8819195b9a5959607a1b815260200192915050565b600061598f602883615e16565b7f41646472657373206f662072657761726457616c6c6574206d757374206e6f74815267206265207a65726f60c01b602082015260400192915050565b60006159d9601683615e16565b75151c985b9cd9995c881bd9881155120819985a5b195960521b815260200192915050565b6000615a0b601083615e16565b6f22bc31b430b733b29032b93937b9101960811b815260200192915050565b6000615a37601883615e16565b7f41646472657373206d757374206e6f74206265207a65726f0000000000000000815260200192915050565b60006144c9600083615e1f565b6157c981615e34565b6157c981615e47565b6157c9615a8e82615e47565b615e47565b6157c981615e4a565b6000615aa882846157d8565b50601401919050565b6000615abd82856157d8565b601482019150615acd8284615a82565b5060200192915050565b60006136ee828486615877565b60006121d982846158c4565b60006144c982615a63565b602081016144c982846157cf565b602081016144c982846157c0565b60408101615b2582856157c0565b6121d960208301846157cf565b60608101615b4082866157c0565b615b4d60208301856157c0565b6136ee6040830184615a79565b60808101615b6882876157c0565b615b7560208301866157cf565b615b826040830185615a79565b8181036060830152615b948184615896565b9695505050505050565b60408101615bac82866157c0565b8181036020830152614b6181848661584b565b60408101615bcd82856157c0565b6121d96020830184615a79565b60608101615b4082866157cf565b60608101615bf682866157cf565b615b4d60208301856157cf565b60c08101615c1182896157cf565b615c1e60208301886157cf565b615c2b6040830187615a79565b615c3860608301866157cf565b615c4560808301856157cf565b615c5260a0830184615a79565b979650505050505050565b60408101615bcd82856157cf565b60c08101615c7982896157cf565b615c866020830188615a79565b615c936040830187615a93565b615ca06060830186615a93565b615cad6080830185615a93565b615c5260a0830184615a93565b602080825281016144c681846157e9565b602081016144c98284615842565b602081016144c982846158f3565b602080825281016144c68184615896565b602080825281016144c9816158fc565b602080825281016144c981615929565b602080825281016144c981615955565b602080825281016144c981615982565b602080825281016144c9816159cc565b602080825281016144c9816159fe565b602080825281016144c981615a2a565b60408101615d768285615a70565b6121d96020830184615a93565b602081016144c98284615a79565b60408101615bcd8285615a79565b6040518181016001600160401b0381118282101715615dbd57600080fd5b604052919050565b60006001600160401b03821115615ddb57600080fd5b5060209081020190565b60006001600160401b03821115615dfb57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006144c982615e3b565b151590565b61ffff1690565b6001600160a01b031690565b90565b6001600160401b031690565b60006144c9825b60006144c982615e24565b82818337506000910152565b60005b83811015615e8f578181015183820152602001615e77565b83811115613d915750506000910152565b60006144c98260006144c982615ebb565b601f01601f191690565b60601b90565b615eca81615e24565b811461309057600080fd5b615eca81615e2f565b615eca81615e4756fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0fdfcfb5e25d61e13410c59c6087810407824cbdf17e25c145cfb55560acca9aa0a365627a7a723158201abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf906c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode
0x6080604052600436106102515760003560e01c80638129fc1c11610139578063c1892058116100b6578063eb21d9c41161007a578063eb21d9c4146106a0578063ebbc4965146106c0578063ee872558146106d5578063f3fef3a3146106f5578063fb75b2c714610715578063fc6019551461072a57610251565b8063c189205814610623578063c4d66de814610638578063cb9d122314610658578063ddca3f431461066b578063e9bca3241461068057610251565b80639f6a18cf116100fd5780639f6a18cf1461058e578063a224cee7146105ae578063a6f9dae1146105ce578063a9a5e3af146105ee578063b2b8b7dc1461060e57610251565b80638129fc1c146104f2578063899b8bcd1461050757806389b08f11146105275780638da5cb5b146105595780639aba1ce01461056e57610251565b80635958621e116101d25780636c46a2c5116101965780636c46a2c5146104325780636ddc6322146104525780636ded3d76146104725780637065cb481461049257806375f3974b146104b257806377deeef2146104d257610251565b80635958621e146103a85780635f82c67e146103c85780636568a279146103dd5780636a1db1bf146103fd5780636a51b63d1461041d57610251565b806324308b0a1161021957806324308b0a146103035780632a4c0a1a146103185780632a53ecf91461032d578063429b62e51461034d5780634d0415141461037a57610251565b80630531b2ad14610253578063067369461461027e57806311b2e10e146102a0578063173825d9146102b55780632072cdd1146102d5575b005b34801561025f57600080fd5b5061026861074c565b6040516102759190615afb565b60405180910390f35b34801561028a57600080fd5b50610293610764565b6040516102759190615d83565b3480156102ac57600080fd5b50610268610769565b3480156102c157600080fd5b506102516102d03660046153f9565b610781565b3480156102e157600080fd5b506102f56102f03660046156f9565b6109dc565b604051610275929190615d68565b34801561030f57600080fd5b50610268610a0e565b34801561032457600080fd5b50610268610a1d565b34801561033957600080fd5b50610251610348366004615496565b610a2f565b34801561035957600080fd5b5061036d6103683660046153f9565b6113ef565b6040516102759190615ccb565b34801561038657600080fd5b5061039a6103953660046153f9565b611404565b604051610275929190615d91565b3480156103b457600080fd5b506102516103c33660046153f9565b61162e565b3480156103d457600080fd5b50610268611889565b3480156103e957600080fd5b506102516103f83660046155e1565b6118a1565b34801561040957600080fd5b5061025161041836600461572d565b611912565b34801561042957600080fd5b50610293611b57565b34801561043e57600080fd5b5061025161044d3660046155e1565b611b5d565b34801561045e57600080fd5b5061026861046d366004615769565b611db3565b34801561047e57600080fd5b5061026861048d366004615769565b6121e0565b34801561049e57600080fd5b506102516104ad3660046153f9565b61276c565b3480156104be57600080fd5b506102516104cd36600461550b565b61298a565b3480156104de57600080fd5b506102516104ed366004615435565b6129cc565b3480156104fe57600080fd5b50610251613013565b34801561051357600080fd5b506102516105223660046153f9565b613093565b34801561053357600080fd5b506105476105423660046153f9565b61310c565b60405161027596959493929190615c6b565b34801561056557600080fd5b5061026861315f565b34801561057a57600080fd5b506102516105893660046153f9565b61316e565b34801561059a57600080fd5b506102936105a9366004615575565b6131d4565b3480156105ba57600080fd5b506102516105c93660046155e1565b6136f6565b3480156105da57600080fd5b506102516105e93660046153f9565b613798565b3480156105fa57600080fd5b506102516106093660046155e1565b6137d1565b34801561061a57600080fd5b50610268613a21565b34801561062f57600080fd5b50610268613a39565b34801561064457600080fd5b506102516106533660046153f9565b613a51565b61025161066636600461564a565b613aca565b34801561067757600080fd5b50610293613d97565b34801561068c57600080fd5b5061036d61069b3660046153f9565b613d9d565b3480156106ac57600080fd5b506102516106bb366004615615565b613db2565b3480156106cc57600080fd5b50610251613e25565b3480156106e157600080fd5b506102516106f0366004615575565b613e60565b34801561070157600080fd5b50610251610710366004615545565b6143a3565b34801561072157600080fd5b50610268614422565b34801561073657600080fd5b5061073f614431565b6040516102759190615cd9565b735d3a536e4d6dbd6114cc1ead35777bab948e364381565b600281565b7324a42fd28c976a61df5d00d0599c34c4f90748c881565b33600090815260cd602052604090205460ff166107b95760405162461bcd60e51b81526004016107b090615d18565b60405180910390fd5b600060cc6000366040516107ce929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610801906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166108b457600160cc600036604051610846929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161088e91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516108c9929190615ad7565b9081526040519081900360200190205461ffff16101580610912575060ce5460cc6000366040516108fb929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161092c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610963906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614440565b6109d8565b600080516020615f08833981519152336000366040516109cf93929190615b9e565b60405180910390a15b5050565b805160208183018101805160cc8252928201919093012091525461ffff8116906201000090046001600160401b031682565b60d2546001600160a01b031681565b600080516020615ee883398151915281565b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610a63903090600401615b09565b60206040518083038186803b158015610a7b57600080fd5b505afa158015610a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab3919081019061574b565b33600090815260cd602052604090205490915060ff16610ae55760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051610afa929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90610b2d906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16610be057600160cc600036604051610b72929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91610bba91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051610bf5929190615ad7565b9081526040519081900360200190205461ffff16101580610c3e575060ce5460cc600036604051610c27929190615ad7565b9081526040519081900360200190205461ffff1610155b1561132d57600060cc600036604051610c58929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90610c8f906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038616610cde57600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190610d12903090600401615b09565b60206040518083038186803b158015610d2a57600080fd5b505afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d62919081019061574b565b90508315610df3576040516323b872dd60e01b8152600080516020615ee8833981519152906323b872dd90610d9f90339030908990600401615b32565b602060405180830381600087803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610df191908101906156db565b505b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90610e2a9030908d90600401615b17565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7a919081019061574b565b14610ee75760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390610eb4908b9060001990600401615c5d565b600060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050505b600019861415610fa357604051630d6b883f60e21b81526001600160a01b038916906335ae20fc90610f4b90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f9d919081019061574b565b50611129565b6000610fb687600363ffffffff61449f16565b90506000611078735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561100c57600080fd5b505af1158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611044919081019061574b565b61106c670de0b6b3a7640000611060868d63ffffffff6144cf16565b9063ffffffff61449f16565b9063ffffffff6144e116565b604051630d6b883f60e21b81529091506001600160a01b038b16906335ae20fc906110d390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908a90600401615c03565b602060405180830381600087803b1580156110ed57600080fd5b505af1158015611101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611125919081019061574b565b5050505b83156111b65760405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb906111629033908890600401615bbf565b602060405180830381600087803b15801561117c57600080fd5b505af1158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111b491908101906156db565b505b6040516370a0823160e01b815260009061124490600080516020615ee8833981519152906370a08231906111ee903090600401615b09565b60206040518083038186803b15801561120657600080fd5b505afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061123e919081019061574b565b83614523565b90508581101561125357600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90611286908b908590600401615c5d565b602060405180830381600087803b1580156112a057600080fd5b505af11580156112b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112d891908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f905524908898460405161131e929190615d91565b60405180910390a35050611358565b600080516020615f088339815191523360003660405161134f93929190615b9e565b60405180910390a15b506040516370a0823160e01b81528190600080516020615ee8833981519152906370a082319061138c903090600401615b09565b60206040518083038186803b1580156113a457600080fd5b505afa1580156113b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113dc919081019061574b565b10156113e757600080fd5b505050505050565b60996020526000908152604090205460ff1681565b6040516370a0823160e01b81526000908190733d9819210a31b4961b30ef54be2aed79b9c9cd3b9073c00e94cb662c3520282e6f5717214004a7f268889081906370a0823190611458908890600401615afb565b60206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114a8919081019061574b565b6040516374d7814960e11b81529094506001600160a01b0383169063e9af0292906114d7908890600401615afb565b600060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506001600160a01b03841691506370a0823190611538908990600401615afb565b60206040518083038186803b15801561155057600080fd5b505afa158015611564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611588919081019061574b565b90506000836001600160a01b031663cc7ebdc4886040518263ffffffff1660e01b81526004016115b89190615afb565b60206040518083038186803b1580156115d057600080fd5b505afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611608919081019061574b565b905060006116168284614533565b90506116228188614523565b95505050505050915091565b33600090815260cd602052604090205460ff1661165d5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611672929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906116a5906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661175857600160cc6000366040516116ea929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161173291903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc60003660405161176d929190615ad7565b9081526040519081900360200190205461ffff161015806117b6575060ce5460cc60003660405161179f929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc6000366040516117d0929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611807906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b0382166118695760405162461bcd60e51b81526004016107b090615d58565b60d180546001600160a01b0319166001600160a01b0384161790556109d8565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6033546001600160a01b031633146118b857600080fd5b60005b81518110156109d85761190a8282815181106118d357fe5b6020026020010151610710308585815181106118eb57fe5b60200260200101516001600160a01b031661454390919063ffffffff16565b6001016118bb565b33600090815260cd602052604090205460ff166119415760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611956929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611989906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611a3c57600160cc6000366040516119ce929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611a1691903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611a51929190615ad7565b9081526040519081900360200190205461ffff16101580611a9a575060ce5460cc600036604051611a83929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611ab4929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611aeb906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614611b4057600080fd5b60648210611b4d57600080fd5b60d08290556109d8565b60ce5481565b33600090815260cd602052604090205460ff16611b8c5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051611ba1929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90611bd4906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16611c8757600160cc600036604051611c19929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91611c6191903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051611c9c929190615ad7565b9081526040519081900360200190205461ffff16101580611ce5575060ce5460cc600036604051611cce929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051611cff929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90611d36906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790558151611d7d57600080fd5b60005b8251811015611dad57611da5838281518110611d9857fe5b6020026020010151614610565b600101611d80565b506109d8565b60006001600160a01b038216611fd65760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611e1357600080fd5b505af1158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e4b9190810190615417565b60405163095ea7b360e01b8152909250600080516020615ee88339815191529063095ea7b390611e8390859060001990600401615c5d565b600060405180830381600087803b158015611e9d57600080fd5b505af1158015611eb1573d6000803e3d6000fd5b50506040805160c08101825233815260208082018981526000838501818152606085018281526080860183815260a087018481526001600160a01b038d811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a9674349150611fc9908790615d83565b60405180910390a261207b565b6001600160a01b03828116600090815260d36020526040902054163314611ffc57600080fd5b6001600160a01b038216600090815260d360205260409020600101546120229085614533565b6001600160a01b038316600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612072908790615d83565b60405180910390a25b61209b600080516020615ee883398151915233848763ffffffff61466616565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120ea57600080fd5b505afa1580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121229190810190615417565b60d4805491925060019160ff191682800217905550806001600160a01b0316635cffe9de30600080516020615ee883398151915287878a60405160200161216a929190615ab1565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016121989493929190615b5a565b600060405180830381600087803b1580156121b257600080fd5b505af11580156121c6573d6000803e3d6000fd5b505060d4805460ff191690555083925050505b9392505050565b6040516370a0823160e01b81526000908190600080516020615ee8833981519152906370a0823190612216903090600401615b09565b60206040518083038186803b15801561222e57600080fd5b505afa158015612242573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612266919081019061574b565b90506001600160a01b0383166124895760cf60009054906101000a90046001600160a01b03166001600160a01b031663069b6cac6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122fe9190810190615417565b60405163095ea7b360e01b8152909350600080516020615ee88339815191529063095ea7b39061233690869060001990600401615c5d565b600060405180830381600087803b15801561235057600080fd5b505af1158015612364573d6000803e3d6000fd5b50506040805160c08101825233815260208082018a81526000838501818152606085018281526080860183815260a087018481526001600160a01b038e811680875260d3909852948990209751885495166001600160a01b0319909516949094178755935160018701559051600290950180549151935192516001600160401b03908116600160c01b026001600160c01b03948216600160801b0267ffffffffffffffff60801b19968316600160401b0267ffffffffffffffff60401b199990931667ffffffffffffffff199095169490941797909716179390931617169290921790915590519092507fb65a69d3cf00ac7e6e4c1faca98de3519940db7b75770d171e5164211a967434915061247c908890615d83565b60405180910390a261252e565b6001600160a01b03838116600090815260d360205260409020541633146124af57600080fd5b6001600160a01b038316600090815260d360205260409020600101546124d59086614533565b6001600160a01b038416600081815260d36020526040908190206001019290925590517f23b30c811c0afa7005aecbb581a3a5bbd8fcb7feddcf8bcd5e2156ec62bbbbd490612525908890615d83565b60405180910390a25b61254e600080516020615ee883398151915233308863ffffffff61466616565b60405163a9059cbb60e01b815284860190600080516020615ee88339815191529063a9059cbb906125859087908590600401615c5d565b602060405180830381600087803b15801561259f57600080fd5b505af11580156125b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125d791908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a599061263090600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908d90600401615c03565b600060405180830381600087803b15801561264a57600080fd5b505af115801561265e573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e3366791506126a090600080516020615ee88339815191529030908a90600401615bda565b600060405180830381600087803b1580156126ba57600080fd5b505af11580156126ce573d6000803e3d6000fd5b50505050839250506040516370a0823160e01b81528190600080516020615ee8833981519152906370a0823190612709903090600401615b09565b60206040518083038186803b15801561272157600080fd5b505afa158015612735573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612759919081019061574b565b101561276457600080fd5b509392505050565b33600090815260cd602052604090205460ff1661279b5760405162461bcd60e51b81526004016107b090615d18565b600060cc6000366040516127b0929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc906127e3906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff1661289657600160cc600036604051612828929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc9161287091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc6000366040516128ab929190615ad7565b9081526040519081900360200190205461ffff161015806128f4575060ce5460cc6000366040516128dd929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc60003660405161290e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612945906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556109a882614610565b6033546001600160a01b031633146129a157600080fd5b6001600160a01b03919091166000908152609960205260409020805460ff1916911515919091179055565b33600090815260cd602052604090205460ff166129fb5760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051612a10929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90612a43906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16612af657600160cc600036604051612a88929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91612ad091903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051612b0b929190615ad7565b9081526040519081900360200190205461ffff16101580612b54575060ce5460cc600036604051612b3d929190615ad7565b9081526040519081900360200190205461ffff1610155b15612fe157600060cc600036604051612b6e929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90612ba5906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff0000199091161790556001600160a01b038416612bf457600080fd5b6040516370a0823160e01b8152600090600080516020615ee8833981519152906370a0823190612c28903090600401615b09565b60206040518083038186803b158015612c4057600080fd5b505afa158015612c54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c78919081019061574b565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cc957600080fd5b505afa158015612cdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d019190810190615417565b90506000600019861415612dac576040516305eff7ef60e21b8152735d3a536e4d6dbd6114cc1ead35777bab948e3643906317bfdfbc90612d46908b90600401615afb565b602060405180830381600087803b158015612d6057600080fd5b505af1158015612d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d98919081019061574b565b60d4805460ff191660021790559050612dcd565b612dbd86600363ffffffff61449f16565b60d4805460ff1916600317905590505b816001600160a01b0316635cffe9de30600080516020615ee8833981519152848c604051602001612dfe9190615a9c565b6040516020818303038152906040526040518563ffffffff1660e01b8152600401612e2c9493929190615b5a565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505060d4805460ff1916905550506040516370a0823160e01b8152600090612ef690600080516020615ee8833981519152906370a0823190612ea0903090600401615b09565b60206040518083038186803b158015612eb857600080fd5b505afa158015612ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ef0919081019061574b565b85614523565b905085811015612f0557600080fd5b60405163a9059cbb60e01b8152600080516020615ee88339815191529063a9059cbb90612f38908b908590600401615c5d565b602060405180830381600087803b158015612f5257600080fd5b505af1158015612f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612f8a91908101906156db565b50876001600160a01b0316896001600160a01b03167f1d66ffd6dc4cc59859af98690da66dab744745de617a1e2d809ae4f9055249088984604051612fd0929190615d91565b60405180910390a35050505061300c565b600080516020615f088339815191523360003660405161300393929190615b9e565b60405180910390a15b5050505050565b600054610100900460ff168061302c575061302c614787565b8061303a575060005460ff16155b61304357600080fd5b600054610100900460ff1615801561306e576000805460ff1961ff0019909116610100171660011790555b61307661478d565b61307e6147f0565b8015613090576000805461ff00191690555b50565b6033546001600160a01b03163314806130bb57503360009081526099602052604090205460ff165b6130d75760405162461bcd60e51b81526004016107b090615d18565b6001600160a01b0381166130ea57600080fd5b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b60d3602052600090815260409020805460018201546002909201546001600160a01b0390911691906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041686565b6033546001600160a01b031681565b6033546001600160a01b031633148061319657503360009081526099602052604090205460ff165b6131b25760405162461bcd60e51b81526004016107b090615d18565b60d280546001600160a01b0319166001600160a01b0392909216919091179055565b6033546000906001600160a01b03163314806131ff57503360009081526099602052604090205460ff165b61321b5760405162461bcd60e51b81526004016107b090615d18565b60d1546001600160a01b03166132435760405162461bcd60e51b81526004016107b090615d28565b6040516370a0823160e01b815260009073c00e94cb662c3520282e6f5717214004a7f26888906370a082319061327d903090600401615b09565b60206040518083038186803b15801561329557600080fd5b505afa1580156132a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132cd919081019061574b565b6040805160018082528183019092529192506060919060208083019080388339019050509050735d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061331557fe5b6001600160a01b03928316602091820292909201015260405163dd0c4d3f60e01b81529088169063dd0c4d3f90613350908490600401615cba565b600060405180830381600087803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b50506040516370a0823160e01b81526133bd925073c00e94cb662c3520282e6f5717214004a7f2688891506370a08231906111ee903090600401615b09565b915085156134a45760006133fc73c00e94cb662c3520282e6f5717214004a7f268888473dac17f958d2ee523a2206206994597c13d831ec78a89614854565b905061341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b60d1549091506134529073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b03168363ffffffff614b6a16565b6001600160a01b038816600090815260d36020526040902060020180546001600160401b03600160401b808304821685019091160267ffffffffffffffff60401b1990911617905592506136ee915050565b84156135ed576000670de0b6b3a76400006134bf8488614b77565b816134c657fe5b60d25491900491506134fe9073dac17f958d2ee523a2206206994597c13d831ec7906001600160a01b0316308463ffffffff61466616565b60d25460405163a9059cbb60e01b815273c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613542916001600160a01b0316908790600401615c5d565b602060405180830381600087803b15801561355c57600080fd5b505af1158015613570573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061359491908101906156db565b507f855da74d86689b845f6f0732c84e952fc55fcc5b81e077c74696aa606fb99d5242876040516135c6929190615d91565b60405180910390a161341d73dac17f958d2ee523a2206206994597c13d831ec7828a614b1d565b61360c73c00e94cb662c3520282e6f5717214004a7f268888389614b1d565b60d15460405163a9059cbb60e01b815291935073c00e94cb662c3520282e6f5717214004a7f268889163a9059cbb91613655916001600160a01b03909116908690600401615c5d565b602060405180830381600087803b15801561366f57600080fd5b505af1158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136a791908101906156db565b50506001600160a01b038616600090815260d36020526040902060020180546001600160401b0380821664e8d4a510008504011667ffffffffffffffff1990911617905590505b949350505050565b600054610100900460ff168061370f575061370f614787565b8061371d575060005460ff16155b61372657600080fd5b600054610100900460ff16158015613751576000805460ff1961ff0019909116610100171660011790555b600082511161375f57600080fd5b60005b82518110156137825761377a838281518110611d9857fe5b600101613762565b5080156109d8576000805461ff00191690555050565b6033546001600160a01b031633146137af57600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b33600090815260cd602052604090205460ff166138005760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613815929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613848906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff166138fb57600160cc60003660405161388d929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc916138d591903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613910929190615ad7565b9081526040519081900360200190205461ffff16101580613959575060ce5460cc600036604051613942929190615ad7565b9081526040519081900360200190205461ffff1610155b156109ad57600060cc600036604051613973929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc906139aa906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff00001990911617905581516139f157600080fd5b60005b8251811015611dad57613a19838281518110613a0c57fe5b6020026020010151614440565b6001016139f4565b73c00e94cb662c3520282e6f5717214004a7f2688881565b73dac17f958d2ee523a2206206994597c13d831ec781565b600054610100900460ff1680613a6a5750613a6a614787565b80613a78575060005460ff16155b613a8157600080fd5b600054610100900460ff16158015613aac576000805460ff1961ff0019909116610100171660011790555b613ab582614bac565b80156109d8576000805461ff00191690555050565b33600090815260cd602052604090205460ff16613af95760405162461bcd60e51b81526004016107b090615d18565b600060cc600036604051613b0e929190615ad7565b908152604051908190036020018120546001600160401b036201000090910416915060cc90613b41906000903690615ad7565b908152604080516020928190038301902060008481526001909101835281812033825290925290205460ff16613bf457600160cc600036604051613b86929190615ad7565b9081526040805160209281900383018120600086815260019091018452828120338252909352908220805460ff19169315159390931790925560cc91613bce91903690615ad7565b908152604051908190036020019020805461ffff8082166001011661ffff199091161790555b600260cc600036604051613c09929190615ad7565b9081526040519081900360200190205461ffff16101580613c52575060ce5460cc600036604051613c3b929190615ad7565b9081526040519081900360200190205461ffff1610155b15613d6657600060cc600036604051613c6c929190615ad7565b908152604051908190036020018120805461ffff9390931661ffff199093169290921790915560cc90613ca3906000903690615ad7565b908152604051908190036020019020805460016001600160401b0362010000808404821692909201160269ffffffffffffffff000019909116179055603354336001600160a01b0390911614613cf857600080fd5b60005b84518161ffff161015613d6057613d58858261ffff1681518110613d1b57fe5b6020026020010151858361ffff1681518110613d3357fe5b6020026020010151858461ffff1681518110613d4b57fe5b6020026020010151614c37565b600101613cfb565b50613d91565b600080516020615f0883398151915233600036604051613d8893929190615b9e565b60405180910390a15b50505050565b60d05481565b60cd6020526000908152604090205460ff1681565b6033546001600160a01b03163314613dc957600080fd5b60005b8251811015613e20578160996000858481518110613de657fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101613dcc565b505050565b6034546001600160a01b03163314613e3c57600080fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b600060d45460ff166003811115613e7357fe5b1415613e7e57600080fd5b6000613e8982614c64565b9050613e953086614c6b565b841115613ea157600080fd5b604051636eb1769f60e11b815260001990600080516020615ee88339815191529063dd62ed3e90613ed89030908690600401615b17565b60206040518083038186803b158015613ef057600080fd5b505afa158015613f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f28919081019061574b565b14613f955760405163095ea7b360e01b8152600080516020615ee88339815191529063095ea7b390613f6290849060001990600401615c5d565b600060405180830381600087803b158015613f7c57600080fd5b505af1158015613f90573d6000803e3d6000fd5b505050505b6000613fa18585614533565b9050600160d45460ff166003811115613fb657fe5b141561414c57603483015160405163a9059cbb60e01b815286820190600080516020615ee88339815191529063a9059cbb90613ff89087908b90600401615c5d565b602060405180830381600087803b15801561401257600080fd5b505af1158015614026573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061404a91908101906156db565b506040516302d35a5960e01b81526001600160a01b038516906302d35a59906140a390600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908b90600401615c03565b600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b50506040516301e3366760e01b81526001600160a01b03871692506301e33667915061411390600080516020615ee88339815191529030908890600401615bda565b600060405180830381600087803b15801561412d57600080fd5b505af1158015614141573d6000803e3d6000fd5b505050505050614399565b600260d45460ff16600381111561415f57fe5b141561421757604051630d6b883f60e21b81526001600160a01b038316906335ae20fc906141bf90600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e36439060001990839083908390600401615c03565b602060405180830381600087803b1580156141d957600080fd5b505af11580156141ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614211919081019061574b565b50614399565b600360d45460ff16600381111561422a57fe5b14156143995760006142e9735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142bc919081019061574b565b61106c670de0b6b3a76400006110606142dc8b600363ffffffff6144e116565b8b9063ffffffff6144cf16565b604051630d6b883f60e21b81529091506001600160a01b038416906335ae20fc9061434490600080516020615ee883398151915290735d3a536e4d6dbd6114cc1ead35777bab948e3643908690839083908e90600401615c03565b602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614396919081019061574b565b50505b6113e78682614d1b565b6033546001600160a01b031633146143ba57600080fd5b6001600160a01b038216614402576033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611dad573d6000803e3d6000fd5b6033546109d8906001600160a01b0384811691168363ffffffff614b6a16565b60d1546001600160a01b031681565b60cf546001600160a01b031681565b6001600160a01b038116600090815260cd602052604090205460ff1661446557600080fd5b600160ce541161447457600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916905560ce8054600019019055565b6000826144ae575060006144c9565b828202828482816144bb57fe5b04146144c657600080fd5b90505b92915050565b6000828201838110156144c657600080fd5b60006144c683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614daf565b808203828111156144c957600080fd5b808201828110156144c957600080fd5b60006001600160a01b038316158061457757506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561458d57506001600160a01b038116316144c9565b6040516370a0823160e01b81526001600160a01b038416906370a08231906145b9908590600401615afb565b60206040518083038186803b1580156145d157600080fd5b505afa1580156145e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614609919081019061574b565b90506144c9565b6001600160a01b038116600090815260cd602052604090205460ff161561463657600080fd5b6001600160a01b0316600090815260cd60205260409020805460ff1916600190811790915560ce80549091019055565b8061467057613d91565b6001600160a01b03841615806146a257506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b1561476c576001600160a01b038316331480156146bf5750803410155b6146db5760405162461bcd60e51b81526004016107b090615cf8565b6001600160a01b0382163014614723576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015614721573d6000803e3d6000fd5b505b8034111561476757336108fc61473f348463ffffffff614de616565b6040518115909202916000818181858888f19350505050158015613d60573d6000803e3d6000fd5b613d91565b613d916001600160a01b03851684848463ffffffff614df216565b303b1590565b600054610100900460ff16806147a657506147a6614787565b806147b4575060005460ff16155b6147bd57600080fd5b600054610100900460ff161580156147e8576000805460ff1961ff0019909116610100171660011790555b61307e614e4d565b600054610100900460ff16806148095750614809614787565b80614817575060005460ff16155b61482057600080fd5b600054610100900460ff1615801561484b576000805460ff1961ff0019909116610100171660011790555b61307e33614610565b6000807311111254369792b2ca5d084ab5eea397ca8fa48b9050600019876001600160a01b031663dd62ed3e30846001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156148ba57600080fd5b505afa1580156148ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506148f29190810190615417565b6040518363ffffffff1660e01b815260040161490f929190615b17565b60206040518083038186803b15801561492757600080fd5b505afa15801561493b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061495f919081019061574b565b14614a3757866001600160a01b031663095ea7b3826001600160a01b031663e8edc8166040518163ffffffff1660e01b815260040160206040518083038186803b1580156149ac57600080fd5b505afa1580156149c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506149e49190810190615417565b6000196040518363ffffffff1660e01b8152600401614a04929190615c5d565b600060405180830381600087803b158015614a1e57600080fd5b505af1158015614a32573d6000803e3d6000fd5b505050505b6000614a526001600160a01b0389163063ffffffff61454316565b90506000614a6f6001600160a01b0388163063ffffffff61454316565b90506000602060008751602089016000886113885a03f150506000518289614aa66001600160a01b038d163063ffffffff61454316565b011015614ac55760405162461bcd60e51b81526004016107b090615d08565b6000614ae06001600160a01b038a163063ffffffff61454316565b9050878301811015614b045760405162461bcd60e51b81526004016107b090615d48565b614b0e8184614523565b9b9a5050505050505050505050565b60008060648460d0540281614b2e57fe5b0490508015614b5757603354614b57906001600160a01b0387811691168363ffffffff614b6a16565b614b618482614523565b95945050505050565b613d918383836000614ece565b6000670de0b6b3a7640000614b9d614b8f8585614fa8565b6706f05b59d3b20000614533565b81614ba457fe5b049392505050565b600054610100900460ff1680614bc55750614bc5614787565b80614bd3575060005460ff16155b614bdc57600080fd5b600054610100900460ff16158015614c07576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b03841617905580156109d8576000805461ff00191690555050565b60006020600084516020860185886113885a03f16000519150801560018114614c5f576113e7565b600080fd5b6014015190565b6000614c75614fcc565b6001600160a01b0316826001600160a01b03161415614c9f57506001600160a01b038216316144c9565b6040516370a0823160e01b81526001600160a01b038316906370a0823190614ccb908690600401615afb565b60206040518083038186803b158015614ce357600080fd5b505afa158015614cf7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144c6919081019061574b565b60007324a42fd28c976a61df5d00d0599c34c4f90748c86001600160a01b031663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015614d6a57600080fd5b505afa158015614d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614da29190810190615417565b9050613e20818484614fe4565b60008183614dd05760405162461bcd60e51b81526004016107b09190615ce7565b506000838581614ddc57fe5b0495945050505050565b60006144c68383614de6565b604051613d919085906323b872dd60e01b90614e1690879087908790602401615be8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526150a7565b600054610100900460ff1680614e665750614e66614787565b80614e74575060005460ff16155b614e7d57600080fd5b600054610100900460ff16158015614ea8576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b031916331790558015613090576000805461ff001916905550565b600082614edd575060016136ee565b6001600160a01b0385161580614f0f57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15614f86578115614f46576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505090506136ee565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015614f7c573d6000803e3d6000fd5b50600190506136ee565b614fa06001600160a01b038616858563ffffffff61515316565b5060016136ee565b6000811580614fc357505080820282828281614fc057fe5b04145b6144c957600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b614fec614fcc565b6001600160a01b0316826001600160a01b0316141561508d5760008390506000816001600160a01b03168360405161502390615af0565b60006040518083038185875af1925050503d8060008114615060576040519150601f19603f3d011682016040523d82523d6000602084013e615065565b606091505b50509050806150865760405162461bcd60e51b81526004016107b090615d38565b5050613e20565b613e206001600160a01b038316848363ffffffff61515316565b6150b9826001600160a01b0316615175565b6150c257600080fd5b60006060836001600160a01b0316836040516150de9190615ae4565b6000604051808303816000865af19150503d806000811461511b576040519150601f19603f3d011682016040523d82523d6000602084013e615120565b606091505b50915091508161512f57600080fd5b805115613d91578080602001905161514a91908101906156db565b613d9157600080fd5b604051613e2090849063a9059cbb60e01b90614e169086908690602401615c5d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906136ee5750141592915050565b80356144c981615ec1565b80516144c981615ec1565b600082601f8301126151d357600080fd5b81356151e66151e182615dc5565b615d9f565b9150818183526020840193506020810190508385602084028201111561520b57600080fd5b60005b83811015615237578161522188826151ac565b845250602092830192919091019060010161520e565b5050505092915050565b600082601f83011261525257600080fd5b81356152606151e182615dc5565b9150818183526020840193506020810190508385602084028201111561528557600080fd5b60005b83811015615237578161529b88826151ac565b8452506020928301929190910190600101615288565b600082601f8301126152c257600080fd5b81356152d06151e182615dc5565b81815260209384019390925082018360005b8381101561523757813586016152f88882615394565b84525060209283019291909101906001016152e2565b600082601f83011261531f57600080fd5b813561532d6151e182615dc5565b9150818183526020840193506020810190508385602084028201111561535257600080fd5b60005b83811015615237578161536888826153e3565b8452506020928301929190910190600101615355565b80356144c981615ed5565b80516144c981615ed5565b600082601f8301126153a557600080fd5b81356153b36151e182615de5565b915080825260208301602083018583830111156153cf57600080fd5b6153da838284615e68565b50505092915050565b80356144c981615ede565b80516144c981615ede565b60006020828403121561540b57600080fd5b60006136ee84846151ac565b60006020828403121561542957600080fd5b60006136ee84846151b7565b6000806000806080858703121561544b57600080fd5b600061545787876151ac565b9450506020615468878288016151ac565b9350506040615479878288016153e3565b925050606061548a878288016153e3565b91505092959194509250565b600080600080600060a086880312156154ae57600080fd5b60006154ba88886151ac565b95505060206154cb888289016151ac565b94505060406154dc888289016153e3565b93505060606154ed888289016153e3565b92505060806154fe888289016153e3565b9150509295509295909350565b6000806040838503121561551e57600080fd5b600061552a85856151ac565b925050602061553b8582860161537e565b9150509250929050565b6000806040838503121561555857600080fd5b600061556485856151ac565b925050602061553b858286016153e3565b6000806000806080858703121561558b57600080fd5b600061559787876151ac565b94505060206155a8878288016153e3565b93505060406155b9878288016153e3565b92505060608501356001600160401b038111156155d557600080fd5b61548a87828801615394565b6000602082840312156155f357600080fd5b81356001600160401b0381111561560957600080fd5b6136ee848285016151c2565b6000806040838503121561562857600080fd5b82356001600160401b0381111561563e57600080fd5b61552a858286016151c2565b60008060006060848603121561565f57600080fd5b83356001600160401b0381111561567557600080fd5b61568186828701615241565b93505060208401356001600160401b0381111561569d57600080fd5b6156a9868287016152b1565b92505060408401356001600160401b038111156156c557600080fd5b6156d18682870161530e565b9150509250925092565b6000602082840312156156ed57600080fd5b60006136ee8484615389565b60006020828403121561570b57600080fd5b81356001600160401b0381111561572157600080fd5b6136ee84828501615394565b60006020828403121561573f57600080fd5b60006136ee84846153e3565b60006020828403121561575d57600080fd5b60006136ee84846153ee565b60008060006060848603121561577e57600080fd5b600061578a86866153e3565b935050602061579b868287016153e3565b92505060406156d1868287016151ac565b60006157b883836157cf565b505060200190565b6157c981615e56565b82525050565b6157c981615e24565b6157c96157e482615e24565b615ea0565b60006157f482615e12565b6157fe8185615e16565b935061580983615e0c565b8060005b8381101561583757815161582188826157ac565b975061582c83615e0c565b92505060010161580d565b509495945050505050565b6157c981615e2f565b60006158578385615e16565b9350615864838584615e68565b61586d83615eb1565b9093019392505050565b60006158838385615e1f565b9350615890838584615e68565b50500190565b60006158a182615e12565b6158ab8185615e16565b93506158bb818560208601615e74565b61586d81615eb1565b60006158cf82615e12565b6158d98185615e1f565b93506158e9818560208601615e74565b9290920192915050565b6157c981615e5d565b6000615909601183615e16565b706d73672e76616c7565206973207a65726f60781b815260200192915050565b6000615936601083615e16565b6f45786368616e6765206572726f72203160801b815260200192915050565b6000615962601183615e16565b7014195c9b5a5cdcda5bdb8819195b9a5959607a1b815260200192915050565b600061598f602883615e16565b7f41646472657373206f662072657761726457616c6c6574206d757374206e6f74815267206265207a65726f60c01b602082015260400192915050565b60006159d9601683615e16565b75151c985b9cd9995c881bd9881155120819985a5b195960521b815260200192915050565b6000615a0b601083615e16565b6f22bc31b430b733b29032b93937b9101960811b815260200192915050565b6000615a37601883615e16565b7f41646472657373206d757374206e6f74206265207a65726f0000000000000000815260200192915050565b60006144c9600083615e1f565b6157c981615e34565b6157c981615e47565b6157c9615a8e82615e47565b615e47565b6157c981615e4a565b6000615aa882846157d8565b50601401919050565b6000615abd82856157d8565b601482019150615acd8284615a82565b5060200192915050565b60006136ee828486615877565b60006121d982846158c4565b60006144c982615a63565b602081016144c982846157cf565b602081016144c982846157c0565b60408101615b2582856157c0565b6121d960208301846157cf565b60608101615b4082866157c0565b615b4d60208301856157c0565b6136ee6040830184615a79565b60808101615b6882876157c0565b615b7560208301866157cf565b615b826040830185615a79565b8181036060830152615b948184615896565b9695505050505050565b60408101615bac82866157c0565b8181036020830152614b6181848661584b565b60408101615bcd82856157c0565b6121d96020830184615a79565b60608101615b4082866157cf565b60608101615bf682866157cf565b615b4d60208301856157cf565b60c08101615c1182896157cf565b615c1e60208301886157cf565b615c2b6040830187615a79565b615c3860608301866157cf565b615c4560808301856157cf565b615c5260a0830184615a79565b979650505050505050565b60408101615bcd82856157cf565b60c08101615c7982896157cf565b615c866020830188615a79565b615c936040830187615a93565b615ca06060830186615a93565b615cad6080830185615a93565b615c5260a0830184615a93565b602080825281016144c681846157e9565b602081016144c98284615842565b602081016144c982846158f3565b602080825281016144c68184615896565b602080825281016144c9816158fc565b602080825281016144c981615929565b602080825281016144c981615955565b602080825281016144c981615982565b602080825281016144c9816159cc565b602080825281016144c9816159fe565b602080825281016144c981615a2a565b60408101615d768285615a70565b6121d96020830184615a93565b602081016144c98284615a79565b60408101615bcd8285615a79565b6040518181016001600160401b0381118282101715615dbd57600080fd5b604052919050565b60006001600160401b03821115615ddb57600080fd5b5060209081020190565b60006001600160401b03821115615dfb57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006144c982615e3b565b151590565b61ffff1690565b6001600160a01b031690565b90565b6001600160401b031690565b60006144c9825b60006144c982615e24565b82818337506000910152565b60005b83811015615e8f578181015183820152602001615e77565b83811115613d915750506000910152565b60006144c98260006144c982615ebb565b601f01601f191690565b60601b90565b615eca81615e24565b811461309057600080fd5b615eca81615e2f565b615eca81615e4756fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0fdfcfb5e25d61e13410c59c6087810407824cbdf17e25c145cfb55560acca9aa0a365627a7a723158201abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf906c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode Sourcemap
38532:15911:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20872:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20872:81:0;;;:::i;:::-;;;;;;;;;;;;;;;;28213:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28213:34:0;;;:::i;:::-;;;;;;;;26604:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26604:92:0;;;:::i;29960:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29960:103:0;;;;;;;;:::i;28256:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28256:39:0;;;;;;;;:::i;:::-;;;;;;;;;39468:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39468:28:0;;;:::i;20785:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20785:80:0;;;:::i;45507:1514::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;45507:1514:0;;;;;;;;:::i;19545:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19545:38:0;;;;;;;;:::i;:::-;;;;;;;;40799:540;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40799:540:0;;;;;;;;:::i;:::-;;;;;;;;;44094:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44094:193:0;;;;;;;;:::i;20600:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20600:80:0;;;:::i;19048:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19048:222:0;;;;;;;;:::i;47618:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47618:154:0;;;;;;;;:::i;28355:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28355:30:0;;;:::i;29724:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29724:228:0;;;;;;;;:::i;41767:1107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41767:1107:0;;;;;;;;:::i;42882:1158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42882:1158:0;;;;;;;;:::i;29615:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29615:99:0;;;;;;;;:::i;20102:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20102:118:0;;;;;;;;:::i;44295:1202::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44295:1202:0;;;;;;;;:::i;40200:369::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40200:369:0;;;:::i;47411:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47411:199:0;;;;;;;;:::i;39505:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39505:43:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;2368:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2368:28:0;;;:::i;47780:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47780:123:0;;;;;;;;:::i;47911:2032::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47911:2032:0;;;;;;;;:::i;29334:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29334:225:0;;;;;;;;:::i;2811:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2811:111:0;;;;;;;;:::i;30071:230::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30071:230:0;;;;;;;;:::i;20962:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20962:81:0;;;:::i;21052:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21052:81:0;;;:::i;19939:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19939:153:0;;;;;;;;:::i;47052:303::-;;;;;;;;;:::i;39409:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39409:18:0;;;:::i;28302:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28302:44:0;;;;;;;;:::i;20228:200::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20228:200:0;;;;;;;;:::i;2930:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2930:125:0;;;:::i;49992:1901::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49992:1901:0;;;;;;;;:::i;18801:239::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18801:239:0;;;;;;;;:::i;39434:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39434:27:0;;;:::i;39361:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39361:39:0;;;:::i;:::-;;;;;;;;20872:81;20911:42;20872:81;:::o;28213:34::-;28246:1;28213:34;:::o;26604:92::-;26654:42;26604:92;:::o;29960:103::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;30033:22;30046:8;30033:12;:22::i;:::-;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;29960:103;;:::o;28256:39::-;22:14:-1;;169:4;143:32;;;;;198:20;;28256:39:0;224:31:-1;;156:18;;;283;;;;273:49;328:32;;28256:39:0;;;;;;;;-1:-1:-1;;;;;28256:39:0;;:::o;39468:28::-;;;-1:-1:-1;;;;;39468:28:0;;:::o;20785:80::-;-1:-1:-1;;;;;;;;;;;20785:80:0;:::o;45507:1514::-;39977:44;;-1:-1:-1;;;39977:44:0;;39954:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;39977:29;;:44;;40015:4;;39977:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39977:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39977:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39977:44:0;;;;;;;;;28513:10;28501:23;;;;:11;:23;;;;;;39954:67;;-1:-1:-1;28501:23:0;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;45692:29:0;;45684:38;;;;;;45758:44;;-1:-1:-1;;;45758:44:0;;45735:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;45758:29;;:44;;45796:4;;45758:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45758:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45758:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45758:44:0;;;;;;;;;45735:67;-1:-1:-1;45819:17:0;;45815:97;;45838:74;;-1:-1:-1;;;45838:74:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;45838:32;;:74;;45871:10;;45891:4;;45898:13;;45838:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45838:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45838:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45838:74:0;;;;;;;;;;45815:97;45929:54;;-1:-1:-1;;;45929:54:0;;-1:-1:-1;;45995:2:0;-1:-1:-1;;;;;;;;;;;20823:42:0;45929:29;;:54;;45967:4;;45974:8;;45929:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45929:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45929:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45929:54:0;;;;;;;;;:69;45925:152;;46015:50;;-1:-1:-1;;;46015:50:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46015:27;;:50;;46043:8;;-1:-1:-1;;46061:2:0;46015:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46015:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46015:50:0;;;;45925:152;-1:-1:-1;;46093:9:0;:21;46089:488;;;46131:102;;-1:-1:-1;;;46131:102:0;;-1:-1:-1;;;;;46131:28:0;;;;;:102;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;-1:-1:-1;;46192:2:0;20823:42;;20911;;46192:2;;46131:102;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46131:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46131:102:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46131:102:0;;;;;;;;;;46089:488;;;46266:23;46292:16;:9;46306:1;46292:16;:13;:16;:::i;:::-;46266:42;;46323:21;46347:89;20911:42;-1:-1:-1;;;;;46392:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46392:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46392:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46392:43:0;;;;;;;;;46347:40;46382:4;46347:30;:15;46367:9;46347:30;:19;:30;:::i;:::-;:34;:40;:34;:40;:::i;:::-;:44;:89;:44;:89;:::i;:::-;46451:114;;-1:-1:-1;;;46451:114:0;;46323:113;;-1:-1:-1;;;;;;46451:28:0;;;;;:114;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;46323:113;;20823:42;;20911;;46549:15;;46451:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46451:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46451:114:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46451:114:0;;;;;;;;;;46089:488;;;46593:17;;46589:78;;46612:55;;-1:-1:-1;;;46612:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46612:28;;:55;;46641:10;;46653:13;;46612:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46612:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46612:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46612:55:0;;;;;;;;;;46589:78;46705:44;;-1:-1:-1;;;46705:44:0;;46680:18;;46701:63;;-1:-1:-1;;;;;;;;;;;20823:42:0;46705:29;;:44;;46743:4;;46705:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46705:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46705:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46705:44:0;;;;;;;;;46751:12;46701:3;:63::i;:::-;46680:84;;46797:12;46783:10;:26;;46775:35;;;;;;46821:55;;-1:-1:-1;;;46821:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;46821:28;;:55;;46850:13;;46865:10;;46821:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46821:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46821:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46821:55:0;;;;;;;;;;46976:13;-1:-1:-1;;;;;46951:62:0;46966:8;-1:-1:-1;;;;;46951:62:0;;46991:9;47002:10;46951:62;;;;;;;;;;;;;;;;29109:1;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;-1:-1:-1;40052:44:0;;-1:-1:-1;;;40052:44:0;;40100:12;;-1:-1:-1;;;;;;;;;;;20823:42:0;40052:29;;:44;;40090:4;;40052:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40052:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40052:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40052:44:0;;;;;;;;;:60;;40044:69;;;;;;45507:1514;;;;;;:::o;19545:38::-;;;;;;;;;;;;;;;:::o;40799:540::-;41058:23;;-1:-1:-1;;;41058:23:0;;40867:15;;;;20638:42;;21001;;;;41058:14;;:23;;41073:7;;41058:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41058:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41058:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41058:23:0;;;;;;;;;41092:30;;-1:-1:-1;;;41092:30:0;;41048:33;;-1:-1:-1;;;;;;41092:21:0;;;;;:30;;41114:7;;41092:30;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41092:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;41154:23:0;;-1:-1:-1;;;41154:23:0;;41133:18;;-1:-1:-1;;;;;;41154:14:0;;;-1:-1:-1;41154:14:0;;:23;;41169:7;;41154:23;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41154:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41154:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41154:23:0;;;;;;;;;41133:44;;41188:15;41206:11;-1:-1:-1;;;;;41206:23:0;;41230:7;41206:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41206:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41206:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41206:32:0;;;;;;;;;41188:50;;41249:13;41265:24;41269:7;41278:10;41265:3;:24::i;:::-;41249:40;;41312:19;41316:5;41323:7;41312:3;:19::i;:::-;41300:31;;40799:540;;;;;;;;:::o;44094:193::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;44184:27:0;;44176:64;;;;-1:-1:-1;;;44176:64:0;;;;;;;;;44251:12;:28;;-1:-1:-1;;;;;;44251:28:0;-1:-1:-1;;;;;44251:28:0;;;;;28830:367;;20600:80;20638:42;20600:80;:::o;19048:222::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;19126:9;19122:141;19145:6;:13;19141:1;:17;19122:141;;;19179:72;19188:6;19195:1;19188:9;;;;;;;;;;;;;;19199:51;19244:4;19206:6;19213:1;19206:9;;;;;;;;;;;;;;-1:-1:-1;;;;;19199:36:0;;;:51;;;;:::i;19179:72::-;19159:3;;19122:141;;47618:154;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;47707:5;;47693:10;-1:-1:-1;;;;;47707:5:0;;;47693:19;47685:28;;;;;;47739:3;47732:4;:10;47724:19;;;;;;47754:3;:10;;;28830:367;;28355:30;;;;:::o;29724:228::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;29814:17;;29806:30;;;;;;29854:6;29849:96;29870:10;:17;29866:1;:21;29849:96;;;29909:24;29919:10;29930:1;29919:13;;;;;;;;;;;;;;29909:9;:24::i;:::-;29889:3;;29849:96;;;;28830:367;;41767:1107;41885:7;-1:-1:-1;;;;;41911:24:0;;41907:513;;41963:15;;;;;;;;;-1:-1:-1;;;;;41963:15:0;-1:-1:-1;;;;;41963:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41963:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41963:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41963:32:0;;;;;;;;;42010:50;;-1:-1:-1;;;42010:50:0;;41952:43;;-1:-1:-1;;;;;;;;;;;;20823:42:0;42010:27;;:50;;41952:43;;-1:-1:-1;;42056:2:0;42010:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42010:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42095:43:0;;;;;;;;42104:10;42095:43;;;;;;;;;-1:-1:-1;42095:43:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42075:17:0;;;;;;:7;:17;;;;;;;:63;;;;;;-1:-1:-1;;;;;;42075:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;42075:63:0;;;-1:-1:-1;;;42075:63:0;-1:-1:-1;;;;42075:63:0;;;;-1:-1:-1;;42075:63:0;;;;;;;;;;;;;;;;;;;;;;;;;42158:34;;42075:17;;-1:-1:-1;42158:34:0;;-1:-1:-1;42158:34:0;;42116:9;;42158:34;;;;;;;;;;41907:513;;;-1:-1:-1;;;;;42233:17:0;;;;;;;:7;:17;;;;;:23;;42260:10;42233:37;42225:46;;;;;;-1:-1:-1;;;;;42318:17:0;;;;;;:7;:17;;;;;:25;;;42314:41;;42345:9;42314:3;:41::i;:::-;-1:-1:-1;;;;;42286:17:0;;;;;;:7;:17;;;;;;;:25;;:69;;;;42375:33;;;;;;42398:9;;42375:33;;;;;;;;;;41907:513;42468:74;-1:-1:-1;;;;;;;;;;;42510:10:0;42522:8;42532:9;42468:74;:41;:74;:::i;:::-;42555:24;26654:42;-1:-1:-1;;;;;42595:69:0;;:71;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42595:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42595:71:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42595:71:0;;;;;;;;;42678:5;:15;;42555:112;;-1:-1:-1;42686:7:0;;-1:-1:-1;;42678:15:0;42686:7;;42678:15;;;;;42704:11;-1:-1:-1;;;;;42704:21:0;;42734:4;-1:-1:-1;;;;;;;;;;;42754:15:0;42788:8;42798:9;42771:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42771:37:0;;;42704:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42704:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;42820:5:0;:18;;-1:-1:-1;;42820:18:0;;;-1:-1:-1;42858:8:0;;-1:-1:-1;;;41767:1107:0;;;;;;:::o;42882:1158::-;39977:44;;-1:-1:-1;;;39977:44:0;;43004:7;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;39977:29;;:44;;40015:4;;39977:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39977:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39977:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39977:44:0;;;;;;;;;39954:67;-1:-1:-1;;;;;;43028:24:0;;43024:513;;43080:15;;;;;;;;;-1:-1:-1;;;;;43080:15:0;-1:-1:-1;;;;;43080:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43080:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43080:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43080:32:0;;;;;;;;;43127:50;;-1:-1:-1;;;43127:50:0;;43069:43;;-1:-1:-1;;;;;;;;;;;;20823:42:0;43127:27;;:50;;43069:43;;-1:-1:-1;;43173:2:0;43127:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43127:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43212:43:0;;;;;;;;43221:10;43212:43;;;;;;;;;-1:-1:-1;43212:43:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43192:17:0;;;;;;:7;:17;;;;;;;:63;;;;;;-1:-1:-1;;;;;;43192:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;43192:63:0;;;-1:-1:-1;;;43192:63:0;-1:-1:-1;;;;43192:63:0;;;;-1:-1:-1;;43192:63:0;;;;;;;;;;;;;;;;;;;;;;;;;43275:34;;43192:17;;-1:-1:-1;43275:34:0;;-1:-1:-1;43275:34:0;;43233:9;;43275:34;;;;;;;;;;43024:513;;;-1:-1:-1;;;;;43350:17:0;;;;;;;:7;:17;;;;;:23;;43377:10;43350:37;43342:46;;;;;;-1:-1:-1;;;;;43435:17:0;;;;;;:7;:17;;;;;:25;;;43431:41;;43462:9;43431:3;:41::i;:::-;-1:-1:-1;;;;;43403:17:0;;;;;;:7;:17;;;;;;;:25;;:69;;;;43492:33;;;;;;43515:9;;43492:33;;;;;;;;;;43024:513;43587:79;-1:-1:-1;;;;;;;;;;;43629:10:0;43649:4;43656:9;43587:79;:41;:79;:::i;:::-;43740:50;;-1:-1:-1;;;43740:50:0;;43700:27;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;43740:28;;:50;;43769:8;;43700:27;;43740:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43740:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43740:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43740:50:0;;;;;;;;;-1:-1:-1;43803:110:0;;-1:-1:-1;;;43803:110:0;;-1:-1:-1;;;;;43803:27:0;;;;;:110;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;43858:10;;20823:42;;20911;;43897:15;;43803:110;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43803:110:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43926:78:0;;-1:-1:-1;;;43926:78:0;;-1:-1:-1;;;;;43926:33:0;;;-1:-1:-1;43926:33:0;;-1:-1:-1;43926:78:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;43981:4;;43988:15;;43926:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43926:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43926:78:0;;;;44024:8;44017:15;;;40052:44;;-1:-1:-1;;;40052:44:0;;40100:12;;-1:-1:-1;;;;;;;;;;;20823:42:0;40052:29;;:44;;40090:4;;40052:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40052:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40052:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40052:44:0;;;;;;;;;:60;;40044:69;;;;;;42882:1158;;;;;;:::o;29615:99::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;29686:20;29696:9;29686;:20::i;20102:118::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;-1:-1:-1;;;;;20188:14:0;;;;;;;;:6;:14;;;;;:24;;-1:-1:-1;;20188:24:0;;;;;;;;;;20102:118::o;44295:1202::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;-1:-1:-1;;;;;44453:29:0;;44445:38;;;;;;44519:44;;-1:-1:-1;;;44519:44:0;;44496:20;;-1:-1:-1;;;;;;;;;;;20823:42:0;44519:29;;:44;;44557:4;;44519:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44519:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44519:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44519:44:0;;;;;;;;;44496:67;;44576:24;26654:42;-1:-1:-1;;;;;44616:69:0;;:71;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44616:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44616:71:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44616:71:0;;;;;;;;;44576:112;;44701:23;-1:-1:-1;;44739:9:0;:21;44735:262;;;44795:52;;-1:-1:-1;;;44795:52:0;;20911:42;;44795;;:52;;44838:8;;44795:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44795:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44795:52:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44795:52:0;;;;;;;;;44862:5;:16;;-1:-1:-1;;44862:16:0;44870:8;44862:16;;;44777:70;-1:-1:-1;44735:262:0;;;44929:16;:9;44943:1;44929:16;:13;:16;:::i;:::-;44960:5;:25;;-1:-1:-1;;44960:25:0;44968:17;44960:25;;;44911:34;-1:-1:-1;44735:262:0;45009:11;-1:-1:-1;;;;;45009:21:0;;45039:4;-1:-1:-1;;;;;;;;;;;45059:15:0;45093:8;45076:26;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45076:26:0;;;45009:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45009:94:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45114:5:0;:18;;-1:-1:-1;;45114:18:0;;;-1:-1:-1;;45170:44:0;;-1:-1:-1;;;45170:44:0;;45122:10;;45166:63;;-1:-1:-1;;;;;;;;;;;20823:42:0;45170:29;;:44;;45208:4;;45170:44;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45170:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45170:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45170:44:0;;;;;;;;;45216:12;45166:3;:63::i;:::-;45145:84;;45264:12;45250:10;:26;;45242:35;;;;;;45290:55;;-1:-1:-1;;;45290:55:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;45290:28;;:55;;45319:13;;45334:10;;45290:55;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45290:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45290:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45290:55:0;;;;;;;;;;45452:13;-1:-1:-1;;;;;45427:62:0;45442:8;-1:-1:-1;;;;;45427:62:0;;45467:9;45478:10;45427:62;;;;;;;;;;;;;;;;29109:1;;;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;44295:1202;;;;;:::o;40200:369::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;40252:32;:30;:32::i;:::-;40327:25;:23;:25::i;:::-;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;1389:57;40200:369;:::o;47411:199::-;19653:5;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;-1:-1:-1;;;;;47508:30:0;;47500:39;;;;;;47550:15;:52;;-1:-1:-1;;;;;;47550:52:0;-1:-1:-1;;;;;47550:52:0;;;;;;;;;;47411:199::o;39505:43::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39505:43:0;;;;;-1:-1:-1;;;;;39505:43:0;;;;-1:-1:-1;;;39505:43:0;;;;;-1:-1:-1;;;39505:43:0;;;;;-1:-1:-1;;;39505:43:0;;;;:::o;2368:28::-;;;-1:-1:-1;;;;;2368:28:0;;:::o;47780:123::-;19653:5;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;47868:13;:27;;-1:-1:-1;;;;;;47868:27:0;-1:-1:-1;;;;;47868:27:0;;;;;;;;;;47780:123::o;47911:2032::-;19653:5;;48064:7;;-1:-1:-1;;;;;19653:5:0;19639:10;:19;;:58;;-1:-1:-1;19686:10:0;19679:18;;;;:6;:18;;;;;;;;19639:58;19631:88;;;;-1:-1:-1;;;19631:88:0;;;;;;;;;48092:12;;-1:-1:-1;;;;;48092:12:0;48084:79;;;;-1:-1:-1;;;48084:79:0;;;;;;;;;48203:45;;-1:-1:-1;;;48203:45:0;;48176:24;;21001:42;;48203:30;;:45;;48242:4;;48203:45;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48203:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48203:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48203:45:0;;;;;;;;;48286:16;;;48300:1;48286:16;;;;;;;;;48176:72;;-1:-1:-1;48259:24:0;;48286:16;;;;;;;105:10:-1;48286:16:0;88:34:-1;136:17;;-1:-1;48286:16:0;48259:43;;20911:42;48313:7;48321:1;48313:10;;;;;;;;-1:-1:-1;;;;;48313:25:0;;;:10;;;;;;;;;:25;48349:38;;-1:-1:-1;;;48349:38:0;;:29;;;;;;:38;;48379:7;;48349:38;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48349:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;48423:45:0;;-1:-1:-1;;;48423:45:0;;48419:68;;-1:-1:-1;21001:42:0;;-1:-1:-1;48423:30:0;;:45;;48462:4;;48423:45;;;;48419:68;48400:87;-1:-1:-1;48503:17:0;;48500:1436;;48537:18;48558:92;21001:42;48590:16;21091:42;48630:13;48645:4;48558:9;:92::i;:::-;48537:113;;48678:45;21091:42;48702:10;48714:8;48678:9;:45::i;:::-;48779:12;;48665:58;;-1:-1:-1;48740:64:0;;21091:42;;-1:-1:-1;;;;;48779:12:0;48665:58;48740:64;:38;:64;:::i;:::-;-1:-1:-1;;;;;48819:17:0;;;;;;:7;:17;;;;;:34;;:56;;-1:-1:-1;;;;;;;;48819:56:0;;;;;;;;;;;-1:-1:-1;;;;48819:56:0;;;;;;48864:10;-1:-1:-1;48890:17:0;;-1:-1:-1;;48890:17:0;48500:1436;48928:19;;48925:1011;;48999:18;49062:6;49020:39;49025:16;49043:15;49020:4;:39::i;:::-;:48;;;;;49142:13;;49020:48;;;;-1:-1:-1;49099:84:0;;21091:42;;-1:-1:-1;;;;;49142:13:0;49165:4;49020:48;49099:84;:42;:84;:::i;:::-;49228:13;;49198:62;;-1:-1:-1;;;49198:62:0;;21001:42;;49198:29;;:62;;-1:-1:-1;;;;;49228:13:0;;49243:16;;49198:62;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49198:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49198:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49198:62:0;;;;;;;;;;49280:42;49289:15;49306;49280:42;;;;;;;;;;;;;;;;49385:45;21091:42;49409:10;49421:8;49385:9;:45::i;48925:1011::-;49666:51;21001:42;49690:16;49708:8;49666:9;:51::i;:::-;49762:12;;49732:61;;-1:-1:-1;;;49732:61:0;;49647:70;;-1:-1:-1;21001:42:0;;49732:29;;:61;;-1:-1:-1;;;;;49762:12:0;;;;49647:70;;49732:61;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49732:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49732:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49732:61:0;;;;;;;;;-1:-1:-1;;;;;;;49808:17:0;;;;;;:7;:17;;;;;:29;;:64;;-1:-1:-1;;;;;49808:64:0;;;49867:4;49848:23;;49808:64;;-1:-1:-1;;49808:64:0;;;;;;49848:16;-1:-1:-1;19730:1:0;47911:2032;;;;;;:::o;29334:225::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;29441:1;29421:10;:17;:21;29413:30;;;;;;29461:6;29456:96;29477:10;:17;29473:1;:21;29456:96;;;29516:24;29526:10;29537:1;29526:13;;;;;;;29516:24;29496:3;;29456:96;;;;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;29334:225;;:::o;2811:111::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;2886:17;:28;;-1:-1:-1;;;;;;2886:28:0;-1:-1:-1;;;;;2886:28:0;;;;;;;;;;2811:111::o;30071:230::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;30163:16;;30155:29;;;;;;30202:6;30197:97;30218:9;:16;30214:1;:20;30197:97;;;30256:26;30269:9;30279:1;30269:12;;;;;;;;;;;;;;30256;:26::i;:::-;30236:3;;30197:97;;20962:81;21001:42;20962:81;:::o;21052:::-;21091:42;21052:81;:::o;19939:153::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;20015:38;20044:8;20015:28;:38::i;:::-;1393:14;1389:57;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;19939:153;;:::o;47052:303::-;28513:10;28501:23;;;;:11;:23;;;;;;;;28493:53;;;;-1:-1:-1;;;28493:53:0;;;;;;;;;28559:12;28574:5;28580:8;;28574:15;;;;;;;;;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;28574:23:0;;;;;;-1:-1:-1;28649:5:0;;:15;;28574:23;;28655:8;;28649:15;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28682:10;28649:44;;;;;;;;;;28644:174;;28757:4;28710:5;28716:8;;28710:15;;;;;;;;;;;;;;;;;;;;;;;;:32;;;;:23;;;;:32;;;;;28743:10;28710:44;;;;;;;;:51;;-1:-1:-1;;28710:51:0;;;;;;;;;;;28776:5;;:15;;28710:32;28782:8;;28776:15;;;;;;;;;;;;;;;;:30;;;;;;;;;-1:-1:-1;;28776:30:0;;;;;;28644:174;28246:1;28834:5;28840:8;;28834:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:41;;;:108;;;28924:18;;28892:5;28898:8;;28892:15;;;;;;;;;;;;;;;;;;;;;;:28;;;:50;;28834:108;28830:367;;;29053:1;29022:5;29028:8;;29022:15;;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;-1:-1:-1;;29022:32:0;;;;;;;;;;29069:5;;:15;;29022:28;;29075:8;;29069:15;;;;;;;;;;;;;;;;:25;;;-1:-1:-1;;;;;29069:25:0;;;;;;;;;;;;-1:-1:-1;;29069:25:0;;;;;;47224:5;;47210:10;-1:-1:-1;;;;;47224:5:0;;;47210:19;47202:28;;;;;;47247:8;47243:103;47265:3;:10;47261:1;:14;;;47243:103;;;47297:37;47303:3;47307:1;47303:6;;;;;;;;;;;;;;;;47311:5;47317:1;47311:8;;;;;;;;;;;;;;;;47321:9;47331:1;47321:12;;;;;;;;;;;;;;;;47297:5;:37::i;:::-;47277:3;;47243:103;;;;28830:367;;;-1:-1:-1;;;;;;;;;;;29164:10:0;29176:8;;29148:37;;;;;;;;;;;;;;;;;28830:367;47052:303;;;;:::o;39409:18::-;;;;:::o;28302:44::-;;;;;;;;;;;;;;;:::o;20228:200::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;20329:6;20324:97;20345:7;:14;20341:1;:18;20324:97;;;20402:7;20381:6;:18;20388:7;20396:1;20388:10;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20381:18:0;;;;;;;;;;;-1:-1:-1;20381:18:0;:28;;-1:-1:-1;;20381:28:0;;;;;;;;;;-1:-1:-1;20361:3:0;20324:97;;;;20228:200;;:::o;2930:125::-;2993:17;;-1:-1:-1;;;;;2993:17:0;2979:10;:31;2971:40;;;;;;3030:17;;3022:5;:25;;-1:-1:-1;;;;;;3022:25:0;-1:-1:-1;;;;;3030:17:0;;;3022:25;;;;;;2930:125::o;49992:1901::-;50179:10;50170:5;;;;:19;;;;;;;;;;50162:28;;;;;;50203:16;50222:22;50238:5;50222:15;:22::i;:::-;50203:41;;50285:43;50312:4;50319:8;50285:18;:43::i;:::-;50265:16;:63;;50257:72;;;;;;50346:54;;-1:-1:-1;;;50346:54:0;;-1:-1:-1;;50412:2:0;-1:-1:-1;;;;;;;;;;;20823:42:0;50346:29;;:54;;50384:4;;50391:8;;50346:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50346:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50346:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50346:54:0;;;;;;;;;:69;50342:152;;50432:50;;-1:-1:-1;;;50432:50:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;50432:27;;:50;;50460:8;;-1:-1:-1;;50478:2:0;50432:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50432:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50432:50:0;;;;50342:152;50506:17;50526:27;50530:16;50548:4;50526:3;:27::i;:::-;50506:47;-1:-1:-1;50577:7:0;50568:5;;;;:16;;;;;;;;;50564:1213;;;50686:2;50676:13;;50670:20;50785:56;;-1:-1:-1;;;50785:56:0;;50742:26;;;;-1:-1:-1;;;;;;;;;;;20823:42:0;50785:28;;:56;;50814:8;;50742:16;;50785:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50785:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50785:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50785:56:0;;;;;;;;;-1:-1:-1;50858:104:0;;-1:-1:-1;;;50858:104:0;;-1:-1:-1;;;;;50858:27:0;;;;;:104;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;50913:10;;20823:42;;20911;;50952:9;;50858:104;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50858:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;50979:72:0;;-1:-1:-1;;;50979:72:0;;-1:-1:-1;;;;;50979:33:0;;;-1:-1:-1;50979:33:0;;-1:-1:-1;50979:72:0;;-1:-1:-1;;;;;;;;;;;20823:42:0;51034:4;;51041:9;;50979:72;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50979:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50979:72:0;;;;50564:1213;;;;;51101:8;51092:5;;;;:17;;;;;;;;;51088:689;;;51126:108;;-1:-1:-1;;;51126:108:0;;-1:-1:-1;;;;;51126:28:0;;;;;:108;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;-1:-1:-1;;51190:2:0;20823:42;;20911;;51190:2;;51126:108;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51126:108:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51126:108:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51126:108:0;;;;;;;;;;51088:689;;;51265:17;51256:5;;;;:26;;;;;;;;;51252:525;;;51362:21;51387:104;20911:42;-1:-1:-1;;;;;51447:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51447:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51447:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51447:43:0;;;;;;;;;51387:55;51437:4;51387:45;51408:23;:16;51429:1;51408:23;:20;:23;:::i;:::-;51387:16;;:45;:20;:45;:::i;:104::-;51508:115;;-1:-1:-1;;;51508:115:0;;51362:129;;-1:-1:-1;;;;;;51508:28:0;;;;;:115;;-1:-1:-1;;;;;;;;;;;20823:42:0;20911;;51362:129;;20823:42;;20911;;51606:16;;51508:115;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51508:115:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51508:115:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51508:115:0;;;;;;;;;;51252:525;;51833:52;51865:8;51875:9;51833:31;:52::i;18801:239::-;2508:5;;-1:-1:-1;;;;;2508:5:0;2494:10;:19;2486:28;;;;;;-1:-1:-1;;;;;18882:21:0;;18878:155;;18920:5;;:22;;-1:-1:-1;;;;;18920:5:0;;;;:22;;;;;18935:6;;18920:5;:22;:5;:22;18935:6;18920:5;:22;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;18878:155:0;19007:5;;18975:46;;-1:-1:-1;;;;;18975:31:0;;;;19007:5;19014:6;18975:46;:31;:46;:::i;39434:27::-;;;-1:-1:-1;;;;;39434:27:0;;:::o;39361:39::-;;;-1:-1:-1;;;;;39361:39:0;;:::o;30548:246::-;-1:-1:-1;;;;;30616:21:0;;;;;;:11;:21;;;;;;;;30608:30;;;;;;30678:1;30657:18;;:22;30649:31;;;;;;-1:-1:-1;;;;;30716:21:0;30740:5;30716:21;;;:11;:21;;;;;:29;;-1:-1:-1;;30716:29:0;;;30756:18;:20;;-1:-1:-1;;30756:20:0;;;30548:246::o;5309:434::-;5367:7;5612:6;5608:47;;-1:-1:-1;5642:1:0;5635:8;;5608:47;5679:5;;;5683:1;5679;:5;:1;5703:5;;;;;:10;5695:19;;;;;;5734:1;-1:-1:-1;5309:434:0;;;;;:::o;4002:150::-;4060:7;4092:5;;;4116:6;;;;4108:15;;;;;6211:132;6269:7;6296:39;6300:1;6303;6296:39;;;;;;;;;;;;;;;;;:3;:39::i;21340:104::-;21424:5;;;21419:16;;;;21411:25;;;;;21230:104;21314:5;;;21309:16;;;;21301:25;;;;;17912:261;17990:7;-1:-1:-1;;;;;18014:21:0;;;;:45;;-1:-1:-1;;;;;;18039:20:0;;16300:42;18039:20;18014:45;18010:156;;;-1:-1:-1;;;;;;18083:11:0;;;18076:18;;18010:156;18134:20;;-1:-1:-1;;;18134:20:0;;-1:-1:-1;;;;;18134:15:0;;;;;:20;;18150:3;;18134:20;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18134:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18134:20:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18134:20:0;;;;;;;;;18127:27;;;;30346:194;-1:-1:-1;;;;;30413:22:0;;;;;;:11;:22;;;;;;;;30412:23;30404:32;;;;;;-1:-1:-1;;;;;30472:22:0;;;;;:11;:22;;;;;:29;;-1:-1:-1;;30472:29:0;30497:4;30472:29;;;;;;30512:18;:20;;;;;;;30346:194::o;17271:633::-;17382:11;17378:50;;17410:7;;17378:50;-1:-1:-1;;;;;17444:21:0;;;;:45;;-1:-1:-1;;;;;;17469:20:0;;16300:42;17469:20;17444:45;17440:457;;;-1:-1:-1;;;;;17514:18:0;;17522:10;17514:18;:41;;;;;17549:6;17536:9;:19;;17514:41;17506:71;;;;-1:-1:-1;;;17506:71:0;;;;;;;;;-1:-1:-1;;;;;17596:19:0;;17610:4;17596:19;17592:97;;17636:37;;-1:-1:-1;;;;;17636:29:0;;;:37;;;;;17666:6;;17636:37;;;;17666:6;17636:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17636:37:0;17592:97;17719:6;17707:9;:18;17703:110;;;17746:10;:51;17766:30;17774:9;17789:6;17766:30;:22;:30;:::i;:::-;17746:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;17703:110:0;17440:457;;;17845:40;-1:-1:-1;;;;;17845:22:0;;17868:4;17874:2;17878:6;17845:40;:22;:40;:::i;1540:508::-;1957:4;2003:17;2035:7;1540:508;:::o;19810:121::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;19862:30;:28;:30::i;29245:81::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;29297:21;29307:10;29297:9;:21::i;52927:1441::-;53085:4;53104:19;53143:42;53104:82;;-1:-1:-1;;53226:10:0;-1:-1:-1;;;;;53226:20:0;;53255:4;53270:2;-1:-1:-1;;;;;53270:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53270:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53270:12:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53270:12:0;;;;;;;;;53226:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53226:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53226:58:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53226:58:0;;;;;;;;;:73;53222:160;;53316:10;-1:-1:-1;;;;;53316:18:0;;53343:2;-1:-1:-1;;;;;53343:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53343:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53343:12:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53343:12:0;;;;;;;;;-1:-1:-1;;53316:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53316:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53316:54:0;;;;53222:160;53394:21;53418:44;-1:-1:-1;;;;;53418:29:0;;53456:4;53418:44;:29;:44;:::i;:::-;53394:68;-1:-1:-1;53473:19:0;53495:42;-1:-1:-1;;;;;53495:27:0;;53531:4;53495:42;:27;:42;:::i;:::-;53473:64;;53701:16;53888:2;53885:1;53877:5;53871:12;53864:4;53857:5;53853:16;53850:1;53846:2;53839:4;53834:3;53830:14;53825:66;-1:-1:-1;;53923:1:0;53917:8;54059:16;54036:19;53989:44;-1:-1:-1;;;;;53989:29:0;;54027:4;53989:44;:29;:44;:::i;:::-;:66;:86;;53981:115;;;;-1:-1:-1;;;53981:115:0;;;;;;;;;54109:25;54137:42;-1:-1:-1;;;;;54137:27:0;;54173:4;54137:42;:27;:42;:::i;:::-;54109:70;;54236:17;54219:14;:34;54198:17;:55;;54190:84;;;;-1:-1:-1;;;54190:84:0;;;;;;;;;54294:38;54298:17;54317:14;54294:3;:38::i;:::-;54287:45;52927:1441;-1:-1:-1;;;;;;;;;;;52927:1441:0:o;52553:366::-;52642:7;52662:17;52759:3;52749:7;52742:3;;52734:22;:28;;;;;;;-1:-1:-1;52777:13:0;;52773:96;;52840:5;;52807:50;;-1:-1:-1;;;;;52807:32:0;;;;52840:5;52847:9;52807:50;:32;:50;:::i;:::-;52888:23;52892:7;52901:9;52888:3;:23::i;:::-;52881:30;52553:366;-1:-1:-1;;;;;52553:366:0:o;16352:140::-;16441:43;16459:5;16466:2;16470:6;16478:5;16441:17;:43::i;22204:113::-;22257:6;22018:8;22280:23;22284:9;22288:1;22291;22284:3;:9::i;:::-;22295:7;22280:3;:23::i;:::-;:29;;;;;;;22204:113;-1:-1:-1;;;22204:113:0:o;2701:100::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;2777:5;:16;;-1:-1:-1;;;;;;2777:16:0;-1:-1:-1;;;;;2777:16:0;;;;;1389:57;;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;2701:100;;:::o;52114:397::-;52209:16;52351:2;52348:1;52340:5;52334:12;52327:4;52320:5;52316:16;52305:9;52300:3;52293:4;52288:3;52284:14;52279:75;52386:1;52380:8;52368:20;;52416:9;52409:17;52445:1;52440:53;;;;52402:91;;52440:53;52476:1;52473;52466:12;51948:158;52084:2;52076:11;52070:18;;52047:52::o;27641:259::-;27726:7;27761:26;:24;:26::i;:::-;-1:-1:-1;;;;;27749:38:0;:8;-1:-1:-1;;;;;27749:38:0;;27746:92;;;-1:-1:-1;;;;;;27811:15:0;;;27804:22;;27746:92;27857:35;;-1:-1:-1;;;27857:35:0;;-1:-1:-1;;;;;27857:26:0;;;;;:35;;27884:7;;27857:35;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27857:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27857:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;27857:35:0;;;;;;;;26866:254;26962:20;26654:42;-1:-1:-1;;;;;26985:73:0;;:75;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26985:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26985:75:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26985:75:0;;;;;;;;;26962:98;;27071:41;27088:4;27094:8;27104:7;27071:16;:41::i;6873:345::-;6959:7;7061:12;7054:5;7046:28;;;;-1:-1:-1;;;7046:28:0;;;;;;;;;;;7085:9;7101:1;7097;:5;;;;;;;6873:345;-1:-1:-1;;;;;6873:345:0:o;4427:102::-;4485:7;4512:9;4516:1;4519;4512:3;:9::i;13133:204::-;13260:68;;13234:95;;13253:5;;-1:-1:-1;;;13283:27:0;13260:68;;13312:4;;13318:2;;13322:5;;13260:68;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;13260:68:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;13260:68:0;;;179:29:-1;;;;160:49;;;13234:18:0;:95::i;2615:78::-;1189:12;;;;;;;;:31;;;1205:15;:13;:15::i;:::-;1189:47;;;-1:-1:-1;1225:11:0;;;;1224:12;1189:47;1181:56;;;;;;1246:19;1269:12;;;;;;1268:13;1288:83;;;;1317:12;:19;;-1:-1:-1;;;;1317:19:0;;;;;1345:18;1332:4;1345:18;;;1288:83;2667:5;:18;;-1:-1:-1;;;;;;2667:18:0;2675:10;2667:18;;;1389:57;;;;1433:5;1418:20;;-1:-1:-1;;1418:20:0;;;2615:78;:::o;16500:553::-;16600:4;16621:11;16617:55;;-1:-1:-1;16656:4:0;16649:11;;16617:55;-1:-1:-1;;;;;16688:21:0;;;;:45;;-1:-1:-1;;;;;;16713:20:0;;16300:42;16713:20;16688:45;16684:362;;;16754:7;16750:196;;;16789:33;;-1:-1:-1;;;;;16789:25:0;;;:33;;;;;16815:6;;16789:33;;;;16815:6;16789:25;:33;;;;;;;16782:40;;;;16750:196;16863:37;;-1:-1:-1;;;;;16863:29:0;;;:37;;;;;16893:6;;16863:37;;;;16893:6;16863:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16863:37:0;16926:4;16919:11;;;;16684:362;16978:30;-1:-1:-1;;;;;16978:18:0;;16997:2;17001:6;16978:30;:18;:30;:::i;:::-;-1:-1:-1;17030:4:0;17023:11;;21450:118;21502:6;21529;;;:30;;-1:-1:-1;;21544:5:0;;;21558:1;21553;21544:5;21553:1;21539:15;;;;;:20;21529:30;21521:39;;;;;26126:121;26197:42;26126:121;:::o;27128:505::-;27249:26;:24;:26::i;:::-;-1:-1:-1;;;;;27237:38:0;:8;-1:-1:-1;;;;;27237:38:0;;27234:327;;;27292:31;27342:12;27292:64;;27414:11;27431:15;-1:-1:-1;;;;;27431:20:0;27458:7;27431:39;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;27413:57:0;;;27495:6;27487:41;;;;-1:-1:-1;;;27487:41:0;;;;;;;;;27543:7;;;;27234:327;27573:52;-1:-1:-1;;;;;27573:29:0;;27603:12;27617:7;27573:52;:29;:52;:::i;14862:997::-;15466:27;15474:5;-1:-1:-1;;;;;15466:25:0;;:27::i;:::-;15458:36;;;;;;15568:12;15582:23;15617:5;-1:-1:-1;;;;;15609:19:0;15629:4;15609:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15567:67:0;;;;15653:7;15645:16;;;;;;15678:17;;:21;15674:178;;15820:10;15809:30;;;;;;;;;;;;;;15801:39;;;;;12949:176;13058:58;;13032:85;;13051:5;;-1:-1:-1;;;13081:23:0;13058:58;;13106:2;;13110:5;;13058:58;;;;9111:810;9171:4;9830:20;;9673:66;9870:15;;;;;:42;;-1:-1:-1;9889:23:0;;;9862:51;-1:-1:-1;;9111:810:0:o;5:130:-1:-;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;611:707;;728:3;721:4;713:6;709:17;705:27;695:2;;746:1;743;736:12;695:2;783:6;770:20;805:80;820:64;877:6;820:64;;;805:80;;;796:89;;902:5;927:6;920:5;913:21;957:4;949:6;945:17;935:27;;979:4;974:3;970:14;963:21;;1032:6;1079:3;1071:4;1063:6;1059:17;1054:3;1050:27;1047:36;1044:2;;;1096:1;1093;1086:12;1044:2;1121:1;1106:206;1131:6;1128:1;1125:13;1106:206;;;1189:3;1211:37;1244:3;1232:10;1211:37;;;1199:50;;-1:-1;1272:4;1263:14;;;;1291;;;;;1153:1;1146:9;1106:206;;;1110:14;688:630;;;;;;;;1352:731;;1477:3;1470:4;1462:6;1458:17;1454:27;1444:2;;1495:1;1492;1485:12;1444:2;1532:6;1519:20;1554:88;1569:72;1634:6;1569:72;;1554:88;1545:97;;1659:5;1684:6;1677:5;1670:21;1714:4;1706:6;1702:17;1692:27;;1736:4;1731:3;1727:14;1720:21;;1789:6;1836:3;1828:4;1820:6;1816:17;1811:3;1807:27;1804:36;1801:2;;;1853:1;1850;1843:12;1801:2;1878:1;1863:214;1888:6;1885:1;1882:13;1863:214;;;1946:3;1968:45;2009:3;1997:10;1968:45;;;1956:58;;-1:-1;2037:4;2028:14;;;;2056;;;;;1910:1;1903:9;1863:214;;2107:693;;2229:3;2222:4;2214:6;2210:17;2206:27;2196:2;;2247:1;2244;2237:12;2196:2;2284:6;2271:20;2306:85;2321:69;2383:6;2321:69;;2306:85;2419:21;;;2463:4;2451:17;;;;2297:94;;-1:-1;2476:14;;2451:17;2571:1;2556:238;2581:6;2578:1;2575:13;2556:238;;;2664:3;2651:17;2643:6;2639:30;2688:42;2726:3;2714:10;2688:42;;;2676:55;;-1:-1;2754:4;2745:14;;;;2773;;;;;2603:1;2596:9;2556:238;;2826:707;;2943:3;2936:4;2928:6;2924:17;2920:27;2910:2;;2961:1;2958;2951:12;2910:2;2998:6;2985:20;3020:80;3035:64;3092:6;3035:64;;3020:80;3011:89;;3117:5;3142:6;3135:5;3128:21;3172:4;3164:6;3160:17;3150:27;;3194:4;3189:3;3185:14;3178:21;;3247:6;3294:3;3286:4;3278:6;3274:17;3269:3;3265:27;3262:36;3259:2;;;3311:1;3308;3301:12;3259:2;3336:1;3321:206;3346:6;3343:1;3340:13;3321:206;;;3404:3;3426:37;3459:3;3447:10;3426:37;;;3414:50;;-1:-1;3487:4;3478:14;;;;3506;;;;;3368:1;3361:9;3321:206;;3541:124;3605:20;;3630:30;3605:20;3630:30;;3672:128;3747:13;;3765:30;3747:13;3765:30;;3808:432;;3905:3;3898:4;3890:6;3886:17;3882:27;3872:2;;3923:1;3920;3913:12;3872:2;3960:6;3947:20;3982:60;3997:44;4034:6;3997:44;;3982:60;3973:69;;4062:6;4055:5;4048:21;4098:4;4090:6;4086:17;4131:4;4124:5;4120:16;4166:3;4157:6;4152:3;4148:16;4145:25;4142:2;;;4183:1;4180;4173:12;4142:2;4193:41;4227:6;4222:3;4217;4193:41;;;3865:375;;;;;;;;4697:130;4764:20;;4789:33;4764:20;4789:33;;4834:134;4912:13;;4930:33;4912:13;4930:33;;4975:241;;5079:2;5067:9;5058:7;5054:23;5050:32;5047:2;;;5095:1;5092;5085:12;5047:2;5130:1;5147:53;5192:7;5172:9;5147:53;;5223:263;;5338:2;5326:9;5317:7;5313:23;5309:32;5306:2;;;5354:1;5351;5344:12;5306:2;5389:1;5406:64;5462:7;5442:9;5406:64;;6043:617;;;;;6198:3;6186:9;6177:7;6173:23;6169:33;6166:2;;;6215:1;6212;6205:12;6166:2;6250:1;6267:53;6312:7;6292:9;6267:53;;;6257:63;;6229:97;6357:2;6375:53;6420:7;6411:6;6400:9;6396:22;6375:53;;;6365:63;;6336:98;6465:2;6483:53;6528:7;6519:6;6508:9;6504:22;6483:53;;;6473:63;;6444:98;6573:2;6591:53;6636:7;6627:6;6616:9;6612:22;6591:53;;;6581:63;;6552:98;6160:500;;;;;;;;6667:743;;;;;;6839:3;6827:9;6818:7;6814:23;6810:33;6807:2;;;6856:1;6853;6846:12;6807:2;6891:1;6908:53;6953:7;6933:9;6908:53;;;6898:63;;6870:97;6998:2;7016:53;7061:7;7052:6;7041:9;7037:22;7016:53;;;7006:63;;6977:98;7106:2;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;;;7114:63;;7085:98;7214:2;7232:53;7277:7;7268:6;7257:9;7253:22;7232:53;;;7222:63;;7193:98;7322:3;7341:53;7386:7;7377:6;7366:9;7362:22;7341:53;;;7331:63;;7301:99;6801:609;;;;;;;;;7417:360;;;7535:2;7523:9;7514:7;7510:23;7506:32;7503:2;;;7551:1;7548;7541:12;7503:2;7586:1;7603:53;7648:7;7628:9;7603:53;;;7593:63;;7565:97;7693:2;7711:50;7753:7;7744:6;7733:9;7729:22;7711:50;;;7701:60;;7672:95;7497:280;;;;;;7784:366;;;7905:2;7893:9;7884:7;7880:23;7876:32;7873:2;;;7921:1;7918;7911:12;7873:2;7956:1;7973:53;8018:7;7998:9;7973:53;;;7963:63;;7935:97;8063:2;8081:53;8126:7;8117:6;8106:9;8102:22;8081:53;;8157:721;;;;;8321:3;8309:9;8300:7;8296:23;8292:33;8289:2;;;8338:1;8335;8328:12;8289:2;8373:1;8390:53;8435:7;8415:9;8390:53;;;8380:63;;8352:97;8480:2;8498:53;8543:7;8534:6;8523:9;8519:22;8498:53;;;8488:63;;8459:98;8588:2;8606:53;8651:7;8642:6;8631:9;8627:22;8606:53;;;8596:63;;8567:98;8724:2;8713:9;8709:18;8696:32;-1:-1;;;;;8740:6;8737:30;8734:2;;;8780:1;8777;8770:12;8734:2;8800:62;8854:7;8845:6;8834:9;8830:22;8800:62;;8885:377;;9014:2;9002:9;8993:7;8989:23;8985:32;8982:2;;;9030:1;9027;9020:12;8982:2;9065:31;;-1:-1;;;;;9105:30;;9102:2;;;9148:1;9145;9138:12;9102:2;9168:78;9238:7;9229:6;9218:9;9214:22;9168:78;;9269:496;;;9412:2;9400:9;9391:7;9387:23;9383:32;9380:2;;;9428:1;9425;9418:12;9380:2;9463:31;;-1:-1;;;;;9503:30;;9500:2;;;9546:1;9543;9536:12;9500:2;9566:78;9636:7;9627:6;9616:9;9612:22;9566:78;;9772:925;;;;9998:2;9986:9;9977:7;9973:23;9969:32;9966:2;;;10014:1;10011;10004:12;9966:2;10049:31;;-1:-1;;;;;10089:30;;10086:2;;;10132:1;10129;10122:12;10086:2;10152:86;10230:7;10221:6;10210:9;10206:22;10152:86;;;10142:96;;10028:216;10303:2;10292:9;10288:18;10275:32;-1:-1;;;;;10319:6;10316:30;10313:2;;;10359:1;10356;10349:12;10313:2;10379:83;10454:7;10445:6;10434:9;10430:22;10379:83;;;10369:93;;10254:214;10527:2;10516:9;10512:18;10499:32;-1:-1;;;;;10543:6;10540:30;10537:2;;;10583:1;10580;10573:12;10537:2;10603:78;10673:7;10664:6;10653:9;10649:22;10603:78;;;10593:88;;10478:209;9960:737;;;;;;10704:257;;10816:2;10804:9;10795:7;10791:23;10787:32;10784:2;;;10832:1;10829;10822:12;10784:2;10867:1;10884:61;10937:7;10917:9;10884:61;;10968:337;;11077:2;11065:9;11056:7;11052:23;11048:32;11045:2;;;11093:1;11090;11083:12;11045:2;11128:31;;-1:-1;;;;;11168:30;;11165:2;;;11211:1;11208;11201:12;11165:2;11231:58;11281:7;11272:6;11261:9;11257:22;11231:58;;11312:241;;11416:2;11404:9;11395:7;11391:23;11387:32;11384:2;;;11432:1;11429;11422:12;11384:2;11467:1;11484:53;11529:7;11509:9;11484:53;;11560:263;;11675:2;11663:9;11654:7;11650:23;11646:32;11643:2;;;11691:1;11688;11681:12;11643:2;11726:1;11743:64;11799:7;11779:9;11743:64;;11830:491;;;;11968:2;11956:9;11947:7;11943:23;11939:32;11936:2;;;11984:1;11981;11974:12;11936:2;12019:1;12036:53;12081:7;12061:9;12036:53;;;12026:63;;11998:97;12126:2;12144:53;12189:7;12180:6;12169:9;12165:22;12144:53;;;12134:63;;12105:98;12234:2;12252:53;12297:7;12288:6;12277:9;12273:22;12252:53;;12329:173;;12416:46;12458:3;12450:6;12416:46;;;-1:-1;;12491:4;12482:14;;12409:93;12510:142;12601:45;12640:5;12601:45;;;12596:3;12589:58;12583:69;;;12659:137;12758:32;12784:5;12758:32;;13033:152;13134:45;13154:24;13172:5;13154:24;;;13134:45;;13223:690;;13368:54;13416:5;13368:54;;;13435:86;13514:6;13509:3;13435:86;;;13428:93;;13542:56;13592:5;13542:56;;;13618:7;13646:1;13631:260;13656:6;13653:1;13650:13;13631:260;;;13723:6;13717:13;13744:63;13803:3;13788:13;13744:63;;;13737:70;;13824:60;13877:6;13824:60;;;13814:70;-1:-1;;13678:1;13671:9;13631:260;;;-1:-1;13904:3;;13347:566;-1:-1;;;;;13347:566;13921:104;13998:21;14013:5;13998:21;;14055:297;;14169:70;14232:6;14227:3;14169:70;;;14162:77;;14251:43;14287:6;14282:3;14275:5;14251:43;;;14316:29;14338:6;14316:29;;;14307:39;;;;14155:197;-1:-1;;;14155:197;14383:310;;14515:88;14596:6;14591:3;14515:88;;;14508:95;;14615:43;14651:6;14646:3;14639:5;14615:43;;;-1:-1;;14671:16;;14501:192;14701:343;;14811:38;14843:5;14811:38;;;14861:70;14924:6;14919:3;14861:70;;;14854:77;;14936:52;14981:6;14976:3;14969:4;14962:5;14958:16;14936:52;;;15009:29;15031:6;15009:29;;15051:356;;15179:38;15211:5;15179:38;;;15229:88;15310:6;15305:3;15229:88;;;15222:95;;15322:52;15367:6;15362:3;15355:4;15348:5;15344:16;15322:52;;;15386:16;;;;;15159:248;-1:-1;;15159:248;15414:176;15522:62;15578:5;15522:62;;15952:317;;16112:67;16176:2;16171:3;16112:67;;;-1:-1;;;16192:40;;16260:2;16251:12;;16098:171;-1:-1;;16098:171;16278:316;;16438:67;16502:2;16497:3;16438:67;;;-1:-1;;;16518:39;;16585:2;16576:12;;16424:170;-1:-1;;16424:170;16603:317;;16763:67;16827:2;16822:3;16763:67;;;-1:-1;;;16843:40;;16911:2;16902:12;;16749:171;-1:-1;;16749:171;16929:377;;17089:67;17153:2;17148:3;17089:67;;;17189:34;17169:55;;-1:-1;;;17253:2;17244:12;;17237:32;17297:2;17288:12;;17075:231;-1:-1;;17075:231;17315:322;;17475:67;17539:2;17534:3;17475:67;;;-1:-1;;;17555:45;;17628:2;17619:12;;17461:176;-1:-1;;17461:176;17646:316;;17806:67;17870:2;17865:3;17806:67;;;-1:-1;;;17886:39;;17953:2;17944:12;;17792:170;-1:-1;;17792:170;17971:324;;18131:67;18195:2;18190:3;18131:67;;;18231:26;18211:47;;18286:2;18277:12;;18117:178;-1:-1;;18117:178;18304:296;;18481:83;18562:1;18557:3;18481:83;;18608:110;18689:23;18706:5;18689:23;;18725:113;18808:24;18826:5;18808:24;;18845:152;18946:45;18966:24;18984:5;18966:24;;;18946:45;;19004:110;19085:23;19102:5;19085:23;;19121:244;;19240:75;19311:3;19302:6;19240:75;;;-1:-1;19337:2;19328:12;;19228:137;-1:-1;19228:137;19372:383;;19519:75;19590:3;19581:6;19519:75;;;19616:2;19611:3;19607:12;19600:19;;19630:75;19701:3;19692:6;19630:75;;;-1:-1;19727:2;19718:12;;19507:248;-1:-1;;19507:248;19762:282;;19916:103;20015:3;20006:6;19998;19916:103;;20051:262;;20195:93;20284:3;20275:6;20195:93;;20320:370;;20518:147;20661:3;20518:147;;20697:213;20815:2;20800:18;;20829:71;20804:9;20873:6;20829:71;;20917:229;21043:2;21028:18;;21057:79;21032:9;21109:6;21057:79;;21405:340;21559:2;21544:18;;21573:79;21548:9;21625:6;21573:79;;;21663:72;21731:2;21720:9;21716:18;21707:6;21663:72;;21752:467;21942:2;21927:18;;21956:79;21931:9;22008:6;21956:79;;;22046:80;22122:2;22111:9;22107:18;22098:6;22046:80;;;22137:72;22205:2;22194:9;22190:18;22181:6;22137:72;;22226:647;22454:3;22439:19;;22469:79;22443:9;22521:6;22469:79;;;22559:72;22627:2;22616:9;22612:18;22603:6;22559:72;;;22642;22710:2;22699:9;22695:18;22686:6;22642:72;;;22762:9;22756:4;22752:20;22747:2;22736:9;22732:18;22725:48;22787:76;22858:4;22849:6;22787:76;;;22779:84;22425:448;-1:-1;;;;;;22425:448;22880:444;23062:2;23047:18;;23076:79;23051:9;23128:6;23076:79;;;23203:9;23197:4;23193:20;23188:2;23177:9;23173:18;23166:48;23228:86;23309:4;23300:6;23292;23228:86;;23331:340;23485:2;23470:18;;23499:79;23474:9;23551:6;23499:79;;;23589:72;23657:2;23646:9;23642:18;23633:6;23589:72;;23678:451;23860:2;23845:18;;23874:71;23849:9;23918:6;23874:71;;24136:435;24310:2;24295:18;;24324:71;24299:9;24368:6;24324:71;;;24406:72;24474:2;24463:9;24459:18;24450:6;24406:72;;24578:771;24836:3;24821:19;;24851:71;24825:9;24895:6;24851:71;;;24933:72;25001:2;24990:9;24986:18;24977:6;24933:72;;;25016;25084:2;25073:9;25069:18;25060:6;25016:72;;;25099;25167:2;25156:9;25152:18;25143:6;25099:72;;;25182:73;25250:3;25239:9;25235:19;25226:6;25182:73;;;25266;25334:3;25323:9;25319:19;25310:6;25266:73;;;24807:542;;;;;;;;;;25356:324;25502:2;25487:18;;25516:71;25491:9;25560:6;25516:71;;25687:755;25937:3;25922:19;;25952:71;25926:9;25996:6;25952:71;;;26034:72;26102:2;26091:9;26087:18;26078:6;26034:72;;;26117:70;26183:2;26172:9;26168:18;26159:6;26117:70;;;26198;26264:2;26253:9;26249:18;26240:6;26198:70;;;26279:71;26345:3;26334:9;26330:19;26321:6;26279:71;;;26361;26427:3;26416:9;26412:19;26403:6;26361:71;;26449:361;26617:2;26631:47;;;26602:18;;26692:108;26602:18;26786:6;26692:108;;26817:201;26929:2;26914:18;;26943:65;26918:9;26981:6;26943:65;;27025:263;27168:2;27153:18;;27182:96;27157:9;27251:6;27182:96;;27295:301;27433:2;27447:47;;;27418:18;;27508:78;27418:18;27572:6;27508:78;;27603:407;27794:2;27808:47;;;27779:18;;27869:131;27779:18;27869:131;;28017:407;28208:2;28222:47;;;28193:18;;28283:131;28193:18;28283:131;;28431:407;28622:2;28636:47;;;28607:18;;28697:131;28607:18;28697:131;;28845:407;29036:2;29050:47;;;29021:18;;29111:131;29021:18;29111:131;;29259:407;29450:2;29464:47;;;29435:18;;29525:131;29435:18;29525:131;;29673:407;29864:2;29878:47;;;29849:18;;29939:131;29849:18;29939:131;;30087:407;30278:2;30292:47;;;30263:18;;30353:131;30263:18;30353:131;;30501:316;30643:2;30628:18;;30657:69;30632:9;30699:6;30657:69;;;30737:70;30803:2;30792:9;30788:18;30779:6;30737:70;;30824:213;30942:2;30927:18;;30956:71;30931:9;31000:6;30956:71;;31044:324;31190:2;31175:18;;31204:71;31179:9;31248:6;31204:71;;31375:256;31437:2;31431:9;31463:17;;;-1:-1;;;;;31523:34;;31559:22;;;31520:62;31517:2;;;31595:1;31592;31585:12;31517:2;31611;31604:22;31415:216;;-1:-1;31415:216;31638:304;;-1:-1;;;;;31789:6;31786:30;31783:2;;;31829:1;31826;31819:12;31783:2;-1:-1;31864:4;31852:17;;;31917:15;;31720:222;32895:317;;-1:-1;;;;;33026:6;33023:30;33020:2;;;33066:1;33063;33056:12;33020:2;-1:-1;33197:4;33133;33110:17;;;;-1:-1;;33106:33;33187:15;;32957:255;33547:151;33671:4;33662:14;;33619:79;33705:137;33808:12;;33779:63;34222:178;34340:19;;;34389:4;34380:14;;34333:67;34580:144;34715:3;34693:31;-1:-1;34693:31;34904:91;;34966:24;34984:5;34966:24;;35108:85;35174:13;35167:21;;35150:43;35200:84;35272:6;35261:18;;35244:40;35291:121;-1:-1;;;;;35353:54;;35336:76;35419:72;35481:5;35464:27;35498:96;-1:-1;;;;;35559:30;;35542:52;35601:129;;35688:37;35719:5;35737:171;;35841:62;35897:5;35841:62;;36299:145;36380:6;36375:3;36370;36357:30;-1:-1;36436:1;36418:16;;36411:27;36350:94;36453:268;36518:1;36525:101;36539:6;36536:1;36533:13;36525:101;;;36606:11;;;36600:18;36587:11;;;36580:39;36561:2;36554:10;36525:101;;;36641:6;36638:1;36635:13;36632:2;;;-1:-1;;36706:1;36688:16;;36681:27;36502:219;36729:95;;36793:26;36813:5;36831:89;36895:20;36909:5;36895:20;;37008:97;37096:2;37076:14;-1:-1;;37072:28;;37056:49;37113:94;37187:2;37183:14;;37155:52;37215:117;37284:24;37302:5;37284:24;;;37277:5;37274:35;37264:2;;37323:1;37320;37313:12;37479:111;37545:21;37560:5;37545:21;;37597:117;37666:24;37684:5;37666:24;
Swarm Source
bzzr://1abc07de78abf7fd8cc19004160c96eb2d1bedc83a27e9173131adee7a8ecf90
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.