Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 10886012 | 1489 days ago | IN | 0 ETH | 1.12973792 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FortubeGovernance
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-20 */ pragma solidity >=0.6.2; pragma experimental ABIEncoderV2; // SPDX-License-Identifier: MIT /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // SPDX-License-Identifier: MIT /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // SPDX-License-Identifier: MIT /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // SPDX-License-Identifier: MIT /** * @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, "SafeMath: addition overflow"); 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, "SafeMath: subtraction overflow"); } /** * @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. */ 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, "SafeMath: multiplication overflow"); 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // SPDX-License-Identifier: MIT /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // SPDX-License-Identifier: MIT /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // 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 != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // SPDX-License-Identifier: MIT /** * @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 IERC20;` 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(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 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), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 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(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _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(IERC20 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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { bool private _notEntered; constructor() internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } function ReentrancyGuardInitialize() internal { _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } /** * @title VersionedInitializable * * @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. * * @author Aave, inspired by the OpenZeppelin Initializable contract */ abstract contract VersionedInitializable { /** * @dev Indicates that the contract has been initialized. */ uint256 private lastInitializedRevision = 0; /** * @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() { uint256 revision = getRevision(); require( initializing || isConstructor() || revision > lastInitializedRevision, "Contract instance has already been initialized" ); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; lastInitializedRevision = revision; } _; if (isTopLevelCall) { initializing = false; } } /// @dev returns the revision number of the contract. /// Needs to be defined in the inherited class as a constant. function getRevision() internal virtual pure returns (uint256); /// @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. uint256 cs; //solium-disable-next-line assembly { cs := extcodesize(address()) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[16] private ______gap; } // /** // *Submitted for verification at Etherscan.io on 2020-07-29 // */ // /* // ____ __ __ __ _ // / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ // _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / // /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ // /___/ // * Synthetix: YFIRewards.sol // * // * Docs: https://docs.synthetix.io/ // * // * // * MIT License // * =========== // * // * Copyright (c) 2020 Synthetix // * // * Permission is hereby granted, free of charge, to any person obtaining a copy // * of this software and associated documentation files (the "Software"), to deal // * in the Software without restriction, including without limitation the rights // * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // * copies of the Software, and to permit persons to whom the Software is // * furnished to do so, subject to the following conditions: // * // * The above copyright notice and this permission notice shall be included in all // * copies or substantial portions of the Software. // * // * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // */ interface Executor { function execute( uint256, uint256, uint256, uint256 ) external; } contract FortubeGovernance is ReentrancyGuard, VersionedInitializable { using SafeMath for uint256; using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; event RegisterVoter(address voter, uint256 votes, uint256 totalVotes); event RevokeVoter(address voter, uint256 votes, uint256 totalVotes); event NewProposal( uint256 id, address creator, uint256 start, uint256 duration, address executor ); event Vote( uint256 indexed id, address indexed voter, bool vote, uint256 weight ); event ProposalFinished( uint256 indexed id, uint256 _for, uint256 _against, bool quorumReached ); event Staked(address indexed user, bytes32 select, uint256 amount, uint256 supply); event Withdrawn(address indexed user, bytes32 receipt); struct Select { uint256 duration; uint256 exrate; //GFOR生成比率 uint256 reward; //FOR的周期收益率 uint256 __RESERVED__0; uint256 __RESERVED__1; uint256 __RESERVED__2; } struct Staking { address account; uint256 amount; uint256 start; uint256 duration; uint256 exrate; uint256 reward; // uint256 supply; uint256 __RESERVED__0; uint256 __RESERVED__1; uint256 __RESERVED__2; } struct Proposal { uint256 id; address proposer; mapping(address => uint256) forVotes; mapping(address => uint256) againstVotes; uint256 totalForVotes; uint256 totalAgainstVotes; uint256 start; // block start; uint256 end; // start + period address executor; string hash; uint256 totalVotesAvailable; uint256 quorum; uint256 quorumRequired; bool open; } //vote required mapping(uint256 => Proposal) public proposals; mapping(address => uint256) public votes; mapping(address => bool) public voters; mapping(address => uint256) public voteLock; // period that your sake it locked to keep it for voting uint256 public totalVotes; uint256 public proposalCount; uint256 public period; // voting period in blocks uint256 public lock; // vote lock in block uint256 public minimum; uint256 public quorum; //system required bool public breaker = false; address public governance; address public staketoken; address public rewarder; //奖励支付者 //ERC20 required uint8 public decimals; string public name; string public symbol; uint256 private _totalSupply; uint256 private _totalStake; //stake required mapping(bytes32 => Select) private _selects; //锁仓选项 mapping(address => uint256) private _stakes; //锁仓额度 mapping(address => uint256) private _balances; //GFOR额度 mapping(address => bytes32[]) private _receipts; //锁仓记录回执 mapping(bytes32 => Staking) private _stakings; //锁仓记录 uint256 private _stakeNonce = 0; //initializer required function getRevision() internal override pure returns (uint256) { return uint256(0x1); } function initialize( address _governance, address _staketoken, address _rewarder ) public initializer { ReentrancyGuard.ReentrancyGuardInitialize(); governance = _governance; staketoken = _staketoken; rewarder = _rewarder; decimals = 18; name = "ForTube Governance Token"; symbol = "GFOR"; } function totalStake() public view returns (uint256) { return _totalStake; } function totalSupply() public view returns (uint256) { return _totalSupply; } function stakeOf(address account) public view returns (uint256) { return _stakes[account]; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function receipts(address account) public view returns (bytes32[] memory) { return _receipts[account]; } function staking(bytes32 receipt) public view returns (Staking memory) { return _stakings[receipt]; } function getSelect(bytes32 select) public view returns (Select memory) { return _selects[select]; } /* Fee collection for any other token */ function seize(address _token, uint256 amount) external { require(msg.sender == governance, "!governance"); require(_token != staketoken, "can not staketoken"); IERC20(_token).safeTransfer(governance, amount); } /* Fees breaker, to protect withdraws if anything ever goes wrong */ function setBreaker(bool _breaker) external { require(msg.sender == governance, "!governance"); breaker = _breaker; } /* Modifications for proposals */ function setGovernance(address _governance) public { require(msg.sender == governance, "!governance"); governance = _governance; } function setQuorum(uint256 _quorum) public { require(msg.sender == governance, "!governance"); quorum = _quorum; } function setMinimum(uint256 _minimum) public { require(msg.sender == governance, "!governance"); minimum = _minimum; } function setPeriod(uint256 _period) public { require(msg.sender == governance, "!governance"); period = _period; } function setLock(uint256 _lock) public { require(msg.sender == governance, "!governance"); lock = _lock; } function setRewarder(address _rewarder) public { require(msg.sender == governance, "!governance"); rewarder = _rewarder; } //add stake arguments function addSelect( bytes32 select, uint256 duration, uint256 exrate, uint256 reward ) public { require(msg.sender == governance, "!governance"); _selects[select].duration = duration; _selects[select].exrate = exrate; _selects[select].reward = reward; } // governance function propose(address executor, string memory hash) public { require(votesOf(msg.sender) > minimum, "<minimum"); proposals[proposalCount++] = Proposal({ id: proposalCount, proposer: msg.sender, totalForVotes: 0, totalAgainstVotes: 0, start: block.number, end: period.add(block.number), executor: executor, hash: hash, totalVotesAvailable: totalVotes, quorum: 0, quorumRequired: quorum, open: true }); emit NewProposal( proposalCount, msg.sender, block.number, period, executor ); voteLock[msg.sender] = lock.add(block.number); } function execute(uint256 id) public { (uint256 _for, uint256 _against, uint256 _quorum) = getStats(id); require(proposals[id].quorumRequired < _quorum, "!quorum"); require(proposals[id].end < block.number, "!end"); if (proposals[id].open == true) { tallyVotes(id); } Executor(proposals[id].executor).execute(id, _for, _against, _quorum); } function getStats(uint256 id) public view returns ( uint256 _for, uint256 _against, uint256 _quorum ) { _for = proposals[id].totalForVotes; _against = proposals[id].totalAgainstVotes; uint256 _total = _for.add(_against); _for = _for.mul(10000).div(_total); _against = _against.mul(10000).div(_total); _quorum = _total.mul(10000).div(proposals[id].totalVotesAvailable); } function getVoterStats(uint256 id, address voter) public view returns (uint256, uint256) { return ( proposals[id].forVotes[voter], proposals[id].againstVotes[voter] ); } function tallyVotes(uint256 id) public { require(proposals[id].open == true, "!open"); require(proposals[id].end < block.number, "!end"); (uint256 _for, uint256 _against, ) = getStats(id); bool _quorum = false; if (proposals[id].quorum >= proposals[id].quorumRequired) { _quorum = true; } proposals[id].open = false; emit ProposalFinished(id, _for, _against, _quorum); } function votesOf(address voter) public view returns (uint256) { return votes[voter]; } function register() public { require(voters[msg.sender] == false, "voter"); voters[msg.sender] = true; votes[msg.sender] = balanceOf(msg.sender); totalVotes = totalVotes.add(votes[msg.sender]); emit RegisterVoter(msg.sender, votes[msg.sender], totalVotes); } function revoke() public { require(voters[msg.sender] == true, "!voter"); voters[msg.sender] = false; if (totalVotes < votes[msg.sender]) { //edge case, should be impossible, but this is defi totalVotes = 0; } else { totalVotes = totalVotes.sub(votes[msg.sender]); } emit RevokeVoter(msg.sender, votes[msg.sender], totalVotes); votes[msg.sender] = 0; } function voteFor(uint256 id) public { require(proposals[id].start < block.number, "<start"); require(proposals[id].end > block.number, ">end"); uint256 _against = proposals[id].againstVotes[msg.sender]; if (_against > 0) { proposals[id].totalAgainstVotes = proposals[id] .totalAgainstVotes .sub(_against); proposals[id].againstVotes[msg.sender] = 0; } uint256 vote = votesOf(msg.sender).sub( proposals[id].forVotes[msg.sender] ); proposals[id].totalForVotes = proposals[id].totalForVotes.add(vote); proposals[id].forVotes[msg.sender] = votesOf(msg.sender); proposals[id].totalVotesAvailable = totalVotes; uint256 _votes = proposals[id].totalForVotes.add( proposals[id].totalAgainstVotes ); proposals[id].quorum = _votes.mul(10000).div(totalVotes); voteLock[msg.sender] = lock.add(block.number); emit Vote(id, msg.sender, true, vote); } function voteAgainst(uint256 id) public { require(proposals[id].start < block.number, "<start"); require(proposals[id].end > block.number, ">end"); uint256 _for = proposals[id].forVotes[msg.sender]; if (_for > 0) { proposals[id].totalForVotes = proposals[id].totalForVotes.sub(_for); proposals[id].forVotes[msg.sender] = 0; } uint256 vote = votesOf(msg.sender).sub( proposals[id].againstVotes[msg.sender] ); proposals[id].totalAgainstVotes = proposals[id].totalAgainstVotes.add( vote ); proposals[id].againstVotes[msg.sender] = votesOf(msg.sender); proposals[id].totalVotesAvailable = totalVotes; uint256 _votes = proposals[id].totalForVotes.add( proposals[id].totalAgainstVotes ); proposals[id].quorum = _votes.mul(10000).div(totalVotes); voteLock[msg.sender] = lock.add(block.number); emit Vote(id, msg.sender, false, vote); } //stake / withdraw function stake(bytes32 select, uint256 amount) public { require(amount > 0, "Cannot stake 0"); uint256 supply = _onstake(select, amount); if (voters[msg.sender] == true) { votes[msg.sender] = votes[msg.sender].add(supply); totalVotes = totalVotes.add(supply); } emit Staked(msg.sender, select, amount, supply); } function withdraw(bytes32 receipt) public { uint256 supply = _onwithdraw(receipt); if (voters[msg.sender] == true) { votes[msg.sender] = votes[msg.sender].sub(supply); totalVotes = totalVotes.sub(supply); } if (breaker == false) { require(voteLock[msg.sender] < block.number, "!locked"); } emit Withdrawn(msg.sender, receipt); } function _onstake(bytes32 select, uint256 amount) internal returns (uint256) { Staking memory staking = Staking( msg.sender, amount, now, _selects[select].duration, _selects[select].exrate, _selects[select].reward, 0, 0, 0 ); bytes32 receipt = keccak256(abi.encode(_stakeNonce++, staking)); _stakings[receipt] = staking; _receipts[msg.sender].push(receipt); _totalStake = _totalStake.add(amount); _stakes[msg.sender] = _stakes[msg.sender].add(amount); uint256 supply = amount.mul(_stakings[receipt].exrate).div(1e18); require(supply > 0, "!supply"); _totalSupply = _totalSupply.add(supply); _balances[msg.sender] = _balances[msg.sender].add(supply); IERC20(staketoken).safeTransferFrom(msg.sender, address(this), amount); return supply; } //取回指定的锁仓到期的FOR function _onwithdraw(bytes32 receipt) internal returns (uint256) { uint256 at = _findReceipt(msg.sender, receipt); require(at != uint256(-1), "not found receipt"); Staking memory _staking = _stakings[receipt]; require(now > _staking.start.add(_staking.duration), "stake has not expired"); //到期 uint256 amount = _staking.amount; _totalStake = _totalStake.sub(amount); _stakes[msg.sender] = _stakes[msg.sender].sub(amount); uint256 supply = amount.mul(_staking.exrate).div(1e18); require(supply > 0, "!supply"); _totalSupply = _totalSupply.sub(supply); _balances[msg.sender] = _balances[msg.sender].sub(supply); uint256 last = _receipts[msg.sender].length - 1; _receipts[msg.sender][at] = _receipts[msg.sender][last]; _receipts[msg.sender].pop(); delete _stakings[receipt]; IERC20(staketoken).safeTransfer(msg.sender, amount); if(_staking.reward != 0) { uint256 reward = amount.mul(_staking.reward).div(1e18); IERC20(staketoken).safeTransferFrom(rewarder, msg.sender, reward); } return supply; } function _findReceipt(address account, bytes32 receipt) internal view returns (uint256) { uint256 length = _receipts[account].length; for (uint256 i = 0; i < length; ++i) { if (receipt == _receipts[account][i]) { return i; } } return uint256(-1); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"address","name":"executor","type":"address"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_for","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_against","type":"uint256"},{"indexed":false,"internalType":"bool","name":"quorumReached","type":"bool"}],"name":"ProposalFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalVotes","type":"uint256"}],"name":"RegisterVoter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"votes","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalVotes","type":"uint256"}],"name":"RevokeVoter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bytes32","name":"select","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"bool","name":"vote","type":"bool"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bytes32","name":"receipt","type":"bytes32"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"bytes32","name":"select","type":"bytes32"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"exrate","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"addSelect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"select","type":"bytes32"}],"name":"getSelect","outputs":[{"components":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"exrate","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__0","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__1","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__2","type":"uint256"}],"internalType":"struct FortubeGovernance.Select","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"uint256","name":"_for","type":"uint256"},{"internalType":"uint256","name":"_against","type":"uint256"},{"internalType":"uint256","name":"_quorum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterStats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_staketoken","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"totalForVotes","type":"uint256"},{"internalType":"uint256","name":"totalAgainstVotes","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"uint256","name":"totalVotesAvailable","type":"uint256"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"quorumRequired","type":"uint256"},{"internalType":"bool","name":"open","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"string","name":"hash","type":"string"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"receipts","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_breaker","type":"bool"}],"name":"setBreaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lock","type":"uint256"}],"name":"setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimum","type":"uint256"}],"name":"setMinimum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quorum","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewarder","type":"address"}],"name":"setRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"select","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staketoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"receipt","type":"bytes32"}],"name":"staking","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"exrate","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__0","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__1","type":"uint256"},{"internalType":"uint256","name":"__RESERVED__2","type":"uint256"}],"internalType":"struct FortubeGovernance.Staking","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tallyVotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"voteAgainst","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"voteFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voteLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"votesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"receipt","type":"bytes32"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006001556000601d60006101000a81548160ff021916908315150217905550600060295560016000806101000a81548160ff0219169083151502179055506157ca806100526000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c80638b0e9f3f1161015c578063cf597bd9116100ce578063dcc3e06e11610087578063dcc3e06e146107e1578063e8f625ac146107ff578063eb9253c01461081b578063ef78d4fd14610837578063f83d08ba14610855578063fe0d94c1146108735761028a565b8063cf597bd91461070c578063d3e157471461073d578063d6f0948c14610759578063d8bff5a514610775578063da35c664146107a5578063dab2997b146107c35761028a565b8063a3ec138d11610120578063a3ec138d1461064e578063ab033ea91461067e578063b1f618ad1461069a578063b6549f75146106ca578063c0c53b8b146106d4578063c1ba4e59146106f05761028a565b80638b0e9f3f146105aa5780638caa5230146105c85780638e19899e146105e45780638ed8d6a31461060057806395d89b41146106305761028a565b806342623360116102005780635c0aeb0e116101b95780635c0aeb0e146104c457806370a08231146104e0578063750e443a1461051057806379ec5d3a1461052c5780637b3039651461055c57806386a505351461058e5761028a565b806342623360146103dc5780634d318b0e1461040c5780634de4797b146104285780634e27e9161461045857806352d6804d146104885780635aa6e675146104a65761028a565b80631703a018116102525780631703a0181461034057806318160ddd1461035e5780631aa3a0081461037c578063313ce567146103865780633209e9e6146103a45780633a6462e4146103c05761028a565b8063013cf08b1461028f57806306fdde03146102ca5780630d15fd77146102e85780630f3a9f65146103065780630f41e0d214610322575b600080fd5b6102a960048036036102a4919081019061460c565b61088f565b6040516102c19c9b9a9998979695949392919061539f565b60405180910390f35b6102d26109d4565b6040516102df9190615036565b60405180910390f35b6102f0610a72565b6040516102fd9190615331565b60405180910390f35b610320600480360361031b919081019061460c565b610a78565b005b61032a610b12565b6040516103379190614fa0565b60405180910390f35b610348610b25565b6040516103559190615331565b60405180910390f35b610366610b2b565b6040516103739190615331565b60405180910390f35b610384610b35565b005b61038e610d44565b60405161039b9190615566565b60405180910390f35b6103be60048036036103b9919081019061460c565b610d57565b005b6103da60048036036103d591908101906143ea565b610df1565b005b6103f660048036036103f191908101906143ea565b610ec5565b6040516104039190615331565b60405180910390f35b6104266004803603610421919081019061460c565b610f0e565b005b610442600480360361043d91908101906143ea565b61108f565b60405161044f9190614f7e565b60405180910390f35b610472600480360361046d91908101906143ea565b611126565b60405161047f9190615331565b60405180910390f35b61049061113e565b60405161049d9190615331565b60405180910390f35b6104ae611144565b6040516104bb9190614ecc565b60405180910390f35b6104de60048036036104d991908101906144f2565b61116a565b005b6104fa60048036036104f591908101906143ea565b611217565b6040516105079190615331565b60405180910390f35b61052a6004803603610525919081019061460c565b611260565b005b610546600480360361054191908101906143ea565b611676565b6040516105539190615331565b60405180910390f35b6105766004803603610571919081019061460c565b6116bf565b604051610585939291906154ea565b60405180910390f35b6105a860048036036105a3919081019061460c565b6117a6565b005b6105b2611bbc565b6040516105bf9190615331565b60405180910390f35b6105e260048036036105dd919081019061456d565b611bc6565b005b6105fe60048036036105f99190810190614544565b611d78565b005b61061a60048036036106159190810190614544565b611f7f565b60405161062791906152fa565b60405180910390f35b610638611fe8565b6040516106459190615036565b60405180910390f35b610668600480360361066391908101906143ea565b612086565b6040516106759190614fa0565b60405180910390f35b610698600480360361069391908101906143ea565b6120a6565b005b6106b460048036036106af9190810190614544565b61217a565b6040516106c19190615315565b60405180910390f35b6106d261224e565b005b6106ee60048036036106e99190810190614413565b6124ac565b005b61070a6004803603610705919081019061460c565b612708565b005b61072660048036036107219190810190614635565b6127a2565b60405161073492919061548a565b60405180910390f35b6107576004803603610752919081019061460c565b612858565b005b610773600480360361076e9190810190614462565b6128f2565b005b61078f600480360361078a91908101906143ea565b612bc0565b60405161079c9190615331565b60405180910390f35b6107ad612bd8565b6040516107ba9190615331565b60405180910390f35b6107cb612bde565b6040516107d89190614ecc565b60405180910390f35b6107e9612c04565b6040516107f69190614ecc565b60405180910390f35b610819600480360361081491908101906145a9565b612c2a565b005b610835600480360361083091908101906144b6565b612d11565b005b61083f612e83565b60405161084c9190615331565b60405180910390f35b61085d612e89565b60405161086a9190615331565b60405180910390f35b61088d6004803603610888919081019061460c565b612e8f565b005b60136020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806009018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109a55780601f1061097a576101008083540402835291602001916109a5565b820191906000526020600020905b81548152906001019060200180831161098857829003601f168201915b50505050509080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508c565b60208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b505050505081565b60175481565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff906150ba565b60405180910390fd5b8060198190555050565b601d60009054906101000a900460ff1681565b601c5481565b6000602254905090565b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061525a565b60405180910390fd5b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610c2933611217565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cc0601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175461303a90919063ffffffff16565b6017819055507f42bd0b21218b5114f60361fe686fe499033f14f22cb728a08cf9df9b4e60f8cc33601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601754604051610d3a93929190614ee7565b60405180910390a1565b601f60149054906101000a900460ff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde906150ba565b60405180910390fd5b80601b8190555050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906150ba565b60405180910390fd5b80601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000602560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6001151560136000838152602001908152602001600020600d0160009054906101000a900460ff16151514610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906152ba565b60405180910390fd5b43601360008381526020019081526020016000206007015410610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc7906151fa565b60405180910390fd5b600080610fdc836116bf565b5091509150600080905060136000858152602001908152602001600020600c015460136000868152602001908152602001600020600b01541061101e57600190505b600060136000868152602001908152602001600020600d0160006101000a81548160ff021916908315150217905550837f66ab4d2a1f6db1c01d1d46ab61a9c333b5a4de5e75cc7a68e1495b4badbd009b848484604051611081939291906154b3565b60405180910390a250505050565b6060602760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561111a57602002820191906000526020600020905b815481526020019060010190808311611106575b50505050509050919050565b60166020528060005260406000206000915090505481565b601b5481565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906150ba565b60405180910390fd5b80601d60006101000a81548160ff02191690831515021790555050565b6000602660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b436013600083815260200190815260200160002060060154106112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af9061529a565b60405180910390fd5b43601360008381526020019081526020016000206007015411611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061521a565b60405180910390fd5b60006013600083815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561140e5761139a81601360008581526020019081526020016000206004015461308f90919063ffffffff16565b601360008481526020019081526020016000206004018190555060006013600084815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600061147e6013600085815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461147033611676565b61308f90919063ffffffff16565b90506114a981601360008681526020019081526020016000206005015461303a90919063ffffffff16565b60136000858152602001908152602001600020600501819055506114cc33611676565b6013600085815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060175460136000858152602001908152602001600020600a018190555060006115816013600086815260200190815260200160002060050154601360008781526020019081526020016000206004015461303a90919063ffffffff16565b90506115ac60175461159e612710846130d990919063ffffffff16565b61314990919063ffffffff16565b60136000868152602001908152602001600020600b01819055506115db43601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16847f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b47600085604051611668929190614fbb565b60405180910390a350505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060006013600085815260200190815260200160002060040154925060136000858152602001908152602001600020600501549150600061170b838561303a90919063ffffffff16565b905061173481611726612710876130d990919063ffffffff16565b61314990919063ffffffff16565b935061175d8161174f612710866130d990919063ffffffff16565b61314990919063ffffffff16565b925061179c60136000878152602001908152602001600020600a015461178e612710846130d990919063ffffffff16565b61314990919063ffffffff16565b9150509193909250565b436013600083815260200190815260200160002060060154106117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f59061529a565b60405180910390fd5b43601360008381526020019081526020016000206007015411611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061521a565b60405180910390fd5b60006013600083815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611954576118e081601360008581526020019081526020016000206005015461308f90919063ffffffff16565b601360008481526020019081526020016000206005018190555060006013600084815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60006119c46013600085815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119b633611676565b61308f90919063ffffffff16565b90506119ef81601360008681526020019081526020016000206004015461303a90919063ffffffff16565b6013600085815260200190815260200160002060040181905550611a1233611676565b6013600085815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060175460136000858152602001908152602001600020600a01819055506000611ac76013600086815260200190815260200160002060050154601360008781526020019081526020016000206004015461303a90919063ffffffff16565b9050611af2601754611ae4612710846130d990919063ffffffff16565b61314990919063ffffffff16565b60136000868152602001908152602001600020600b0181905550611b2143601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16847f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b47600185604051611bae929190614fbb565b60405180910390a350505050565b6000602354905090565b60008111611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906150da565b60405180910390fd5b6000611c158383613193565b905060011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611d2157611cc281601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d1a8160175461303a90919063ffffffff16565b6017819055505b3373ffffffffffffffffffffffffffffffffffffffff167fa98fe7d2204baa1060672de0612aecc1197e5cd1fc4bb5e6f5f4b8c357052e8e848484604051611d6b93929190614fff565b60405180910390a2505050565b6000611d83826135d1565b905060011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611e8f57611e3081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e888160175461308f90919063ffffffff16565b6017819055505b60001515601d60009054906101000a900460ff1615151415611f2d5743601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f239061515a565b60405180910390fd5b5b3373ffffffffffffffffffffffffffffffffffffffff167f6ecbc70c26b02b821204839571ea973742fdc445dbfd00b71c513370f5d458ad83604051611f739190614fe4565b60405180910390a25050565b611f87614170565b602460008381526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60218054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561207e5780601f106120535761010080835404028352916020019161207e565b820191906000526020600020905b81548152906001019060200180831161206157829003601f168201915b505050505081565b60156020528060005260406000206000915054906101000a900460ff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d906150ba565b60405180910390fd5b80601d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121826141a6565b60286000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050919050565b60011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d8906150fa565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601754101561238f5760006017819055506123ea565b6123e3601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175461308f90919063ffffffff16565b6017819055505b7e330fa0724b41c0d187cfad0aa7ff5fa2ff7e742995886f55fda6f5909914b833601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175460405161245d93929190614ee7565b60405180910390a16000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60006124b6613c2f565b9050600260009054906101000a900460ff16806124d757506124d6613c38565b5b806124e3575060015481115b612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906151da565b60405180910390fd5b6000600260009054906101000a900460ff161590508015612560576001600260006101000a81548160ff021916908315150217905550816001819055505b612568613c49565b84601d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012601f60146101000a81548160ff021916908360ff1602179055506040518060400160405280601881526020017f466f725475626520476f7665726e616e636520546f6b656e000000000000000081525060209080519060200190612692929190614208565b506040518060400160405280600481526020017f47464f5200000000000000000000000000000000000000000000000000000000815250602190805190602001906126de929190614208565b508015612701576000600260006101000a81548160ff0219169083151502179055505b5050505050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278f906150ba565b60405180910390fd5b80601c8190555050565b6000806013600085815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546013600086815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915091509250929050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906150ba565b60405180910390fd5b80601a8190555050565b601b546128fe33611676565b1161293e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129359061513a565b60405180910390fd5b60405180610180016040528060185481526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020014381526020016129974360195461303a90919063ffffffff16565b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001601754815260200160008152602001601c5481526020016001151581525060136000601860008154809291906001019190505581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160040155606082015181600501556080820151816006015560a0820151816007015560c08201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e0820151816009019080519060200190612adb929190614288565b5061010082015181600a015561012082015181600b015561014082015181600c015561016082015181600d0160006101000a81548160ff0219169083151502179055509050507ff3aa81c2323a935a3e72c018c519b8d8b432eeebaa15cbbe5c8305f0f9df6f4d601854334360195486604051612b5c95949392919061534c565b60405180910390a1612b7943601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60146020528060005260406000206000915090505481565b60185481565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906150ba565b60405180910390fd5b82602460008681526020019081526020016000206000018190555081602460008681526020019081526020016000206001018190555080602460008681526020019081526020016000206002018190555050505050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d98906150ba565b60405180910390fd5b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e29906152da565b60405180910390fd5b612e7f601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613c659092919063ffffffff16565b5050565b60195481565b601a5481565b6000806000612e9d846116bf565b9250925092508060136000868152602001908152602001600020600c015410612efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef29061519a565b60405180910390fd5b43601360008681526020019081526020016000206007015410612f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4a906151fa565b60405180910390fd5b6001151560136000868152602001908152602001600020600d0160009054906101000a900460ff1615151415612f8d57612f8c84610f0e565b5b6013600085815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0137f7a858585856040518563ffffffff1660e01b81526004016130029493929190615521565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b5050505050505050565b600080828401905083811015613085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307c9061511a565b60405180910390fd5b8091505092915050565b60006130d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ceb565b905092915050565b6000808314156130ec5760009050613143565b60008284029050828482816130fd57fe5b041461313e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613135906151ba565b60405180910390fd5b809150505b92915050565b600061318b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d46565b905092915050565b600061319d6141a6565b6040518061012001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001428152602001602460008781526020019081526020016000206000015481526020016024600087815260200190815260200160002060010154815260200160246000878152602001908152602001600020600201548152602001600081526020016000815260200160008152509050600060296000815480929190600101919050558260405160200161325f929190615460565b604051602081830303815290604052805190602001209050816028600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155905050602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556133a18460235461303a90919063ffffffff16565b6023819055506133f984602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000613481670de0b6b3a76400006134736028600086815260200190815260200160002060040154886130d990919063ffffffff16565b61314990919063ffffffff16565b9050600081116134c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bd9061507a565b60405180910390fd5b6134db8160225461303a90919063ffffffff16565b60228190555061353381602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135c5333087601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613da7909392919063ffffffff16565b80935050505092915050565b6000806135de3384613e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811415613643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363a9061517a565b60405180910390fd5b61364b6141a6565b60286000858152602001908152602001600020604051806101200160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050905061372d8160600151826040015161303a90919063ffffffff16565b421161376e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137659061509a565b60405180910390fd5b60008160200151905061378c8160235461308f90919063ffffffff16565b6023819055506137e481602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061385a670de0b6b3a764000061384c8560800151856130d990919063ffffffff16565b61314990919063ffffffff16565b90506000811161389f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138969061507a565b60405180910390fd5b6138b48160225461308f90919063ffffffff16565b60228190555061390c81602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050039050602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106139e357fe5b9060005260206000200154602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110613a3857fe5b9060005260206000200181905550602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613a8e57fe5b6001900381819060005260206000200160009055905560286000888152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160009055600482016000905560058201600090556006820160009055600782016000905560088201600090555050613b6e3384601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613c659092919063ffffffff16565b60008460a0015114613c22576000613bad670de0b6b3a7640000613b9f8760a00151876130d990919063ffffffff16565b61314990919063ffffffff16565b9050613c20601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613da7909392919063ffffffff16565b505b8195505050505050919050565b60006001905090565b600080303b90506000811491505090565b60016000806101000a81548160ff021916908315150217905550565b613ce68363a9059cbb60e01b8484604051602401613c84929190614f55565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f23565b505050565b6000838311158290613d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2a9190615058565b60405180910390fd5b5060008385039050809150509392505050565b60008083118290613d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d849190615058565b60405180910390fd5b506000838581613d9957fe5b049050809150509392505050565b613e2a846323b872dd60e01b858585604051602401613dc893929190614f1e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f23565b50505050565b600080602760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008090505b81811015613ef757602760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110613ed057fe5b9060005260206000200154841415613eec578092505050613f1d565b806001019050613e7e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9150505b92915050565b6060613f85826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613fea9092919063ffffffff16565b9050600081511115613fe55780806020019051613fa5919081019061451b565b613fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fdb9061527a565b60405180910390fd5b5b505050565b6060613ff98484600085614002565b90509392505050565b606061400d85614125565b61404c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140439061523a565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516140769190614eb5565b60006040518083038185875af1925050503d80600081146140b3576040519150601f19603f3d011682016040523d82523d6000602084013e6140b8565b606091505b509150915081156140cd57809250505061411d565b6000815111156140e05780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141149190615058565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561416757506000801b8214155b92505050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101200160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424957805160ff1916838001178555614277565b82800160010185558215614277579182015b8281111561427657825182559160200191906001019061425b565b5b5090506142849190614308565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106142c957805160ff19168380011785556142f7565b828001600101855582156142f7579182015b828111156142f65782518255916020019190600101906142db565b5b5090506143049190614308565b5090565b61432a91905b8082111561432657600081600090555060010161430e565b5090565b90565b60008135905061433c81615738565b92915050565b6000813590506143518161574f565b92915050565b6000815190506143668161574f565b92915050565b60008135905061437b81615766565b92915050565b600082601f83011261439257600080fd5b81356143a56143a0826155ae565b615581565b915080825260208301602083018583830111156143c157600080fd5b6143cc8382846156e5565b50505092915050565b6000813590506143e48161577d565b92915050565b6000602082840312156143fc57600080fd5b600061440a8482850161432d565b91505092915050565b60008060006060848603121561442857600080fd5b60006144368682870161432d565b93505060206144478682870161432d565b92505060406144588682870161432d565b9150509250925092565b6000806040838503121561447557600080fd5b60006144838582860161432d565b925050602083013567ffffffffffffffff8111156144a057600080fd5b6144ac85828601614381565b9150509250929050565b600080604083850312156144c957600080fd5b60006144d78582860161432d565b92505060206144e8858286016143d5565b9150509250929050565b60006020828403121561450457600080fd5b600061451284828501614342565b91505092915050565b60006020828403121561452d57600080fd5b600061453b84828501614357565b91505092915050565b60006020828403121561455657600080fd5b60006145648482850161436c565b91505092915050565b6000806040838503121561458057600080fd5b600061458e8582860161436c565b925050602061459f858286016143d5565b9150509250929050565b600080600080608085870312156145bf57600080fd5b60006145cd8782880161436c565b94505060206145de878288016143d5565b93505060406145ef878288016143d5565b9250506060614600878288016143d5565b91505092959194509250565b60006020828403121561461e57600080fd5b600061462c848285016143d5565b91505092915050565b6000806040838503121561464857600080fd5b6000614656858286016143d5565b92505060206146678582860161432d565b9150509250929050565b600061467d8383614723565b60208301905092915050565b614692816156af565b82525050565b6146a181615650565b82525050565b6146b081615650565b82525050565b60006146c1826155ea565b6146cb8185615623565b93506146d6836155da565b8060005b838110156147075781516146ee8882614671565b97506146f983615616565b9250506001810190506146da565b5085935050505092915050565b61471d81615662565b82525050565b61472c8161566e565b82525050565b61473b8161566e565b82525050565b600061474c826155f5565b6147568185615634565b93506147668185602086016156f4565b80840191505092915050565b600061477d8261560b565b614787818561563f565b93506147978185602086016156f4565b6147a081615727565b840191505092915050565b60006147b682615600565b6147c0818561563f565b93506147d08185602086016156f4565b6147d981615727565b840191505092915050565b60006147f160078361563f565b91507f21737570706c79000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061483160158361563f565b91507f7374616b6520686173206e6f74206578706972656400000000000000000000006000830152602082019050919050565b6000614871600b8361563f565b91507f21676f7665726e616e63650000000000000000000000000000000000000000006000830152602082019050919050565b60006148b1600e8361563f565b91507f43616e6e6f74207374616b6520300000000000000000000000000000000000006000830152602082019050919050565b60006148f160068361563f565b91507f21766f74657200000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614931601b8361563f565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061497160088361563f565b91507f3c6d696e696d756d0000000000000000000000000000000000000000000000006000830152602082019050919050565b60006149b160078361563f565b91507f216c6f636b6564000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006149f160118361563f565b91507f6e6f7420666f756e6420726563656970740000000000000000000000000000006000830152602082019050919050565b6000614a3160078361563f565b91507f2171756f72756d000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614a7160218361563f565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad7602e8361563f565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000614b3d60048361563f565b91507f21656e64000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b7d60048361563f565b91507f3e656e64000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bbd601d8361563f565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bfd60058361563f565b91507f766f7465720000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c3d602a8361563f565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca360068361563f565b91507f3c737461727400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614ce360058361563f565b91507f216f70656e0000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2360128361563f565b91507f63616e206e6f74207374616b65746f6b656e00000000000000000000000000006000830152602082019050919050565b60c082016000820151614d6c6000850182614e88565b506020820151614d7f6020850182614e88565b506040820151614d926040850182614e88565b506060820151614da56060850182614e88565b506080820151614db86080850182614e88565b5060a0820151614dcb60a0850182614e88565b50505050565b61012082016000820151614de86000850182614698565b506020820151614dfb6020850182614e88565b506040820151614e0e6040850182614e88565b506060820151614e216060850182614e88565b506080820151614e346080850182614e88565b5060a0820151614e4760a0850182614e88565b5060c0820151614e5a60c0850182614e88565b5060e0820151614e6d60e0850182614e88565b50610100820151614e82610100850182614e88565b50505050565b614e9181615698565b82525050565b614ea081615698565b82525050565b614eaf816156a2565b82525050565b6000614ec18284614741565b915081905092915050565b6000602082019050614ee160008301846146a7565b92915050565b6000606082019050614efc6000830186614689565b614f096020830185614e97565b614f166040830184614e97565b949350505050565b6000606082019050614f3360008301866146a7565b614f4060208301856146a7565b614f4d6040830184614e97565b949350505050565b6000604082019050614f6a60008301856146a7565b614f776020830184614e97565b9392505050565b60006020820190508181036000830152614f9881846146b6565b905092915050565b6000602082019050614fb56000830184614714565b92915050565b6000604082019050614fd06000830185614714565b614fdd6020830184614e97565b9392505050565b6000602082019050614ff96000830184614732565b92915050565b60006060820190506150146000830186614732565b6150216020830185614e97565b61502e6040830184614e97565b949350505050565b6000602082019050818103600083015261505081846147ab565b905092915050565b600060208201905081810360008301526150728184614772565b905092915050565b60006020820190508181036000830152615093816147e4565b9050919050565b600060208201905081810360008301526150b381614824565b9050919050565b600060208201905081810360008301526150d381614864565b9050919050565b600060208201905081810360008301526150f3816148a4565b9050919050565b60006020820190508181036000830152615113816148e4565b9050919050565b6000602082019050818103600083015261513381614924565b9050919050565b6000602082019050818103600083015261515381614964565b9050919050565b60006020820190508181036000830152615173816149a4565b9050919050565b60006020820190508181036000830152615193816149e4565b9050919050565b600060208201905081810360008301526151b381614a24565b9050919050565b600060208201905081810360008301526151d381614a64565b9050919050565b600060208201905081810360008301526151f381614aca565b9050919050565b6000602082019050818103600083015261521381614b30565b9050919050565b6000602082019050818103600083015261523381614b70565b9050919050565b6000602082019050818103600083015261525381614bb0565b9050919050565b6000602082019050818103600083015261527381614bf0565b9050919050565b6000602082019050818103600083015261529381614c30565b9050919050565b600060208201905081810360008301526152b381614c96565b9050919050565b600060208201905081810360008301526152d381614cd6565b9050919050565b600060208201905081810360008301526152f381614d16565b9050919050565b600060c08201905061530f6000830184614d56565b92915050565b60006101208201905061532b6000830184614dd1565b92915050565b60006020820190506153466000830184614e97565b92915050565b600060a0820190506153616000830188614e97565b61536e6020830187614689565b61537b6040830186614e97565b6153886060830185614e97565b61539560808301846146a7565b9695505050505050565b6000610180820190506153b5600083018f614e97565b6153c2602083018e6146a7565b6153cf604083018d614e97565b6153dc606083018c614e97565b6153e9608083018b614e97565b6153f660a083018a614e97565b61540360c08301896146a7565b81810360e083015261541581886147ab565b9050615425610100830187614e97565b615433610120830186614e97565b615441610140830185614e97565b61544f610160830184614714565b9d9c50505050505050505050505050565b6000610140820190506154766000830185614e97565b6154836020830184614dd1565b9392505050565b600060408201905061549f6000830185614e97565b6154ac6020830184614e97565b9392505050565b60006060820190506154c86000830186614e97565b6154d56020830185614e97565b6154e26040830184614714565b949350505050565b60006060820190506154ff6000830186614e97565b61550c6020830185614e97565b6155196040830184614e97565b949350505050565b60006080820190506155366000830187614e97565b6155436020830186614e97565b6155506040830185614e97565b61555d6060830184614e97565b95945050505050565b600060208201905061557b6000830184614ea6565b92915050565b6000604051905081810181811067ffffffffffffffff821117156155a457600080fd5b8060405250919050565b600067ffffffffffffffff8211156155c557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061565b82615678565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156ba826156c1565b9050919050565b60006156cc826156d3565b9050919050565b60006156de82615678565b9050919050565b82818337600083830152505050565b60005b838110156157125780820151818401526020810190506156f7565b83811115615721576000848401525b50505050565b6000601f19601f8301169050919050565b61574181615650565b811461574c57600080fd5b50565b61575881615662565b811461576357600080fd5b50565b61576f8161566e565b811461577a57600080fd5b50565b61578681615698565b811461579157600080fd5b5056fea264697066735822122025b08abd32b60422ef60a54d476db798d85c4f81ac222245be0dafc5a9d0b11364736f6c63430006020033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061028a5760003560e01c80638b0e9f3f1161015c578063cf597bd9116100ce578063dcc3e06e11610087578063dcc3e06e146107e1578063e8f625ac146107ff578063eb9253c01461081b578063ef78d4fd14610837578063f83d08ba14610855578063fe0d94c1146108735761028a565b8063cf597bd91461070c578063d3e157471461073d578063d6f0948c14610759578063d8bff5a514610775578063da35c664146107a5578063dab2997b146107c35761028a565b8063a3ec138d11610120578063a3ec138d1461064e578063ab033ea91461067e578063b1f618ad1461069a578063b6549f75146106ca578063c0c53b8b146106d4578063c1ba4e59146106f05761028a565b80638b0e9f3f146105aa5780638caa5230146105c85780638e19899e146105e45780638ed8d6a31461060057806395d89b41146106305761028a565b806342623360116102005780635c0aeb0e116101b95780635c0aeb0e146104c457806370a08231146104e0578063750e443a1461051057806379ec5d3a1461052c5780637b3039651461055c57806386a505351461058e5761028a565b806342623360146103dc5780634d318b0e1461040c5780634de4797b146104285780634e27e9161461045857806352d6804d146104885780635aa6e675146104a65761028a565b80631703a018116102525780631703a0181461034057806318160ddd1461035e5780631aa3a0081461037c578063313ce567146103865780633209e9e6146103a45780633a6462e4146103c05761028a565b8063013cf08b1461028f57806306fdde03146102ca5780630d15fd77146102e85780630f3a9f65146103065780630f41e0d214610322575b600080fd5b6102a960048036036102a4919081019061460c565b61088f565b6040516102c19c9b9a9998979695949392919061539f565b60405180910390f35b6102d26109d4565b6040516102df9190615036565b60405180910390f35b6102f0610a72565b6040516102fd9190615331565b60405180910390f35b610320600480360361031b919081019061460c565b610a78565b005b61032a610b12565b6040516103379190614fa0565b60405180910390f35b610348610b25565b6040516103559190615331565b60405180910390f35b610366610b2b565b6040516103739190615331565b60405180910390f35b610384610b35565b005b61038e610d44565b60405161039b9190615566565b60405180910390f35b6103be60048036036103b9919081019061460c565b610d57565b005b6103da60048036036103d591908101906143ea565b610df1565b005b6103f660048036036103f191908101906143ea565b610ec5565b6040516104039190615331565b60405180910390f35b6104266004803603610421919081019061460c565b610f0e565b005b610442600480360361043d91908101906143ea565b61108f565b60405161044f9190614f7e565b60405180910390f35b610472600480360361046d91908101906143ea565b611126565b60405161047f9190615331565b60405180910390f35b61049061113e565b60405161049d9190615331565b60405180910390f35b6104ae611144565b6040516104bb9190614ecc565b60405180910390f35b6104de60048036036104d991908101906144f2565b61116a565b005b6104fa60048036036104f591908101906143ea565b611217565b6040516105079190615331565b60405180910390f35b61052a6004803603610525919081019061460c565b611260565b005b610546600480360361054191908101906143ea565b611676565b6040516105539190615331565b60405180910390f35b6105766004803603610571919081019061460c565b6116bf565b604051610585939291906154ea565b60405180910390f35b6105a860048036036105a3919081019061460c565b6117a6565b005b6105b2611bbc565b6040516105bf9190615331565b60405180910390f35b6105e260048036036105dd919081019061456d565b611bc6565b005b6105fe60048036036105f99190810190614544565b611d78565b005b61061a60048036036106159190810190614544565b611f7f565b60405161062791906152fa565b60405180910390f35b610638611fe8565b6040516106459190615036565b60405180910390f35b610668600480360361066391908101906143ea565b612086565b6040516106759190614fa0565b60405180910390f35b610698600480360361069391908101906143ea565b6120a6565b005b6106b460048036036106af9190810190614544565b61217a565b6040516106c19190615315565b60405180910390f35b6106d261224e565b005b6106ee60048036036106e99190810190614413565b6124ac565b005b61070a6004803603610705919081019061460c565b612708565b005b61072660048036036107219190810190614635565b6127a2565b60405161073492919061548a565b60405180910390f35b6107576004803603610752919081019061460c565b612858565b005b610773600480360361076e9190810190614462565b6128f2565b005b61078f600480360361078a91908101906143ea565b612bc0565b60405161079c9190615331565b60405180910390f35b6107ad612bd8565b6040516107ba9190615331565b60405180910390f35b6107cb612bde565b6040516107d89190614ecc565b60405180910390f35b6107e9612c04565b6040516107f69190614ecc565b60405180910390f35b610819600480360361081491908101906145a9565b612c2a565b005b610835600480360361083091908101906144b6565b612d11565b005b61083f612e83565b60405161084c9190615331565b60405180910390f35b61085d612e89565b60405161086a9190615331565b60405180910390f35b61088d6004803603610888919081019061460c565b612e8f565b005b60136020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806009018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109a55780601f1061097a576101008083540402835291602001916109a5565b820191906000526020600020905b81548152906001019060200180831161098857829003601f168201915b50505050509080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508c565b60208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b505050505081565b60175481565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff906150ba565b60405180910390fd5b8060198190555050565b601d60009054906101000a900460ff1681565b601c5481565b6000602254905090565b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061525a565b60405180910390fd5b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610c2933611217565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cc0601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175461303a90919063ffffffff16565b6017819055507f42bd0b21218b5114f60361fe686fe499033f14f22cb728a08cf9df9b4e60f8cc33601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601754604051610d3a93929190614ee7565b60405180910390a1565b601f60149054906101000a900460ff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde906150ba565b60405180910390fd5b80601b8190555050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e78906150ba565b60405180910390fd5b80601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000602560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6001151560136000838152602001908152602001600020600d0160009054906101000a900460ff16151514610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906152ba565b60405180910390fd5b43601360008381526020019081526020016000206007015410610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc7906151fa565b60405180910390fd5b600080610fdc836116bf565b5091509150600080905060136000858152602001908152602001600020600c015460136000868152602001908152602001600020600b01541061101e57600190505b600060136000868152602001908152602001600020600d0160006101000a81548160ff021916908315150217905550837f66ab4d2a1f6db1c01d1d46ab61a9c333b5a4de5e75cc7a68e1495b4badbd009b848484604051611081939291906154b3565b60405180910390a250505050565b6060602760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561111a57602002820191906000526020600020905b815481526020019060010190808311611106575b50505050509050919050565b60166020528060005260406000206000915090505481565b601b5481565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906150ba565b60405180910390fd5b80601d60006101000a81548160ff02191690831515021790555050565b6000602660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b436013600083815260200190815260200160002060060154106112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af9061529a565b60405180910390fd5b43601360008381526020019081526020016000206007015411611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061521a565b60405180910390fd5b60006013600083815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561140e5761139a81601360008581526020019081526020016000206004015461308f90919063ffffffff16565b601360008481526020019081526020016000206004018190555060006013600084815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600061147e6013600085815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461147033611676565b61308f90919063ffffffff16565b90506114a981601360008681526020019081526020016000206005015461303a90919063ffffffff16565b60136000858152602001908152602001600020600501819055506114cc33611676565b6013600085815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060175460136000858152602001908152602001600020600a018190555060006115816013600086815260200190815260200160002060050154601360008781526020019081526020016000206004015461303a90919063ffffffff16565b90506115ac60175461159e612710846130d990919063ffffffff16565b61314990919063ffffffff16565b60136000868152602001908152602001600020600b01819055506115db43601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16847f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b47600085604051611668929190614fbb565b60405180910390a350505050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008060006013600085815260200190815260200160002060040154925060136000858152602001908152602001600020600501549150600061170b838561303a90919063ffffffff16565b905061173481611726612710876130d990919063ffffffff16565b61314990919063ffffffff16565b935061175d8161174f612710866130d990919063ffffffff16565b61314990919063ffffffff16565b925061179c60136000878152602001908152602001600020600a015461178e612710846130d990919063ffffffff16565b61314990919063ffffffff16565b9150509193909250565b436013600083815260200190815260200160002060060154106117fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f59061529a565b60405180910390fd5b43601360008381526020019081526020016000206007015411611856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184d9061521a565b60405180910390fd5b60006013600083815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611954576118e081601360008581526020019081526020016000206005015461308f90919063ffffffff16565b601360008481526020019081526020016000206005018190555060006013600084815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60006119c46013600085815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119b633611676565b61308f90919063ffffffff16565b90506119ef81601360008681526020019081526020016000206004015461303a90919063ffffffff16565b6013600085815260200190815260200160002060040181905550611a1233611676565b6013600085815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060175460136000858152602001908152602001600020600a01819055506000611ac76013600086815260200190815260200160002060050154601360008781526020019081526020016000206004015461303a90919063ffffffff16565b9050611af2601754611ae4612710846130d990919063ffffffff16565b61314990919063ffffffff16565b60136000868152602001908152602001600020600b0181905550611b2143601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16847f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b47600185604051611bae929190614fbb565b60405180910390a350505050565b6000602354905090565b60008111611c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c00906150da565b60405180910390fd5b6000611c158383613193565b905060011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611d2157611cc281601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d1a8160175461303a90919063ffffffff16565b6017819055505b3373ffffffffffffffffffffffffffffffffffffffff167fa98fe7d2204baa1060672de0612aecc1197e5cd1fc4bb5e6f5f4b8c357052e8e848484604051611d6b93929190614fff565b60405180910390a2505050565b6000611d83826135d1565b905060011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611e8f57611e3081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e888160175461308f90919063ffffffff16565b6017819055505b60001515601d60009054906101000a900460ff1615151415611f2d5743601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f239061515a565b60405180910390fd5b5b3373ffffffffffffffffffffffffffffffffffffffff167f6ecbc70c26b02b821204839571ea973742fdc445dbfd00b71c513370f5d458ad83604051611f739190614fe4565b60405180910390a25050565b611f87614170565b602460008381526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60218054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561207e5780601f106120535761010080835404028352916020019161207e565b820191906000526020600020905b81548152906001019060200180831161206157829003601f168201915b505050505081565b60156020528060005260406000206000915054906101000a900460ff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212d906150ba565b60405180910390fd5b80601d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121826141a6565b60286000838152602001908152602001600020604051806101200160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050919050565b60011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d8906150fa565b60405180910390fd5b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601754101561238f5760006017819055506123ea565b6123e3601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175461308f90919063ffffffff16565b6017819055505b7e330fa0724b41c0d187cfad0aa7ff5fa2ff7e742995886f55fda6f5909914b833601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460175460405161245d93929190614ee7565b60405180910390a16000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60006124b6613c2f565b9050600260009054906101000a900460ff16806124d757506124d6613c38565b5b806124e3575060015481115b612522576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612519906151da565b60405180910390fd5b6000600260009054906101000a900460ff161590508015612560576001600260006101000a81548160ff021916908315150217905550816001819055505b612568613c49565b84601d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506012601f60146101000a81548160ff021916908360ff1602179055506040518060400160405280601881526020017f466f725475626520476f7665726e616e636520546f6b656e000000000000000081525060209080519060200190612692929190614208565b506040518060400160405280600481526020017f47464f5200000000000000000000000000000000000000000000000000000000815250602190805190602001906126de929190614208565b508015612701576000600260006101000a81548160ff0219169083151502179055505b5050505050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278f906150ba565b60405180910390fd5b80601c8190555050565b6000806013600085815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546013600086815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915091509250929050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906150ba565b60405180910390fd5b80601a8190555050565b601b546128fe33611676565b1161293e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129359061513a565b60405180910390fd5b60405180610180016040528060185481526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020014381526020016129974360195461303a90919063ffffffff16565b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001601754815260200160008152602001601c5481526020016001151581525060136000601860008154809291906001019190505581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160040155606082015181600501556080820151816006015560a0820151816007015560c08201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e0820151816009019080519060200190612adb929190614288565b5061010082015181600a015561012082015181600b015561014082015181600c015561016082015181600d0160006101000a81548160ff0219169083151502179055509050507ff3aa81c2323a935a3e72c018c519b8d8b432eeebaa15cbbe5c8305f0f9df6f4d601854334360195486604051612b5c95949392919061534c565b60405180910390a1612b7943601a5461303a90919063ffffffff16565b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60146020528060005260406000206000915090505481565b60185481565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb1906150ba565b60405180910390fd5b82602460008681526020019081526020016000206000018190555081602460008681526020019081526020016000206001018190555080602460008681526020019081526020016000206002018190555050505050565b601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d98906150ba565b60405180910390fd5b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e29906152da565b60405180910390fd5b612e7f601d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613c659092919063ffffffff16565b5050565b60195481565b601a5481565b6000806000612e9d846116bf565b9250925092508060136000868152602001908152602001600020600c015410612efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef29061519a565b60405180910390fd5b43601360008681526020019081526020016000206007015410612f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4a906151fa565b60405180910390fd5b6001151560136000868152602001908152602001600020600d0160009054906101000a900460ff1615151415612f8d57612f8c84610f0e565b5b6013600085815260200190815260200160002060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c0137f7a858585856040518563ffffffff1660e01b81526004016130029493929190615521565b600060405180830381600087803b15801561301c57600080fd5b505af1158015613030573d6000803e3d6000fd5b5050505050505050565b600080828401905083811015613085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307c9061511a565b60405180910390fd5b8091505092915050565b60006130d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ceb565b905092915050565b6000808314156130ec5760009050613143565b60008284029050828482816130fd57fe5b041461313e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613135906151ba565b60405180910390fd5b809150505b92915050565b600061318b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d46565b905092915050565b600061319d6141a6565b6040518061012001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001428152602001602460008781526020019081526020016000206000015481526020016024600087815260200190815260200160002060010154815260200160246000878152602001908152602001600020600201548152602001600081526020016000815260200160008152509050600060296000815480929190600101919050558260405160200161325f929190615460565b604051602081830303815290604052805190602001209050816028600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155905050602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556133a18460235461303a90919063ffffffff16565b6023819055506133f984602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000613481670de0b6b3a76400006134736028600086815260200190815260200160002060040154886130d990919063ffffffff16565b61314990919063ffffffff16565b9050600081116134c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bd9061507a565b60405180910390fd5b6134db8160225461303a90919063ffffffff16565b60228190555061353381602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461303a90919063ffffffff16565b602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135c5333087601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613da7909392919063ffffffff16565b80935050505092915050565b6000806135de3384613e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811415613643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363a9061517a565b60405180910390fd5b61364b6141a6565b60286000858152602001908152602001600020604051806101200160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050905061372d8160600151826040015161303a90919063ffffffff16565b421161376e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137659061509a565b60405180910390fd5b60008160200151905061378c8160235461308f90919063ffffffff16565b6023819055506137e481602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b602560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061385a670de0b6b3a764000061384c8560800151856130d990919063ffffffff16565b61314990919063ffffffff16565b90506000811161389f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138969061507a565b60405180910390fd5b6138b48160225461308f90919063ffffffff16565b60228190555061390c81602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461308f90919063ffffffff16565b602660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050039050602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106139e357fe5b9060005260206000200154602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110613a3857fe5b9060005260206000200181905550602760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613a8e57fe5b6001900381819060005260206000200160009055905560286000888152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160009055600482016000905560058201600090556006820160009055600782016000905560088201600090555050613b6e3384601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613c659092919063ffffffff16565b60008460a0015114613c22576000613bad670de0b6b3a7640000613b9f8760a00151876130d990919063ffffffff16565b61314990919063ffffffff16565b9050613c20601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163383601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613da7909392919063ffffffff16565b505b8195505050505050919050565b60006001905090565b600080303b90506000811491505090565b60016000806101000a81548160ff021916908315150217905550565b613ce68363a9059cbb60e01b8484604051602401613c84929190614f55565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f23565b505050565b6000838311158290613d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d2a9190615058565b60405180910390fd5b5060008385039050809150509392505050565b60008083118290613d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d849190615058565b60405180910390fd5b506000838581613d9957fe5b049050809150509392505050565b613e2a846323b872dd60e01b858585604051602401613dc893929190614f1e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613f23565b50505050565b600080602760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008090505b81811015613ef757602760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110613ed057fe5b9060005260206000200154841415613eec578092505050613f1d565b806001019050613e7e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9150505b92915050565b6060613f85826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613fea9092919063ffffffff16565b9050600081511115613fe55780806020019051613fa5919081019061451b565b613fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fdb9061527a565b60405180910390fd5b5b505050565b6060613ff98484600085614002565b90509392505050565b606061400d85614125565b61404c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140439061523a565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516140769190614eb5565b60006040518083038185875af1925050503d80600081146140b3576040519150601f19603f3d011682016040523d82523d6000602084013e6140b8565b606091505b509150915081156140cd57809250505061411d565b6000815111156140e05780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141149190615058565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561416757506000801b8214155b92505050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101200160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424957805160ff1916838001178555614277565b82800160010185558215614277579182015b8281111561427657825182559160200191906001019061425b565b5b5090506142849190614308565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106142c957805160ff19168380011785556142f7565b828001600101855582156142f7579182015b828111156142f65782518255916020019190600101906142db565b5b5090506143049190614308565b5090565b61432a91905b8082111561432657600081600090555060010161430e565b5090565b90565b60008135905061433c81615738565b92915050565b6000813590506143518161574f565b92915050565b6000815190506143668161574f565b92915050565b60008135905061437b81615766565b92915050565b600082601f83011261439257600080fd5b81356143a56143a0826155ae565b615581565b915080825260208301602083018583830111156143c157600080fd5b6143cc8382846156e5565b50505092915050565b6000813590506143e48161577d565b92915050565b6000602082840312156143fc57600080fd5b600061440a8482850161432d565b91505092915050565b60008060006060848603121561442857600080fd5b60006144368682870161432d565b93505060206144478682870161432d565b92505060406144588682870161432d565b9150509250925092565b6000806040838503121561447557600080fd5b60006144838582860161432d565b925050602083013567ffffffffffffffff8111156144a057600080fd5b6144ac85828601614381565b9150509250929050565b600080604083850312156144c957600080fd5b60006144d78582860161432d565b92505060206144e8858286016143d5565b9150509250929050565b60006020828403121561450457600080fd5b600061451284828501614342565b91505092915050565b60006020828403121561452d57600080fd5b600061453b84828501614357565b91505092915050565b60006020828403121561455657600080fd5b60006145648482850161436c565b91505092915050565b6000806040838503121561458057600080fd5b600061458e8582860161436c565b925050602061459f858286016143d5565b9150509250929050565b600080600080608085870312156145bf57600080fd5b60006145cd8782880161436c565b94505060206145de878288016143d5565b93505060406145ef878288016143d5565b9250506060614600878288016143d5565b91505092959194509250565b60006020828403121561461e57600080fd5b600061462c848285016143d5565b91505092915050565b6000806040838503121561464857600080fd5b6000614656858286016143d5565b92505060206146678582860161432d565b9150509250929050565b600061467d8383614723565b60208301905092915050565b614692816156af565b82525050565b6146a181615650565b82525050565b6146b081615650565b82525050565b60006146c1826155ea565b6146cb8185615623565b93506146d6836155da565b8060005b838110156147075781516146ee8882614671565b97506146f983615616565b9250506001810190506146da565b5085935050505092915050565b61471d81615662565b82525050565b61472c8161566e565b82525050565b61473b8161566e565b82525050565b600061474c826155f5565b6147568185615634565b93506147668185602086016156f4565b80840191505092915050565b600061477d8261560b565b614787818561563f565b93506147978185602086016156f4565b6147a081615727565b840191505092915050565b60006147b682615600565b6147c0818561563f565b93506147d08185602086016156f4565b6147d981615727565b840191505092915050565b60006147f160078361563f565b91507f21737570706c79000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061483160158361563f565b91507f7374616b6520686173206e6f74206578706972656400000000000000000000006000830152602082019050919050565b6000614871600b8361563f565b91507f21676f7665726e616e63650000000000000000000000000000000000000000006000830152602082019050919050565b60006148b1600e8361563f565b91507f43616e6e6f74207374616b6520300000000000000000000000000000000000006000830152602082019050919050565b60006148f160068361563f565b91507f21766f74657200000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614931601b8361563f565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061497160088361563f565b91507f3c6d696e696d756d0000000000000000000000000000000000000000000000006000830152602082019050919050565b60006149b160078361563f565b91507f216c6f636b6564000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006149f160118361563f565b91507f6e6f7420666f756e6420726563656970740000000000000000000000000000006000830152602082019050919050565b6000614a3160078361563f565b91507f2171756f72756d000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614a7160218361563f565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad7602e8361563f565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000614b3d60048361563f565b91507f21656e64000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b7d60048361563f565b91507f3e656e64000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bbd601d8361563f565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bfd60058361563f565b91507f766f7465720000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c3d602a8361563f565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca360068361563f565b91507f3c737461727400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614ce360058361563f565b91507f216f70656e0000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2360128361563f565b91507f63616e206e6f74207374616b65746f6b656e00000000000000000000000000006000830152602082019050919050565b60c082016000820151614d6c6000850182614e88565b506020820151614d7f6020850182614e88565b506040820151614d926040850182614e88565b506060820151614da56060850182614e88565b506080820151614db86080850182614e88565b5060a0820151614dcb60a0850182614e88565b50505050565b61012082016000820151614de86000850182614698565b506020820151614dfb6020850182614e88565b506040820151614e0e6040850182614e88565b506060820151614e216060850182614e88565b506080820151614e346080850182614e88565b5060a0820151614e4760a0850182614e88565b5060c0820151614e5a60c0850182614e88565b5060e0820151614e6d60e0850182614e88565b50610100820151614e82610100850182614e88565b50505050565b614e9181615698565b82525050565b614ea081615698565b82525050565b614eaf816156a2565b82525050565b6000614ec18284614741565b915081905092915050565b6000602082019050614ee160008301846146a7565b92915050565b6000606082019050614efc6000830186614689565b614f096020830185614e97565b614f166040830184614e97565b949350505050565b6000606082019050614f3360008301866146a7565b614f4060208301856146a7565b614f4d6040830184614e97565b949350505050565b6000604082019050614f6a60008301856146a7565b614f776020830184614e97565b9392505050565b60006020820190508181036000830152614f9881846146b6565b905092915050565b6000602082019050614fb56000830184614714565b92915050565b6000604082019050614fd06000830185614714565b614fdd6020830184614e97565b9392505050565b6000602082019050614ff96000830184614732565b92915050565b60006060820190506150146000830186614732565b6150216020830185614e97565b61502e6040830184614e97565b949350505050565b6000602082019050818103600083015261505081846147ab565b905092915050565b600060208201905081810360008301526150728184614772565b905092915050565b60006020820190508181036000830152615093816147e4565b9050919050565b600060208201905081810360008301526150b381614824565b9050919050565b600060208201905081810360008301526150d381614864565b9050919050565b600060208201905081810360008301526150f3816148a4565b9050919050565b60006020820190508181036000830152615113816148e4565b9050919050565b6000602082019050818103600083015261513381614924565b9050919050565b6000602082019050818103600083015261515381614964565b9050919050565b60006020820190508181036000830152615173816149a4565b9050919050565b60006020820190508181036000830152615193816149e4565b9050919050565b600060208201905081810360008301526151b381614a24565b9050919050565b600060208201905081810360008301526151d381614a64565b9050919050565b600060208201905081810360008301526151f381614aca565b9050919050565b6000602082019050818103600083015261521381614b30565b9050919050565b6000602082019050818103600083015261523381614b70565b9050919050565b6000602082019050818103600083015261525381614bb0565b9050919050565b6000602082019050818103600083015261527381614bf0565b9050919050565b6000602082019050818103600083015261529381614c30565b9050919050565b600060208201905081810360008301526152b381614c96565b9050919050565b600060208201905081810360008301526152d381614cd6565b9050919050565b600060208201905081810360008301526152f381614d16565b9050919050565b600060c08201905061530f6000830184614d56565b92915050565b60006101208201905061532b6000830184614dd1565b92915050565b60006020820190506153466000830184614e97565b92915050565b600060a0820190506153616000830188614e97565b61536e6020830187614689565b61537b6040830186614e97565b6153886060830185614e97565b61539560808301846146a7565b9695505050505050565b6000610180820190506153b5600083018f614e97565b6153c2602083018e6146a7565b6153cf604083018d614e97565b6153dc606083018c614e97565b6153e9608083018b614e97565b6153f660a083018a614e97565b61540360c08301896146a7565b81810360e083015261541581886147ab565b9050615425610100830187614e97565b615433610120830186614e97565b615441610140830185614e97565b61544f610160830184614714565b9d9c50505050505050505050505050565b6000610140820190506154766000830185614e97565b6154836020830184614dd1565b9392505050565b600060408201905061549f6000830185614e97565b6154ac6020830184614e97565b9392505050565b60006060820190506154c86000830186614e97565b6154d56020830185614e97565b6154e26040830184614714565b949350505050565b60006060820190506154ff6000830186614e97565b61550c6020830185614e97565b6155196040830184614e97565b949350505050565b60006080820190506155366000830187614e97565b6155436020830186614e97565b6155506040830185614e97565b61555d6060830184614e97565b95945050505050565b600060208201905061557b6000830184614ea6565b92915050565b6000604051905081810181811067ffffffffffffffff821117156155a457600080fd5b8060405250919050565b600067ffffffffffffffff8211156155c557600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600061565b82615678565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006156ba826156c1565b9050919050565b60006156cc826156d3565b9050919050565b60006156de82615678565b9050919050565b82818337600083830152505050565b60005b838110156157125780820151818401526020810190506156f7565b83811115615721576000848401525b50505050565b6000601f19601f8301169050919050565b61574181615650565b811461574c57600080fd5b50565b61575881615662565b811461576357600080fd5b50565b61576f8161566e565b811461577a57600080fd5b50565b61578681615698565b811461579157600080fd5b5056fea264697066735822122025b08abd32b60422ef60a54d476db798d85c4f81ac222245be0dafc5a9d0b11364736f6c63430006020033
Deployed Bytecode Sourcemap
35780:15463:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35780:15463:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37779:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;38488:18;;;:::i;:::-;;;;;;;;;;;;;;;;38030:25;;;:::i;:::-;;;;;;;;;;;;;;;;41409:137;;;;;;;;;;;;;;;;:::i;:::-;;38286:27;;;:::i;:::-;;;;;;;;;;;;;;;;38231:21;;;:::i;:::-;;;;;;;;;;;;;;;;39657:91;;;:::i;:::-;;;;;;;;;;;;;;;;44836:308;;;:::i;:::-;;38460:21;;;:::i;:::-;;;;;;;;;;;;;;;;41260:141;;;;;;;;;;;;;;;;:::i;:::-;;41695:145;;;;;;;;;;;;;;;;:::i;:::-;;39756:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44258:462;;;;;;;;;;;;;;;;:::i;:::-;;39988:118;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37923:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38202:22;;;:::i;:::-;;;;;;;;;;;;;;;;38322:25;;;:::i;:::-;;;;;;;;;;;;;;;;40765:140;;;;;;;;;;;;;;;;:::i;:::-;;39870:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46698:1052;;;;;;;;;;;;;;;;:::i;:::-;;44728:100;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43479:513;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45619:1071;;;;;;;;;;;;;;;;:::i;:::-;;39560:89;;;:::i;:::-;;;;;;;;;;;;;;;;47784:388;;;;;;;;;;;;;;;;:::i;:::-;;48180:426;;;;;;;;;;;;;;;;:::i;:::-;;40237:145;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38513:20;;;:::i;:::-;;;;;;;;;;;;;;;;37878:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40954:153;;;;;;;;;;;;;;;;:::i;:::-;;40114:115;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45152:459;;;:::i;:::-;;39157:395;;;;;;;;;;;;;;;;:::i;:::-;;41115:137;;;;;;;;;;;;;;;;:::i;:::-;;44000:250;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41554:129;;;;;;;;;;;;;;;;:::i;:::-;;42239:813;;;;;;;;;;;;;;;;:::i;:::-;;37831:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38062:28;;;:::i;:::-;;;;;;;;;;;;;;;;38354:25;;;:::i;:::-;;;;;;;;;;;;;;;;38386:23;;;:::i;:::-;;;;;;;;;;;;;;;;41875:335;;;;;;;;;;;;;;;;:::i;:::-;;40438:243;;;;;;;;;;;;;;;;:::i;:::-;;38099:21;;;:::i;:::-;;;;;;;;;;;;;;;;38154:19;;;:::i;:::-;;;;;;;;;;;;;;;;43060:411;;;;;;;;;;;;;;;;:::i;:::-;;37779:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38488:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38030:25::-;;;;:::o;41409:137::-;41485:10;;;;;;;;;;;41471:24;;:10;:24;;;41463:48;;;;;;;;;;;;;;;;;;;;;;41531:7;41522:6;:16;;;;41409:137;:::o;38286:27::-;;;;;;;;;;;;;:::o;38231:21::-;;;;:::o;39657:91::-;39701:7;39728:12;;39721:19;;39657:91;:::o;44836:308::-;44904:5;44882:27;;:6;:18;44889:10;44882:18;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;44874:45;;;;;;;;;;;;;;;;;;;;;;44951:4;44930:6;:18;44937:10;44930:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;44986:21;44996:10;44986:9;:21::i;:::-;44966:5;:17;44972:10;44966:17;;;;;;;;;;;;;;;:41;;;;45031:33;45046:5;:17;45052:10;45046:17;;;;;;;;;;;;;;;;45031:10;;:14;;:33;;;;:::i;:::-;45018:10;:46;;;;45080:56;45094:10;45106:5;:17;45112:10;45106:17;;;;;;;;;;;;;;;;45125:10;;45080:56;;;;;;;;;;;;;;;;;44836:308::o;38460:21::-;;;;;;;;;;;;;:::o;41260:141::-;41338:10;;;;;;;;;;;41324:24;;:10;:24;;;41316:48;;;;;;;;;;;;;;;;;;;;;;41385:8;41375:7;:18;;;;41260:141;:::o;41695:145::-;41775:10;;;;;;;;;;;41761:24;;:10;:24;;;41753:48;;;;;;;;;;;;;;;;;;;;;;41823:9;41812:8;;:20;;;;;;;;;;;;;;;;;;41695:145;:::o;39756:106::-;39811:7;39838;:16;39846:7;39838:16;;;;;;;;;;;;;;;;39831:23;;39756:106;;;:::o;44258:462::-;44338:4;44316:26;;:9;:13;44326:2;44316:13;;;;;;;;;;;:18;;;;;;;;;;;;:26;;;44308:44;;;;;;;;;;;;;;;;;;;;;;44391:12;44371:9;:13;44381:2;44371:13;;;;;;;;;;;:17;;;:32;44363:49;;;;;;;;;;;;;;;;;;;;;;44426:12;44440:16;44462:12;44471:2;44462:8;:12::i;:::-;44425:49;;;;;44485:12;44500:5;44485:20;;44544:9;:13;44554:2;44544:13;;;;;;;;;;;:28;;;44520:9;:13;44530:2;44520:13;;;;;;;;;;;:20;;;:52;44516:99;;44599:4;44589:14;;44516:99;44646:5;44625:9;:13;44635:2;44625:13;;;;;;;;;;;:18;;;:26;;;;;;;;;;;;;;;;;;44684:2;44667:45;44688:4;44694:8;44704:7;44667:45;;;;;;;;;;;;;;;;;44258:462;;;;:::o;39988:118::-;40044:16;40080:9;:18;40090:7;40080:18;;;;;;;;;;;;;;;40073:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39988:118;;;:::o;37923:43::-;;;;;;;;;;;;;;;;;:::o;38202:22::-;;;;:::o;38322:25::-;;;;;;;;;;;;;:::o;40765:140::-;40842:10;;;;;;;;;;;40828:24;;:10;:24;;;40820:48;;;;;;;;;;;;;;;;;;;;;;40889:8;40879:7;;:18;;;;;;;;;;;;;;;;;;40765:140;:::o;39870:110::-;39927:7;39954:9;:18;39964:7;39954:18;;;;;;;;;;;;;;;;39947:25;;39870:110;;;:::o;46698:1052::-;46779:12;46757:9;:13;46767:2;46757:13;;;;;;;;;;;:19;;;:34;46749:53;;;;;;;;;;;;;;;;;;;;;;46841:12;46821:9;:13;46831:2;46821:13;;;;;;;;;;;:17;;;:32;46813:49;;;;;;;;;;;;;;;;;;;;;;46875:12;46890:9;:13;46900:2;46890:13;;;;;;;;;;;:22;;:34;46913:10;46890:34;;;;;;;;;;;;;;;;46875:49;;46946:1;46939:4;:8;46935:161;;;46994:37;47026:4;46994:9;:13;47004:2;46994:13;;;;;;;;;;;:27;;;:31;;:37;;;;:::i;:::-;46964:9;:13;46974:2;46964:13;;;;;;;;;;;:27;;:67;;;;47083:1;47046:9;:13;47056:2;47046:13;;;;;;;;;;;:22;;:34;47069:10;47046:34;;;;;;;;;;;;;;;:38;;;;46935:161;47108:12;47123:87;47161:9;:13;47171:2;47161:13;;;;;;;;;;;:26;;:38;47188:10;47161:38;;;;;;;;;;;;;;;;47123:19;47131:10;47123:7;:19::i;:::-;:23;;:87;;;;:::i;:::-;47108:102;;47255:65;47305:4;47255:9;:13;47265:2;47255:13;;;;;;;;;;;:31;;;:35;;:65;;;;:::i;:::-;47221:9;:13;47231:2;47221:13;;;;;;;;;;;:31;;:99;;;;47372:19;47380:10;47372:7;:19::i;:::-;47331:9;:13;47341:2;47331:13;;;;;;;;;;;:26;;:38;47358:10;47331:38;;;;;;;;;;;;;;;:60;;;;47440:10;;47404:9;:13;47414:2;47404:13;;;;;;;;;;;:33;;:46;;;;47461:14;47478:88;47524:9;:13;47534:2;47524:13;;;;;;;;;;;:31;;;47478:9;:13;47488:2;47478:13;;;;;;;;;;;:27;;;:31;;:88;;;;:::i;:::-;47461:105;;47600:33;47622:10;;47600:17;47611:5;47600:6;:10;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;47577:9;:13;47587:2;47577:13;;;;;;;;;;;:20;;:56;;;;47669:22;47678:12;47669:4;;:8;;:22;;;;:::i;:::-;47646:8;:20;47655:10;47646:20;;;;;;;;;;;;;;;:45;;;;47718:10;47709:33;;47714:2;47709:33;47730:5;47737:4;47709:33;;;;;;;;;;;;;;;;46698:1052;;;;:::o;44728:100::-;44781:7;44808:5;:12;44814:5;44808:12;;;;;;;;;;;;;;;;44801:19;;44728:100;;;:::o;43479:513::-;43571:12;43598:16;43629:15;43679:9;:13;43689:2;43679:13;;;;;;;;;;;:27;;;43672:34;;43728:9;:13;43738:2;43728:13;;;;;;;;;;;:31;;;43717:42;;43772:14;43789:18;43798:8;43789:4;:8;;:18;;;;:::i;:::-;43772:35;;43825:27;43845:6;43825:15;43834:5;43825:4;:8;;:15;;;;:::i;:::-;:19;;:27;;;;:::i;:::-;43818:34;;43874:31;43898:6;43874:19;43887:5;43874:8;:12;;:19;;;;:::i;:::-;:23;;:31;;;;:::i;:::-;43863:42;;43928:56;43950:9;:13;43960:2;43950:13;;;;;;;;;;;:33;;;43928:17;43939:5;43928:6;:10;;:17;;;;:::i;:::-;:21;;:56;;;;:::i;:::-;43918:66;;43479:513;;;;;;:::o;45619:1071::-;45696:12;45674:9;:13;45684:2;45674:13;;;;;;;;;;;:19;;;:34;45666:53;;;;;;;;;;;;;;;;;;;;;;45758:12;45738:9;:13;45748:2;45738:13;;;;;;;;;;;:17;;;:32;45730:49;;;;;;;;;;;;;;;;;;;;;;45792:16;45811:9;:13;45821:2;45811:13;;;;;;;;;;;:26;;:38;45838:10;45811:38;;;;;;;;;;;;;;;;45792:57;;45875:1;45864:8;:12;45860:217;;;45927:81;45999:8;45927:9;:13;45937:2;45927:13;;;;;;;;;;;:49;;;:71;;:81;;;;:::i;:::-;45893:9;:13;45903:2;45893:13;;;;;;;;;;;:31;;:115;;;;46064:1;46023:9;:13;46033:2;46023:13;;;;;;;;;;;:26;;:38;46050:10;46023:38;;;;;;;;;;;;;;;:42;;;;45860:217;46089:12;46104:83;46142:9;:13;46152:2;46142:13;;;;;;;;;;;:22;;:34;46165:10;46142:34;;;;;;;;;;;;;;;;46104:19;46112:10;46104:7;:19::i;:::-;:23;;:83;;;;:::i;:::-;46089:98;;46228:37;46260:4;46228:9;:13;46238:2;46228:13;;;;;;;;;;;:27;;;:31;;:37;;;;:::i;:::-;46198:9;:13;46208:2;46198:13;;;;;;;;;;;:27;;:67;;;;46313:19;46321:10;46313:7;:19::i;:::-;46276:9;:13;46286:2;46276:13;;;;;;;;;;;:22;;:34;46299:10;46276:34;;;;;;;;;;;;;;;:56;;;;46381:10;;46345:9;:13;46355:2;46345:13;;;;;;;;;;;:33;;:46;;;;46402:14;46419:88;46465:9;:13;46475:2;46465:13;;;;;;;;;;;:31;;;46419:9;:13;46429:2;46419:13;;;;;;;;;;;:27;;;:31;;:88;;;;:::i;:::-;46402:105;;46541:33;46563:10;;46541:17;46552:5;46541:6;:10;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;46518:9;:13;46528:2;46518:13;;;;;;;;;;;:20;;:56;;;;46610:22;46619:12;46610:4;;:8;;:22;;;;:::i;:::-;46587:8;:20;46596:10;46587:20;;;;;;;;;;;;;;;:45;;;;46659:10;46650:32;;46655:2;46650:32;46671:4;46677;46650:32;;;;;;;;;;;;;;;;45619:1071;;;;:::o;39560:89::-;39603:7;39630:11;;39623:18;;39560:89;:::o;47784:388::-;47866:1;47857:6;:10;47849:37;;;;;;;;;;;;;;;;;;;;;;47897:14;47914:24;47923:6;47931;47914:8;:24::i;:::-;47897:41;;47975:4;47953:26;;:6;:18;47960:10;47953:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;47949:158;;;48016:29;48038:6;48016:5;:17;48022:10;48016:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;47996:5;:17;48002:10;47996:17;;;;;;;;;;;;;;;:49;;;;48073:22;48088:6;48073:10;;:14;;:22;;;;:::i;:::-;48060:10;:35;;;;47949:158;48129:10;48122:42;;;48141:6;48149;48157;48122:42;;;;;;;;;;;;;;;;;47784:388;;;:::o;48180:426::-;48233:14;48250:20;48262:7;48250:11;:20::i;:::-;48233:37;;48307:4;48285:26;;:6;:18;48292:10;48285:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;48281:158;;;48348:29;48370:6;48348:5;:17;48354:10;48348:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;48328:5;:17;48334:10;48328:17;;;;;;;;;;;;;;;:49;;;;48405:22;48420:6;48405:10;;:14;;:22;;;;:::i;:::-;48392:10;:35;;;;48281:158;48464:5;48453:16;;:7;;;;;;;;;;;:16;;;48449:104;;;48517:12;48494:8;:20;48503:10;48494:20;;;;;;;;;;;;;;;;:35;48486:55;;;;;;;;;;;;;;;;;;;;;;48449:104;48578:10;48568:30;;;48590:7;48568:30;;;;;;;;;;;;;;;48180:426;;:::o;40237:145::-;40320:13;;:::i;:::-;40358:8;:16;40367:6;40358:16;;;;;;;;;;;40351:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40237:145;;;:::o;38513:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37878:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;40954:153::-;41038:10;;;;;;;;;;;41024:24;;:10;:24;;;41016:48;;;;;;;;;;;;;;;;;;;;;;41088:11;41075:10;;:24;;;;;;;;;;;;;;;;;;40954:153;:::o;40114:115::-;40169:14;;:::i;:::-;40203:9;:18;40213:7;40203:18;;;;;;;;;;;40196:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40114:115;;;:::o;45152:459::-;45218:4;45196:26;;:6;:18;45203:10;45196:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;45188:45;;;;;;;;;;;;;;;;;;;;;;45265:5;45244:6;:18;45251:10;45244:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;45298:5;:17;45304:10;45298:17;;;;;;;;;;;;;;;;45285:10;;:30;45281:221;;;45410:1;45397:10;:14;;;;45281:221;;;45457:33;45472:5;:17;45478:10;45472:17;;;;;;;;;;;;;;;;45457:10;;:14;;:33;;;;:::i;:::-;45444:10;:46;;;;45281:221;45517:54;45529:10;45541:5;:17;45547:10;45541:17;;;;;;;;;;;;;;;;45560:10;;45517:54;;;;;;;;;;;;;;;;;45602:1;45582:5;:17;45588:10;45582:17;;;;;;;;;;;;;;;:21;;;;45152:459::o;39157:395::-;32564:16;32583:13;:11;:13::i;:::-;32564:32;;32629:12;;;;;;;;;;;:48;;;;32662:15;:13;:15::i;:::-;32629:48;:103;;;;32709:23;;32698:8;:34;32629:103;32607:199;;;;;;;;;;;;;;;;;;;;;;32819:19;32842:12;;;;;;;;;;;32841:13;32819:35;;32869:14;32865:115;;;32915:4;32900:12;;:19;;;;;;;;;;;;;;;;;;32960:8;32934:23;:34;;;;32865:115;39302:43:::1;:41;:43::i;:::-;39371:11;39358:10;;:24;;;;;;;;;;;;;;;;;;39406:11;39393:10;;:24;;;;;;;;;;;;;;;;;;39439:9;39428:8;;:20;;;;;;;;;;;;;;;;;;39472:2;39461:8;;:13;;;;;;;;;;;;;;;;;;39485:33;;;;;;;;;;;;;;;;::::0;:4:::1;:33;;;;;;;;;;;;:::i;:::-;;39529:15;;;;;;;;;;;;;;;;::::0;:6:::1;:15;;;;;;;;;;;;:::i;:::-;;33010:14:::0;33006:67;;;33056:5;33041:12;;:20;;;;;;;;;;;;;;;;;;33006:67;39157:395;;;;;:::o;41115:137::-;41191:10;;;;;;;;;;;41177:24;;:10;:24;;;41169:48;;;;;;;;;;;;;;;;;;;;;;41237:7;41228:6;:16;;;;41115:137;:::o;44000:250::-;44098:7;44107;44154:9;:13;44164:2;44154:13;;;;;;;;;;;:22;;:29;44177:5;44154:29;;;;;;;;;;;;;;;;44198:9;:13;44208:2;44198:13;;;;;;;;;;;:26;;:33;44225:5;44198:33;;;;;;;;;;;;;;;;44132:110;;;;44000:250;;;;;:::o;41554:129::-;41626:10;;;;;;;;;;;41612:24;;:10;:24;;;41604:48;;;;;;;;;;;;;;;;;;;;;;41670:5;41663:4;:12;;;;41554:129;:::o;42239:813::-;42342:7;;42320:19;42328:10;42320:7;:19::i;:::-;:29;42312:50;;;;;;;;;;;;;;;;;;;;;;42402:422;;;;;;;;42430:13;;42402:422;;;;42468:10;42402:422;;;;;;42508:1;42402:422;;;;42543:1;42402:422;;;;42566:12;42402:422;;;;42598:24;42609:12;42598:6;;:10;;:24;;;;:::i;:::-;42402:422;;;;42647:8;42402:422;;;;;;42676:4;42402:422;;;;42716:10;;42402:422;;;;42749:1;42402:422;;;;42781:6;;42402:422;;;;42808:4;42402:422;;;;;42373:9;:26;42383:13;;:15;;;;;;;;;;;;42373:26;;;;;;;;;;;:451;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42842:146;42868:13;;42896:10;42921:12;42948:6;;42969:8;42842:146;;;;;;;;;;;;;;;;;;;43022:22;43031:12;43022:4;;:8;;:22;;;;:::i;:::-;42999:8;:20;43008:10;42999:20;;;;;;;;;;;;;;;:45;;;;42239:813;;:::o;37831:40::-;;;;;;;;;;;;;;;;;:::o;38062:28::-;;;;:::o;38354:25::-;;;;;;;;;;;;;:::o;38386:23::-;;;;;;;;;;;;;:::o;41875:335::-;42043:10;;;;;;;;;;;42029:24;;:10;:24;;;42021:48;;;;;;;;;;;;;;;;;;;;;;42108:8;42080;:16;42089:6;42080:16;;;;;;;;;;;:25;;:36;;;;42153:6;42127:8;:16;42136:6;42127:16;;;;;;;;;;;:23;;:32;;;;42196:6;42170:8;:16;42179:6;42170:16;;;;;;;;;;;:23;;:32;;;;41875:335;;;;:::o;40438:243::-;40527:10;;;;;;;;;;;40513:24;;:10;:24;;;40505:48;;;;;;;;;;;;;;;;;;;;;;40582:10;;;;;;;;;;;40572:20;;:6;:20;;;;40564:51;;;;;;;;;;;;;;;;;;;;;;40626:47;40654:10;;;;;;;;;;;40666:6;40633;40626:27;;;;:47;;;;;:::i;:::-;40438:243;;:::o;38099:21::-;;;;:::o;38154:19::-;;;;:::o;43060:411::-;43108:12;43122:16;43140:15;43159:12;43168:2;43159:8;:12::i;:::-;43107:64;;;;;;43221:7;43190:9;:13;43200:2;43190:13;;;;;;;;;;;:28;;;:38;43182:58;;;;;;;;;;;;;;;;;;;;;;43279:12;43259:9;:13;43269:2;43259:13;;;;;;;;;;;:17;;;:32;43251:49;;;;;;;;;;;;;;;;;;;;;;43337:4;43315:26;;:9;:13;43325:2;43315:13;;;;;;;;;;;:18;;;;;;;;;;;;:26;;;43311:73;;;43358:14;43369:2;43358:10;:14::i;:::-;43311:73;43403:9;:13;43413:2;43403:13;;;;;;;;;;;:22;;;;;;;;;;;;43394:40;;;43435:2;43439:4;43445:8;43455:7;43394:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43394:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43394:69:0;;;;43060:411;;;;:::o;12108:181::-;12166:7;12186:9;12202:1;12198;:5;12186:17;;12227:1;12222;:6;;12214:46;;;;;;;;;;;;;;;;;;;;;;12280:1;12273:8;;;12108:181;;;;:::o;12572:136::-;12630:7;12657:43;12661:1;12664;12657:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;12650:50;;12572:136;;;;:::o;13462:471::-;13520:7;13770:1;13765;:6;13761:47;;;13795:1;13788:8;;;;13761:47;13820:9;13836:1;13832;:5;13820:17;;13865:1;13860;13856;:5;;;;;;:10;13848:56;;;;;;;;;;;;;;;;;;;;;;13924:1;13917:8;;;13462:471;;;;;:::o;14409:132::-;14467:7;14494:39;14498:1;14501;14494:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;14487:46;;14409:132;;;;:::o;48614:1000::-;48700:7;48725:22;;:::i;:::-;48750:246;;;;;;;;48772:10;48750:246;;;;;;48797:6;48750:246;;;;48818:3;48750:246;;;;48836:8;:16;48845:6;48836:16;;;;;;;;;;;:25;;;48750:246;;;;48876:8;:16;48885:6;48876:16;;;;;;;;;;;:23;;;48750:246;;;;48914:8;:16;48923:6;48914:16;;;;;;;;;;;:23;;;48750:246;;;;48952:1;48750:246;;;;48968:1;48750:246;;;;48984:1;48750:246;;;48725:271;;49007:15;49046:11;;:13;;;;;;;;;;;;49061:7;49035:34;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;49035:34:0;;;49025:45;;;;;;49007:63;;49102:7;49081:9;:18;49091:7;49081:18;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49120:9;:21;49130:10;49120:21;;;;;;;;;;;;;;;49147:7;49120:35;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;49120:35:0;;;;;;;;;;;;;;;;;;;49180:23;49196:6;49180:11;;:15;;:23;;;;:::i;:::-;49166:11;:37;;;;49236:31;49260:6;49236:7;:19;49244:10;49236:19;;;;;;;;;;;;;;;;:23;;:31;;;;:::i;:::-;49214:7;:19;49222:10;49214:19;;;;;;;;;;;;;;;:53;;;;49278:14;49295:47;49337:4;49295:37;49306:9;:18;49316:7;49306:18;;;;;;;;;;;:25;;;49295:6;:10;;:37;;;;:::i;:::-;:41;;:47;;;;:::i;:::-;49278:64;;49370:1;49361:6;:10;49353:30;;;;;;;;;;;;;;;;;;;;;;49409:24;49426:6;49409:12;;:16;;:24;;;;:::i;:::-;49394:12;:39;;;;49468:33;49494:6;49468:9;:21;49478:10;49468:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;49444:9;:21;49454:10;49444:21;;;;;;;;;;;;;;;:57;;;;49512:70;49548:10;49568:4;49575:6;49519:10;;;;;;;;;;;49512:35;;;;:70;;;;;;:::i;:::-;49600:6;49593:13;;;;;48614:1000;;;;:::o;49663:1205::-;49719:7;49739:10;49752:33;49765:10;49777:7;49752:12;:33::i;:::-;49739:46;;49818:2;49804;:17;;49796:47;;;;;;;;;;;;;;;;;;;;;;49854:23;;:::i;:::-;49880:9;:18;49890:7;49880:18;;;;;;;;;;;49854:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49923:37;49942:8;:17;;;49923:8;:14;;;:18;;:37;;;;:::i;:::-;49917:3;:43;49909:77;;;;;;;;;;;;;;;;;;;;;;50008:14;50025:8;:15;;;50008:32;;50065:23;50081:6;50065:11;;:15;;:23;;;;:::i;:::-;50051:11;:37;;;;50121:31;50145:6;50121:7;:19;50129:10;50121:19;;;;;;;;;;;;;;;;:23;;:31;;;;:::i;:::-;50099:7;:19;50107:10;50099:19;;;;;;;;;;;;;;;:53;;;;50163:14;50180:37;50212:4;50180:27;50191:8;:15;;;50180:6;:10;;:27;;;;:::i;:::-;:31;;:37;;;;:::i;:::-;50163:54;;50245:1;50236:6;:10;50228:30;;;;;;;;;;;;;;;;;;;;;;50284:24;50301:6;50284:12;;:16;;:24;;;;:::i;:::-;50269:12;:39;;;;50343:33;50369:6;50343:9;:21;50353:10;50343:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;50319:9;:21;50329:10;50319:21;;;;;;;;;;;;;;;:57;;;;50389:12;50435:1;50404:9;:21;50414:10;50404:21;;;;;;;;;;;;;;;:28;;;;:32;50389:47;;50475:9;:21;50485:10;50475:21;;;;;;;;;;;;;;;50497:4;50475:27;;;;;;;;;;;;;;;;50447:9;:21;50457:10;50447:21;;;;;;;;;;;;;;;50469:2;50447:25;;;;;;;;;;;;;;;:55;;;;50513:9;:21;50523:10;50513:21;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;50558:9;:18;50568:7;50558:18;;;;;;;;;;;;50551:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50589:51;50621:10;50633:6;50596:10;;;;;;;;;;;50589:31;;;;:51;;;;;:::i;:::-;50673:1;50654:8;:15;;;:20;50651:186;;50691:14;50708:37;50740:4;50708:27;50719:8;:15;;;50708:6;:10;;:27;;;;:::i;:::-;:31;;:37;;;;:::i;:::-;50691:54;;50760:65;50796:8;;;;;;;;;;;50806:10;50818:6;50767:10;;;;;;;;;;;50760:35;;;;:65;;;;;;:::i;:::-;50651:186;;50854:6;50847:13;;;;;;;49663:1205;;;:::o;39047:102::-;39102:7;39137:3;39122:19;;39047:102;:::o;33370:570::-;33417:4;33788:10;33887:9;33875:22;33869:28;;33931:1;33925:2;:7;33918:14;;;33370:570;:::o;30489:83::-;30560:4;30546:11;;:18;;;;;;;;;;;;;;;;;;30489:83::o;26098:177::-;26181:86;26201:5;26231:23;;;26256:2;26260:5;26208:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26208:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;26208:58:0;26181:19;:86::i;:::-;26098:177;;;:::o;13011:192::-;13097:7;13130:1;13125;:6;;13133:12;13117:29;;;;;;;;;;;;;;;;;;;;;;;;;13157:9;13173:1;13169;:5;13157:17;;13194:1;13187:8;;;13011:192;;;;;:::o;15037:278::-;15123:7;15155:1;15151;:5;15158:12;15143:28;;;;;;;;;;;;;;;;;;;;;;;;;15182:9;15198:1;15194;:5;;;;;;15182:17;;15306:1;15299:8;;;15037:278;;;;;:::o;26283:205::-;26384:96;26404:5;26434:27;;;26463:4;26469:2;26473:5;26411:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;26411:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;26411:68:0;26384:19;:96::i;:::-;26283:205;;;;:::o;50876:364::-;50982:7;51007:14;51024:9;:18;51034:7;51024:18;;;;;;;;;;;;;;;:25;;;;51007:42;;51065:9;51077:1;51065:13;;51060:144;51084:6;51080:1;:10;51060:144;;;51127:9;:18;51137:7;51127:18;;;;;;;;;;;;;;;51146:1;51127:21;;;;;;;;;;;;;;;;51116:7;:32;51112:81;;;51176:1;51169:8;;;;;;51112:81;51092:3;;;;;51060:144;;;;51229:2;51214:18;;;50876:364;;;;;:::o;28403:761::-;28827:23;28853:69;28881:4;28853:69;;;;;;;;;;;;;;;;;28861:5;28853:27;;;;:69;;;;;:::i;:::-;28827:95;;28957:1;28937:10;:17;:21;28933:224;;;29079:10;29068:30;;;;;;;;;;;;;;29060:85;;;;;;;;;;;;;;;;;;;;;;28933:224;28403:761;;;:::o;23143:196::-;23246:12;23278:53;23301:6;23309:4;23315:1;23318:12;23278:22;:53::i;:::-;23271:60;;23143:196;;;;;:::o;24520:979::-;24650:12;24683:18;24694:6;24683:10;:18::i;:::-;24675:60;;;;;;;;;;;;;;;;;;;;;;24809:12;24823:23;24850:6;:11;;24870:8;24881:4;24850:36;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;24808:78:0;;;;24901:7;24897:595;;;24932:10;24925:17;;;;;;24897:595;25066:1;25046:10;:17;:21;25042:439;;;25309:10;25303:17;25370:15;25357:10;25353:2;25349:19;25342:44;25257:148;25452:12;25445:20;;;;;;;;;;;;;;;;;;;;24520:979;;;;;;;:::o;20028:619::-;20088:4;20350:16;20377:19;20399:66;20377:88;;;;20568:7;20556:20;20544:32;;20608:11;20596:8;:23;;:42;;;;;20635:3;20623:15;;:8;:15;;20596:42;20588:51;;;;20028:619;;;:::o;35780:15463::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:124;;219:6;206:20;197:29;;231:30;255:5;231:30;;;191:75;;;;;273:128;;354:6;348:13;339:22;;366:30;390:5;366:30;;;333:68;;;;;408:130;;488:6;475:20;466:29;;500:33;527:5;500:33;;;460:78;;;;;546:442;;648:3;641:4;633:6;629:17;625:27;615:2;;666:1;663;656:12;615:2;703:6;690:20;725:65;740:49;782:6;740:49;;;725:65;;;716:74;;810:6;803:5;796:21;846:4;838:6;834:17;879:4;872:5;868:16;914:3;905:6;900:3;896:16;893:25;890:2;;;931:1;928;921:12;890:2;941:41;975:6;970:3;965;941:41;;;608:380;;;;;;;;996:130;;1076:6;1063:20;1054:29;;1088:33;1115:5;1088:33;;;1048:78;;;;;1133:241;;1237:2;1225:9;1216:7;1212:23;1208:32;1205:2;;;1253:1;1250;1243:12;1205:2;1288:1;1305:53;1350:7;1341:6;1330:9;1326:22;1305:53;;;1295:63;;1267:97;1199:175;;;;;1381:491;;;;1519:2;1507:9;1498:7;1494:23;1490:32;1487:2;;;1535:1;1532;1525:12;1487:2;1570:1;1587:53;1632:7;1623:6;1612:9;1608:22;1587:53;;;1577:63;;1549:97;1677:2;1695:53;1740:7;1731:6;1720:9;1716:22;1695:53;;;1685:63;;1656:98;1785:2;1803:53;1848:7;1839:6;1828:9;1824:22;1803:53;;;1793:63;;1764:98;1481:391;;;;;;1879:472;;;2010:2;1998:9;1989:7;1985:23;1981:32;1978:2;;;2026:1;2023;2016:12;1978:2;2061:1;2078:53;2123:7;2114:6;2103:9;2099:22;2078:53;;;2068:63;;2040:97;2196:2;2185:9;2181:18;2168:32;2220:18;2212:6;2209:30;2206:2;;;2252:1;2249;2242:12;2206:2;2272:63;2327:7;2318:6;2307:9;2303:22;2272:63;;;2262:73;;2147:194;1972:379;;;;;;2358:366;;;2479:2;2467:9;2458:7;2454:23;2450:32;2447:2;;;2495:1;2492;2485:12;2447:2;2530:1;2547:53;2592:7;2583:6;2572:9;2568:22;2547:53;;;2537:63;;2509:97;2637:2;2655:53;2700:7;2691:6;2680:9;2676:22;2655:53;;;2645:63;;2616:98;2441:283;;;;;;2731:235;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2883:1;2900:50;2942:7;2933:6;2922:9;2918:22;2900:50;;;2890:60;;2862:94;2794:172;;;;;2973:257;;3085:2;3073:9;3064:7;3060:23;3056:32;3053:2;;;3101:1;3098;3091:12;3053:2;3136:1;3153:61;3206:7;3197:6;3186:9;3182:22;3153:61;;;3143:71;;3115:105;3047:183;;;;;3237:241;;3341:2;3329:9;3320:7;3316:23;3312:32;3309:2;;;3357:1;3354;3347:12;3309:2;3392:1;3409:53;3454:7;3445:6;3434:9;3430:22;3409:53;;;3399:63;;3371:97;3303:175;;;;;3485:366;;;3606:2;3594:9;3585:7;3581:23;3577:32;3574:2;;;3622:1;3619;3612:12;3574:2;3657:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;;;3664:63;;3636:97;3764:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;;;3772:63;;3743:98;3568:283;;;;;;3858:617;;;;;4013:3;4001:9;3992:7;3988:23;3984:33;3981:2;;;4030:1;4027;4020:12;3981:2;4065:1;4082:53;4127:7;4118:6;4107:9;4103:22;4082:53;;;4072:63;;4044:97;4172:2;4190:53;4235:7;4226:6;4215:9;4211:22;4190:53;;;4180:63;;4151:98;4280:2;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;;;4288:63;;4259:98;4388:2;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;;;4396:63;;4367:98;3975:500;;;;;;;;4482:241;;4586:2;4574:9;4565:7;4561:23;4557:32;4554:2;;;4602:1;4599;4592:12;4554:2;4637:1;4654:53;4699:7;4690:6;4679:9;4675:22;4654:53;;;4644:63;;4616:97;4548:175;;;;;4730:366;;;4851:2;4839:9;4830:7;4826:23;4822:32;4819:2;;;4867:1;4864;4857:12;4819:2;4902:1;4919:53;4964:7;4955:6;4944:9;4940:22;4919:53;;;4909:63;;4881:97;5009:2;5027:53;5072:7;5063:6;5052:9;5048:22;5027:53;;;5017:63;;4988:98;4813:283;;;;;;5104:173;;5191:46;5233:3;5225:6;5191:46;;;5266:4;5261:3;5257:14;5243:28;;5184:93;;;;;5285:142;5376:45;5415:5;5376:45;;;5371:3;5364:58;5358:69;;;5434:103;5507:24;5525:5;5507:24;;;5502:3;5495:37;5489:48;;;5544:113;5627:24;5645:5;5627:24;;;5622:3;5615:37;5609:48;;;5695:690;;5840:54;5888:5;5840:54;;;5907:86;5986:6;5981:3;5907:86;;;5900:93;;6014:56;6064:5;6014:56;;;6090:7;6118:1;6103:260;6128:6;6125:1;6122:13;6103:260;;;6195:6;6189:13;6216:63;6275:3;6260:13;6216:63;;;6209:70;;6296:60;6349:6;6296:60;;;6286:70;;6160:203;6150:1;6147;6143:9;6138:14;;6103:260;;;6107:14;6376:3;6369:10;;5819:566;;;;;;;;6393:104;6470:21;6485:5;6470:21;;;6465:3;6458:34;6452:45;;;6504:103;6577:24;6595:5;6577:24;;;6572:3;6565:37;6559:48;;;6614:113;6697:24;6715:5;6697:24;;;6692:3;6685:37;6679:48;;;6734:356;;6862:38;6894:5;6862:38;;;6912:88;6993:6;6988:3;6912:88;;;6905:95;;7005:52;7050:6;7045:3;7038:4;7031:5;7027:16;7005:52;;;7078:6;7073:3;7069:16;7062:23;;6842:248;;;;;;7097:347;;7209:39;7242:5;7209:39;;;7260:71;7324:6;7319:3;7260:71;;;7253:78;;7336:52;7381:6;7376:3;7369:4;7362:5;7358:16;7336:52;;;7409:29;7431:6;7409:29;;;7404:3;7400:39;7393:46;;7189:255;;;;;;7451:339;;7559:35;7588:5;7559:35;;;7606:71;7670:6;7665:3;7606:71;;;7599:78;;7682:52;7727:6;7722:3;7715:4;7708:5;7704:16;7682:52;;;7755:29;7777:6;7755:29;;;7750:3;7746:39;7739:46;;7539:251;;;;;;7798:306;;7958:66;8022:1;8017:3;7958:66;;;7951:73;;8057:9;8053:1;8048:3;8044:11;8037:30;8095:2;8090:3;8086:12;8079:19;;7944:160;;;;8113:321;;8273:67;8337:2;8332:3;8273:67;;;8266:74;;8373:23;8369:1;8364:3;8360:11;8353:44;8425:2;8420:3;8416:12;8409:19;;8259:175;;;;8443:311;;8603:67;8667:2;8662:3;8603:67;;;8596:74;;8703:13;8699:1;8694:3;8690:11;8683:34;8745:2;8740:3;8736:12;8729:19;;8589:165;;;;8763:314;;8923:67;8987:2;8982:3;8923:67;;;8916:74;;9023:16;9019:1;9014:3;9010:11;9003:37;9068:2;9063:3;9059:12;9052:19;;8909:168;;;;9086:305;;9246:66;9310:1;9305:3;9246:66;;;9239:73;;9345:8;9341:1;9336:3;9332:11;9325:29;9382:2;9377:3;9373:12;9366:19;;9232:159;;;;9400:327;;9560:67;9624:2;9619:3;9560:67;;;9553:74;;9660:29;9656:1;9651:3;9647:11;9640:50;9718:2;9713:3;9709:12;9702:19;;9546:181;;;;9736:307;;9896:66;9960:1;9955:3;9896:66;;;9889:73;;9995:10;9991:1;9986:3;9982:11;9975:31;10034:2;10029:3;10025:12;10018:19;;9882:161;;;;10052:306;;10212:66;10276:1;10271:3;10212:66;;;10205:73;;10311:9;10307:1;10302:3;10298:11;10291:30;10349:2;10344:3;10340:12;10333:19;;10198:160;;;;10367:317;;10527:67;10591:2;10586:3;10527:67;;;10520:74;;10627:19;10623:1;10618:3;10614:11;10607:40;10675:2;10670:3;10666:12;10659:19;;10513:171;;;;10693:306;;10853:66;10917:1;10912:3;10853:66;;;10846:73;;10952:9;10948:1;10943:3;10939:11;10932:30;10990:2;10985:3;10981:12;10974:19;;10839:160;;;;11008:370;;11168:67;11232:2;11227:3;11168:67;;;11161:74;;11268:34;11264:1;11259:3;11255:11;11248:55;11337:3;11332:2;11327:3;11323:12;11316:25;11369:2;11364:3;11360:12;11353:19;;11154:224;;;;11387:383;;11547:67;11611:2;11606:3;11547:67;;;11540:74;;11647:34;11643:1;11638:3;11634:11;11627:55;11716:16;11711:2;11706:3;11702:12;11695:38;11761:2;11756:3;11752:12;11745:19;;11533:237;;;;11779:303;;11939:66;12003:1;11998:3;11939:66;;;11932:73;;12038:6;12034:1;12029:3;12025:11;12018:27;12073:2;12068:3;12064:12;12057:19;;11925:157;;;;12091:303;;12251:66;12315:1;12310:3;12251:66;;;12244:73;;12350:6;12346:1;12341:3;12337:11;12330:27;12385:2;12380:3;12376:12;12369:19;;12237:157;;;;12403:329;;12563:67;12627:2;12622:3;12563:67;;;12556:74;;12663:31;12659:1;12654:3;12650:11;12643:52;12723:2;12718:3;12714:12;12707:19;;12549:183;;;;12741:304;;12901:66;12965:1;12960:3;12901:66;;;12894:73;;13000:7;12996:1;12991:3;12987:11;12980:28;13036:2;13031:3;13027:12;13020:19;;12887:158;;;;13054:379;;13214:67;13278:2;13273:3;13214:67;;;13207:74;;13314:34;13310:1;13305:3;13301:11;13294:55;13383:12;13378:2;13373:3;13369:12;13362:34;13424:2;13419:3;13415:12;13408:19;;13200:233;;;;13442:305;;13602:66;13666:1;13661:3;13602:66;;;13595:73;;13701:8;13697:1;13692:3;13688:11;13681:29;13738:2;13733:3;13729:12;13722:19;;13588:159;;;;13756:304;;13916:66;13980:1;13975:3;13916:66;;;13909:73;;14015:7;14011:1;14006:3;14002:11;13995:28;14051:2;14046:3;14042:12;14035:19;;13902:158;;;;14069:318;;14229:67;14293:2;14288:3;14229:67;;;14222:74;;14329:20;14325:1;14320:3;14316:11;14309:41;14378:2;14373:3;14369:12;14362:19;;14215:172;;;;14468:1125;14609:4;14604:3;14600:14;14696:4;14689:5;14685:16;14679:23;14708:63;14765:4;14760:3;14756:14;14742:12;14708:63;;;14629:148;14852:4;14845:5;14841:16;14835:23;14864:63;14921:4;14916:3;14912:14;14898:12;14864:63;;;14787:146;15008:4;15001:5;14997:16;14991:23;15020:63;15077:4;15072:3;15068:14;15054:12;15020:63;;;14943:146;15171:4;15164:5;15160:16;15154:23;15183:63;15240:4;15235:3;15231:14;15217:12;15183:63;;;15099:153;15334:4;15327:5;15323:16;15317:23;15346:63;15403:4;15398:3;15394:14;15380:12;15346:63;;;15262:153;15497:4;15490:5;15486:16;15480:23;15509:63;15566:4;15561:3;15557:14;15543:12;15509:63;;;15425:153;14582:1011;;;;15675:1601;15818:6;15813:3;15809:16;15906:4;15899:5;15895:16;15889:23;15918:63;15975:4;15970:3;15966:14;15952:12;15918:63;;;15840:147;16062:4;16055:5;16051:16;16045:23;16074:63;16131:4;16126:3;16122:14;16108:12;16074:63;;;15997:146;16217:4;16210:5;16206:16;16200:23;16229:63;16286:4;16281:3;16277:14;16263:12;16229:63;;;16153:145;16375:4;16368:5;16364:16;16358:23;16387:63;16444:4;16439:3;16435:14;16421:12;16387:63;;;16308:148;16531:4;16524:5;16520:16;16514:23;16543:63;16600:4;16595:3;16591:14;16577:12;16543:63;;;16466:146;16687:4;16680:5;16676:16;16670:23;16699:63;16756:4;16751:3;16747:14;16733:12;16699:63;;;16622:146;16850:4;16843:5;16839:16;16833:23;16862:63;16919:4;16914:3;16910:14;16896:12;16862:63;;;16778:153;17013:4;17006:5;17002:16;16996:23;17025:63;17082:4;17077:3;17073:14;17059:12;17025:63;;;16941:153;17176:6;17169:5;17165:18;17159:25;17190:65;17247:6;17242:3;17238:16;17224:12;17190:65;;;17104:157;15791:1485;;;;17283:103;17356:24;17374:5;17356:24;;;17351:3;17344:37;17338:48;;;17393:113;17476:24;17494:5;17476:24;;;17471:3;17464:37;17458:48;;;17513:107;17592:22;17608:5;17592:22;;;17587:3;17580:35;17574:46;;;17627:262;;17771:93;17860:3;17851:6;17771:93;;;17764:100;;17881:3;17874:10;;17752:137;;;;;17896:213;;18014:2;18003:9;17999:18;17991:26;;18028:71;18096:1;18085:9;18081:17;18072:6;18028:71;;;17985:124;;;;;18116:451;;18298:2;18287:9;18283:18;18275:26;;18312:79;18388:1;18377:9;18373:17;18364:6;18312:79;;;18402:72;18470:2;18459:9;18455:18;18446:6;18402:72;;;18485;18553:2;18542:9;18538:18;18529:6;18485:72;;;18269:298;;;;;;;18574:435;;18748:2;18737:9;18733:18;18725:26;;18762:71;18830:1;18819:9;18815:17;18806:6;18762:71;;;18844:72;18912:2;18901:9;18897:18;18888:6;18844:72;;;18927;18995:2;18984:9;18980:18;18971:6;18927:72;;;18719:290;;;;;;;19016:324;;19162:2;19151:9;19147:18;19139:26;;19176:71;19244:1;19233:9;19229:17;19220:6;19176:71;;;19258:72;19326:2;19315:9;19311:18;19302:6;19258:72;;;19133:207;;;;;;19347:361;;19515:2;19504:9;19500:18;19492:26;;19565:9;19559:4;19555:20;19551:1;19540:9;19536:17;19529:47;19590:108;19693:4;19684:6;19590:108;;;19582:116;;19486:222;;;;;19715:201;;19827:2;19816:9;19812:18;19804:26;;19841:65;19903:1;19892:9;19888:17;19879:6;19841:65;;;19798:118;;;;;19923:312;;20063:2;20052:9;20048:18;20040:26;;20077:65;20139:1;20128:9;20124:17;20115:6;20077:65;;;20153:72;20221:2;20210:9;20206:18;20197:6;20153:72;;;20034:201;;;;;;20242:213;;20360:2;20349:9;20345:18;20337:26;;20374:71;20442:1;20431:9;20427:17;20418:6;20374:71;;;20331:124;;;;;20462:435;;20636:2;20625:9;20621:18;20613:26;;20650:71;20718:1;20707:9;20703:17;20694:6;20650:71;;;20732:72;20800:2;20789:9;20785:18;20776:6;20732:72;;;20815;20883:2;20872:9;20868:18;20859:6;20815:72;;;20607:290;;;;;;;20904:293;;21038:2;21027:9;21023:18;21015:26;;21088:9;21082:4;21078:20;21074:1;21063:9;21059:17;21052:47;21113:74;21182:4;21173:6;21113:74;;;21105:82;;21009:188;;;;;21204:301;;21342:2;21331:9;21327:18;21319:26;;21392:9;21386:4;21382:20;21378:1;21367:9;21363:17;21356:47;21417:78;21490:4;21481:6;21417:78;;;21409:86;;21313:192;;;;;21512:407;;21703:2;21692:9;21688:18;21680:26;;21753:9;21747:4;21743:20;21739:1;21728:9;21724:17;21717:47;21778:131;21904:4;21778:131;;;21770:139;;21674:245;;;;21926:407;;22117:2;22106:9;22102:18;22094:26;;22167:9;22161:4;22157:20;22153:1;22142:9;22138:17;22131:47;22192:131;22318:4;22192:131;;;22184:139;;22088:245;;;;22340:407;;22531:2;22520:9;22516:18;22508:26;;22581:9;22575:4;22571:20;22567:1;22556:9;22552:17;22545:47;22606:131;22732:4;22606:131;;;22598:139;;22502:245;;;;22754:407;;22945:2;22934:9;22930:18;22922:26;;22995:9;22989:4;22985:20;22981:1;22970:9;22966:17;22959:47;23020:131;23146:4;23020:131;;;23012:139;;22916:245;;;;23168:407;;23359:2;23348:9;23344:18;23336:26;;23409:9;23403:4;23399:20;23395:1;23384:9;23380:17;23373:47;23434:131;23560:4;23434:131;;;23426:139;;23330:245;;;;23582:407;;23773:2;23762:9;23758:18;23750:26;;23823:9;23817:4;23813:20;23809:1;23798:9;23794:17;23787:47;23848:131;23974:4;23848:131;;;23840:139;;23744:245;;;;23996:407;;24187:2;24176:9;24172:18;24164:26;;24237:9;24231:4;24227:20;24223:1;24212:9;24208:17;24201:47;24262:131;24388:4;24262:131;;;24254:139;;24158:245;;;;24410:407;;24601:2;24590:9;24586:18;24578:26;;24651:9;24645:4;24641:20;24637:1;24626:9;24622:17;24615:47;24676:131;24802:4;24676:131;;;24668:139;;24572:245;;;;24824:407;;25015:2;25004:9;25000:18;24992:26;;25065:9;25059:4;25055:20;25051:1;25040:9;25036:17;25029:47;25090:131;25216:4;25090:131;;;25082:139;;24986:245;;;;25238:407;;25429:2;25418:9;25414:18;25406:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25504:131;25630:4;25504:131;;;25496:139;;25400:245;;;;25652:407;;25843:2;25832:9;25828:18;25820:26;;25893:9;25887:4;25883:20;25879:1;25868:9;25864:17;25857:47;25918:131;26044:4;25918:131;;;25910:139;;25814:245;;;;26066:407;;26257:2;26246:9;26242:18;26234:26;;26307:9;26301:4;26297:20;26293:1;26282:9;26278:17;26271:47;26332:131;26458:4;26332:131;;;26324:139;;26228:245;;;;26480:407;;26671:2;26660:9;26656:18;26648:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26746:131;26872:4;26746:131;;;26738:139;;26642:245;;;;26894:407;;27085:2;27074:9;27070:18;27062:26;;27135:9;27129:4;27125:20;27121:1;27110:9;27106:17;27099:47;27160:131;27286:4;27160:131;;;27152:139;;27056:245;;;;27308:407;;27499:2;27488:9;27484:18;27476:26;;27549:9;27543:4;27539:20;27535:1;27524:9;27520:17;27513:47;27574:131;27700:4;27574:131;;;27566:139;;27470:245;;;;27722:407;;27913:2;27902:9;27898:18;27890:26;;27963:9;27957:4;27953:20;27949:1;27938:9;27934:17;27927:47;27988:131;28114:4;27988:131;;;27980:139;;27884:245;;;;28136:407;;28327:2;28316:9;28312:18;28304:26;;28377:9;28371:4;28367:20;28363:1;28352:9;28348:17;28341:47;28402:131;28528:4;28402:131;;;28394:139;;28298:245;;;;28550:407;;28741:2;28730:9;28726:18;28718:26;;28791:9;28785:4;28781:20;28777:1;28766:9;28762:17;28755:47;28816:131;28942:4;28816:131;;;28808:139;;28712:245;;;;28964:407;;29155:2;29144:9;29140:18;29132:26;;29205:9;29199:4;29195:20;29191:1;29180:9;29176:17;29169:47;29230:131;29356:4;29230:131;;;29222:139;;29126:245;;;;29378:407;;29569:2;29558:9;29554:18;29546:26;;29619:9;29613:4;29609:20;29605:1;29594:9;29590:17;29583:47;29644:131;29770:4;29644:131;;;29636:139;;29540:245;;;;29792:310;;29958:3;29947:9;29943:19;29935:27;;29973:119;30089:1;30078:9;30074:17;30065:6;29973:119;;;29929:173;;;;;30109:314;;30277:3;30266:9;30262:19;30254:27;;30292:121;30410:1;30399:9;30395:17;30386:6;30292:121;;;30248:175;;;;;30430:213;;30548:2;30537:9;30533:18;30525:26;;30562:71;30630:1;30619:9;30615:17;30606:6;30562:71;;;30519:124;;;;;30650:675;;30888:3;30877:9;30873:19;30865:27;;30903:71;30971:1;30960:9;30956:17;30947:6;30903:71;;;30985:80;31061:2;31050:9;31046:18;31037:6;30985:80;;;31076:72;31144:2;31133:9;31129:18;31120:6;31076:72;;;31159;31227:2;31216:9;31212:18;31203:6;31159:72;;;31242:73;31310:3;31299:9;31295:19;31286:6;31242:73;;;30859:466;;;;;;;;;31332:1515;;31770:3;31759:9;31755:19;31747:27;;31785:71;31853:1;31842:9;31838:17;31829:6;31785:71;;;31867:72;31935:2;31924:9;31920:18;31911:6;31867:72;;;31950;32018:2;32007:9;32003:18;31994:6;31950:72;;;32033;32101:2;32090:9;32086:18;32077:6;32033:72;;;32116:73;32184:3;32173:9;32169:19;32160:6;32116:73;;;32200;32268:3;32257:9;32253:19;32244:6;32200:73;;;32284;32352:3;32341:9;32337:19;32328:6;32284:73;;;32406:9;32400:4;32396:20;32390:3;32379:9;32375:19;32368:49;32431:74;32500:4;32491:6;32431:74;;;32423:82;;32516:73;32584:3;32573:9;32569:19;32560:6;32516:73;;;32600;32668:3;32657:9;32653:19;32644:6;32600:73;;;32684:74;32753:3;32742:9;32738:19;32728:7;32684:74;;;32769:68;32832:3;32821:9;32817:19;32807:7;32769:68;;;31741:1106;;;;;;;;;;;;;;;;32854:425;;33050:3;33039:9;33035:19;33027:27;;33065:71;33133:1;33122:9;33118:17;33109:6;33065:71;;;33147:122;33265:2;33254:9;33250:18;33241:6;33147:122;;;33021:258;;;;;;33286:324;;33432:2;33421:9;33417:18;33409:26;;33446:71;33514:1;33503:9;33499:17;33490:6;33446:71;;;33528:72;33596:2;33585:9;33581:18;33572:6;33528:72;;;33403:207;;;;;;33617:423;;33785:2;33774:9;33770:18;33762:26;;33799:71;33867:1;33856:9;33852:17;33843:6;33799:71;;;33881:72;33949:2;33938:9;33934:18;33925:6;33881:72;;;33964:66;34026:2;34015:9;34011:18;34002:6;33964:66;;;33756:284;;;;;;;34047:435;;34221:2;34210:9;34206:18;34198:26;;34235:71;34303:1;34292:9;34288:17;34279:6;34235:71;;;34317:72;34385:2;34374:9;34370:18;34361:6;34317:72;;;34400;34468:2;34457:9;34453:18;34444:6;34400:72;;;34192:290;;;;;;;34489:547;;34691:3;34680:9;34676:19;34668:27;;34706:71;34774:1;34763:9;34759:17;34750:6;34706:71;;;34788:72;34856:2;34845:9;34841:18;34832:6;34788:72;;;34871;34939:2;34928:9;34924:18;34915:6;34871:72;;;34954;35022:2;35011:9;35007:18;34998:6;34954:72;;;34662:374;;;;;;;;35043:205;;35157:2;35146:9;35142:18;35134:26;;35171:67;35235:1;35224:9;35220:17;35211:6;35171:67;;;35128:120;;;;;35255:256;;35317:2;35311:9;35301:19;;35355:4;35347:6;35343:17;35454:6;35442:10;35439:22;35418:18;35406:10;35403:34;35400:62;35397:2;;;35475:1;35472;35465:12;35397:2;35495:10;35491:2;35484:22;35295:216;;;;;35518:322;;35662:18;35654:6;35651:30;35648:2;;;35694:1;35691;35684:12;35648:2;35761:4;35757:9;35750:4;35742:6;35738:17;35734:33;35726:41;;35825:4;35819;35815:15;35807:23;;35585:255;;;;35847:151;;35933:3;35925:11;;35971:4;35966:3;35962:14;35954:22;;35919:79;;;;36005:137;;36114:5;36108:12;36098:22;;36079:63;;;;36149:121;;36242:5;36236:12;36226:22;;36207:63;;;;36277:118;;36367:5;36361:12;36351:22;;36332:63;;;;36402:122;;36496:5;36490:12;36480:22;;36461:63;;;;36531:108;;36629:4;36624:3;36620:14;36612:22;;36606:33;;;;36647:178;;36777:6;36772:3;36765:19;36814:4;36809:3;36805:14;36790:29;;36758:67;;;;;36834:144;;36969:3;36954:18;;36947:31;;;;;36987:163;;37102:6;37097:3;37090:19;37139:4;37134:3;37130:14;37115:29;;37083:67;;;;;37158:91;;37220:24;37238:5;37220:24;;;37209:35;;37203:46;;;;37256:85;;37329:5;37322:13;37315:21;37304:32;;37298:43;;;;37348:72;;37410:5;37399:16;;37393:27;;;;37427:121;;37500:42;37493:5;37489:54;37478:65;;37472:76;;;;37555:72;;37617:5;37606:16;;37600:27;;;;37634:81;;37705:4;37698:5;37694:16;37683:27;;37677:38;;;;37722:129;;37809:37;37840:5;37809:37;;;37796:50;;37790:61;;;;37858:121;;37937:37;37968:5;37937:37;;;37924:50;;37918:61;;;;37986:108;;38065:24;38083:5;38065:24;;;38052:37;;38046:48;;;;38102:145;38183:6;38178:3;38173;38160:30;38239:1;38230:6;38225:3;38221:16;38214:27;38153:94;;;;38256:268;38321:1;38328:101;38342:6;38339:1;38336:13;38328:101;;;38418:1;38413:3;38409:11;38403:18;38399:1;38394:3;38390:11;38383:39;38364:2;38361:1;38357:10;38352:15;;38328:101;;;38444:6;38441:1;38438:13;38435:2;;;38509:1;38500:6;38495:3;38491:16;38484:27;38435:2;38305:219;;;;;38532:97;;38620:2;38616:7;38611:2;38604:5;38600:14;38596:28;38586:38;;38580:49;;;;38637:117;38706:24;38724:5;38706:24;;;38699:5;38696:35;38686:2;;38745:1;38742;38735:12;38686:2;38680:74;;38761:111;38827:21;38842:5;38827:21;;;38820:5;38817:32;38807:2;;38863:1;38860;38853:12;38807:2;38801:71;;38879:117;38948:24;38966:5;38948:24;;;38941:5;38938:35;38928:2;;38987:1;38984;38977:12;38928:2;38922:74;;39003:117;39072:24;39090:5;39072:24;;;39065:5;39062:35;39052:2;;39111:1;39108;39101:12;39052:2;39046:74;
Swarm Source
ipfs://25b08abd32b60422ef60a54d476db798d85c4f81ac222245be0dafc5a9d0b113
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.