POL Price: $0.642433 (+4.08%)
 

Overview

Max Total Supply

30,007,323 SRS

Holders

89,036 (0.00%)

Market

Price

$0.00 @ 0.000000 POL

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1 SRS

Value
$0.00
0xc43f4d970cc759b78bd21f9414f1984ca80e5ea6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Humanity Protocol is a dynamic, multi-sided platform empowering community members to monetize their time and earn a cryptocurrency-based income.

Contract Source Code Verified (Exact Match)

Contract Name:
Sirius_by_Humanity

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 11: Token777.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "./ERC777.sol";
import "./ReentrancyGuard.sol";
import "./Ownable.sol";


contract Sirius_by_Humanity is ERC777, Ownable, ReentrancyGuard {

    mapping(address => bool) public userIsWhitelisted;

    mapping(address => uint) public userLastClaim;

    mapping(address => uint) public userStartClaimPeriod;

    mapping(address => uint) public userEndClaimPeriod;

    mapping(address => uint) public userTokensToClaim;

    mapping(address => uint) public userTokensLeftToClaim;

    constructor(
        address[] memory hps
    )
    ERC777("Sirius by Humanity", "SRS", hps)
    {
        _mint(msg.sender, 11009023*1e18, "","");
    }

    //This function returns the unixtime of the next day 12:00 am. Used when users are whitelisted.Their start claiming period will start there.
    function next_midnight() public view returns (uint256) {
        uint256 now_time=block.timestamp;
        uint256 days_since_1970=now_time/86400;
        uint256 last_midnight= days_since_1970*86400;
        uint256 rest=now_time-last_midnight;
        return now_time + (86400-rest);
    }

    // Function that whitelist users. The claiming period lasts 1000 days.
    function add_Users_Claiming_List(uint256[] memory listTokensToClaim, address[] memory listAdress) onlyOwner public returns (bool) {
        require(listTokensToClaim.length==listAdress.length);
        uint256 users_start_claim_period=next_midnight();
        for(uint i=0;i<listAdress.length;i++){
            address address_user=listAdress[i];
            uint256 tokens_user=listTokensToClaim[i];
            // only users who are not whitelisted yet can be added
            if(userIsWhitelisted[address_user]==false){
                userIsWhitelisted[address_user]=true;
                userStartClaimPeriod[address_user]=users_start_claim_period;
                userEndClaimPeriod[address_user]=userStartClaimPeriod[address_user] + 1000 days;
                userLastClaim[address_user]=userStartClaimPeriod[address_user];
                userTokensLeftToClaim[address_user]=tokens_user*1e18;
                userTokensToClaim[address_user]=userTokensLeftToClaim[address_user];
            }
        }
        return true;
    }

    // To correct the number of tokens assigned to a Wallet
    function change_Users_TokensToClaim(uint256[] memory listTokensToClaim, address[] memory listAdress) onlyOwner public returns (bool) {
        require(listTokensToClaim.length==listAdress.length);
        uint256 users_start_claim_period=next_midnight();
        for(uint i=0;i<listAdress.length;i++){
            address address_user=listAdress[i];
            uint256 new_tokens_user=listTokensToClaim[i]*1e18;
            if(userIsWhitelisted[address_user]==true){
                // The claim period restart for the user, with more tokens
                userStartClaimPeriod[address_user]=users_start_claim_period;
                userEndClaimPeriod[address_user]=userStartClaimPeriod[address_user] + 1000 days;
                userLastClaim[address_user]=userStartClaimPeriod[address_user];
                userTokensToClaim[address_user]=new_tokens_user;
                userTokensLeftToClaim[address_user]=userTokensToClaim[address_user];

                if(new_tokens_user==0){
                    userIsWhitelisted[address_user]=false;
                    userStartClaimPeriod[address_user]=0;
                    userEndClaimPeriod[address_user]=0;
                    userLastClaim[address_user]=0;
                }
            }
        }
        return true;
    }

    // To remove a Wallet from the whitelist
    function remove_from_List(address[] memory listAdress) onlyOwner public returns (bool) {
        for(uint i=0;i<listAdress.length;i++){
            address address_user=listAdress[i];
            userIsWhitelisted[address_user]=false;
            userStartClaimPeriod[address_user]=0;
            userEndClaimPeriod[address_user]=0;
            userLastClaim[address_user]=0;
            userTokensToClaim[address_user]=0;
            userTokensLeftToClaim[address_user]=0;
        }
        return true;
    }

    // Return the number of tokens that a user can claim now
    function TokenAvailableToClaim(address _user) public view returns (uint256){
        if(block.timestamp>userStartClaimPeriod[msg.sender]){
            if (userIsWhitelisted[_user]==false){
                return 0;
            }
            else {
                uint256 user_tokens_perDay=userTokensToClaim[_user]/1000;
                uint256 now_time=block.timestamp;
                if (now_time>userEndClaimPeriod[_user]) {
                    now_time=userEndClaimPeriod[_user];
                }
                //To compute the days past since the last update. 86400 seconds per day
                uint256 user_days_lastUpdate=(now_time-userLastClaim[_user])/86400;
                if (user_days_lastUpdate==0){
                    return 0;
                }
                else{
                    uint256 tokens_available=user_days_lastUpdate*user_tokens_perDay;
                    return tokens_available;
                }
            }
        }
        else{
            return 0;
        }
    }

    // Mint & claim function
    function claim() public nonReentrant returns (bool) {
        require(userIsWhitelisted[msg.sender]==true,"Not Whitelisted");
        require(block.timestamp>userStartClaimPeriod[msg.sender]);
        uint256 user_tokens_perDay=userTokensToClaim[msg.sender]/1000;
        uint256 now_time=block.timestamp;
        if (now_time>userEndClaimPeriod[msg.sender]) {
            now_time=userEndClaimPeriod[msg.sender];
        }
        //To compute the days past since the last update. 86400 seconds per day
        uint256 user_days_lastUpdate=(now_time-userLastClaim[msg.sender])/86400;
        require(user_days_lastUpdate>0,"Nothing to claim");
        uint256 tokens_available=user_days_lastUpdate*user_tokens_perDay;
        _mint(msg.sender, tokens_available, "","");
        userLastClaim[msg.sender]=userLastClaim[msg.sender]+(user_days_lastUpdate*86400);
        userTokensLeftToClaim[msg.sender]-=tokens_available;
        return true;
    }

    function return_To_Owner(uint256 _amount) external onlyOwner {
        this.transfer(msg.sender, _amount);
    }

}

File 1 of 11: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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");

        (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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 11: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 11: ERC777.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC777/ERC777.sol)

pragma solidity ^0.8.0;

import "./IERC777.sol";
import "./IERC777Recipient.sol";
import "./IERC777Sender.sol";
import "./IERC20.sol";
import "./Address.sol";
import "./Context.sol";
import "./IERC1820Registry.sol";

/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using Address for address;

    IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    // According to tokenomics
    uint256 private _maxSupply=61309023*1e18;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        address[] memory defaultOperators_
    ) {
        _name = name_;
        _symbol = symbol_;

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < defaultOperators_.length; i++) {
            _defaultOperators[defaultOperators_[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }

    /**
     * @dev See {IERC777-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC777-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view virtual override returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC777-totalSupply}.
     */
    function totalSupply() public view virtual override(IERC20, IERC777) returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public virtual override {
        _burn(_msgSender(), amount, data, "");
    }

    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
        return
            operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public virtual override {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public virtual override {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view virtual override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view virtual override returns (uint256) {
        return _allowances[holder][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public virtual override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Note that operator and allowance concepts are orthogonal: operators cannot
     * call `transferFrom` (unless they have allowance), and accounts with
     * allowance cannot call `operatorSend` (unless they are operators).
     *
     * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
     */
    function transferFrom(
        address holder,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _callTokensReceived(spender, holder, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) internal virtual {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and if a send hook is
     * registered for `account`, the corresponding function will be called with
     * `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(account != address(0), "ERC777: mint to the zero address");
        require((amount+_totalSupply)<=_maxSupply,"Exceed Max Supply");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, amount);

        // Update state variables
        _totalSupply += amount;
        _balances[account] += amount;

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(from != address(0), "ERC777: send from the zero address");
        require(to != address(0), "ERC777: send to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(
        address from,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) internal virtual {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        _beforeTokenTransfer(operator, from, address(0), amount);

        // Update state variables
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _totalSupply -= amount;

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        _beforeTokenTransfer(operator, from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(
        address holder,
        address spender,
        uint256 value
    ) internal {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

        _allowances[holder][spender] = value;
        emit Approval(holder, spender, value);
    }

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes
     * calls to {send}, {transfer}, {operatorSend}, minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 4 of 11: IERC1820Registry.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC1820Registry.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(
        address account,
        bytes32 _interfaceHash,
        address implementer
    ) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     * @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     * @param account Address of the contract for which to update the cache.
     * @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not.
     * If the result is not cached a direct lookup on the contract address is performed.
     * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     * {updateERC165Cache} with the contract address.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

File 5 of 11: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

File 6 of 11: IERC777.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC777/IERC777.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by an account (`owner`).
     */
    function balanceOf(address owner) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

File 7 of 11: IERC777Recipient.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC777/IERC777Recipient.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

File 8 of 11: IERC777Sender.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC777/IERC777Sender.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 * their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

File 9 of 11: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 10 of 11: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @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].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being 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 percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @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 making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"hps","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"TokenAvailableToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"listTokensToClaim","type":"uint256[]"},{"internalType":"address[]","name":"listAdress","type":"address[]"}],"name":"add_Users_Claiming_List","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"listTokensToClaim","type":"uint256[]"},{"internalType":"address[]","name":"listAdress","type":"address[]"}],"name":"change_Users_TokensToClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"next_midnight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"listAdress","type":"address[]"}],"name":"remove_from_List","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"return_To_Owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userEndClaimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userIsWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userStartClaimPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTokensLeftToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTokensToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526a32b6b0cbe5fe991e1c00006004553480156200002057600080fd5b506040516200620938038062006209833981810160405281019062000046919062000b2a565b6040518060400160405280601281526020017f5369726975732062792048756d616e69747900000000000000000000000000008152506040518060400160405280600381526020017f5352530000000000000000000000000000000000000000000000000000000000815250828260029081620000c4919062000dc6565b508160039081620000d6919062000dc6565b508060059080519060200190620000ef9291906200088e565b5060005b8151811015620001885760016006600084848151811062000119576200011862000ead565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200017f9062000f0b565b915050620000f3565b50731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce2177054306040518463ffffffff1660e01b8152600401620001fc9392919062000f84565b600060405180830381600087803b1580156200021757600080fd5b505af11580156200022c573d6000803e3d6000fd5b50505050731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff166329965a1d307faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a306040518463ffffffff1660e01b8152600401620002a39392919062000f84565b600060405180830381600087803b158015620002be57600080fd5b505af1158015620002d3573d6000803e3d6000fd5b50505050505050620002fa620002ee6200034660201b60201c565b6200034e60201b60201c565b6001600b819055506200033f336a091b40552a544ec89c000060405180602001604052806000815250604051806020016040528060008152506200041460201b60201c565b506200138b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200042a8484848460016200043060201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603620004a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004999062001022565b60405180910390fd5b60045460015485620004b5919062001044565b1115620004f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f090620010cf565b60405180910390fd5b60006200050b6200034660201b60201c565b90506200052281600088886200068760201b60201c565b846001600082825462000536919062001044565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200058d919062001044565b92505081905550620005ac81600088888888886200068d60201b60201c565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516200060f939291906200118b565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051620006779190620011d6565b60405180910390a3505050505050565b50505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b815260040162000700929190620011f3565b602060405180830381865afa1580156200071e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000744919062001220565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620007f9578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401620007bf9695949392919062001252565b600060405180830381600087803b158015620007da57600080fd5b505af1158015620007ef573d6000803e3d6000fd5b5050505062000871565b811562000870576200082c8673ffffffffffffffffffffffffffffffffffffffff166200087b60201b620026b01760201c565b156200086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008669062001369565b60405180910390fd5b5b5b5050505050505050565b600080823b905060008111915050919050565b8280548282559060005260206000209081019282156200090a579160200282015b82811115620009095782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620008af565b5b5090506200091991906200091d565b5090565b5b80821115620009385760008160009055506001016200091e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009a08262000955565b810181811067ffffffffffffffff82111715620009c257620009c162000966565b5b80604052505050565b6000620009d76200093c565b9050620009e5828262000995565b919050565b600067ffffffffffffffff82111562000a085762000a0762000966565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a4b8262000a1e565b9050919050565b62000a5d8162000a3e565b811462000a6957600080fd5b50565b60008151905062000a7d8162000a52565b92915050565b600062000a9a62000a9484620009ea565b620009cb565b9050808382526020820190506020840283018581111562000ac05762000abf62000a19565b5b835b8181101562000aed578062000ad8888262000a6c565b84526020840193505060208101905062000ac2565b5050509392505050565b600082601f83011262000b0f5762000b0e62000950565b5b815162000b2184826020860162000a83565b91505092915050565b60006020828403121562000b435762000b4262000946565b5b600082015167ffffffffffffffff81111562000b645762000b636200094b565b5b62000b728482850162000af7565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bce57607f821691505b60208210810362000be45762000be362000b86565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c4e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c0f565b62000c5a868362000c0f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ca762000ca162000c9b8462000c72565b62000c7c565b62000c72565b9050919050565b6000819050919050565b62000cc38362000c86565b62000cdb62000cd28262000cae565b84845462000c1c565b825550505050565b600090565b62000cf262000ce3565b62000cff81848462000cb8565b505050565b5b8181101562000d275762000d1b60008262000ce8565b60018101905062000d05565b5050565b601f82111562000d765762000d408162000bea565b62000d4b8462000bff565b8101602085101562000d5b578190505b62000d7362000d6a8562000bff565b83018262000d04565b50505b505050565b600082821c905092915050565b600062000d9b6000198460080262000d7b565b1980831691505092915050565b600062000db6838362000d88565b9150826002028217905092915050565b62000dd18262000b7b565b67ffffffffffffffff81111562000ded5762000dec62000966565b5b62000df9825462000bb5565b62000e0682828562000d2b565b600060209050601f83116001811462000e3e576000841562000e29578287015190505b62000e35858262000da8565b86555062000ea5565b601f19841662000e4e8662000bea565b60005b8281101562000e785784890151825560018201915060208501945060208101905062000e51565b8683101562000e98578489015162000e94601f89168262000d88565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f188262000c72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000f4d5762000f4c62000edc565b5b600182019050919050565b62000f638162000a3e565b82525050565b6000819050919050565b62000f7e8162000f69565b82525050565b600060608201905062000f9b600083018662000f58565b62000faa602083018562000f73565b62000fb9604083018462000f58565b949350505050565b600082825260208201905092915050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200100a60208362000fc1565b9150620010178262000fd2565b602082019050919050565b600060208201905081810360008301526200103d8162000ffb565b9050919050565b6000620010518262000c72565b91506200105e8362000c72565b925082820190508082111562001079576200107862000edc565b5b92915050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b6000620010b760118362000fc1565b9150620010c4826200107f565b602082019050919050565b60006020820190508181036000830152620010ea81620010a8565b9050919050565b620010fc8162000c72565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156200113e57808201518184015260208101905062001121565b60008484015250505050565b6000620011578262001102565b6200116381856200110d565b9350620011758185602086016200111e565b620011808162000955565b840191505092915050565b6000606082019050620011a26000830186620010f1565b8181036020830152620011b681856200114a565b90508181036040830152620011cc81846200114a565b9050949350505050565b6000602082019050620011ed6000830184620010f1565b92915050565b60006040820190506200120a600083018562000f58565b62001219602083018462000f73565b9392505050565b60006020828403121562001239576200123862000946565b5b6000620012498482850162000a6c565b91505092915050565b600060c08201905062001269600083018962000f58565b62001278602083018862000f58565b62001287604083018762000f58565b620012966060830186620010f1565b8181036080830152620012aa81856200114a565b905081810360a0830152620012c081846200114a565b9050979650505050505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b600062001351604d8362000fc1565b91506200135e82620012cd565b606082019050919050565b60006020820190508181036000830152620013848162001342565b9050919050565b614e6e806200139b6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063959b8c3f11610125578063dd62ed3e116100ad578063f2fde38b1161007c578063f2fde38b1461068c578063f9b3055b146106a8578063fad8b32a146106d8578063fc673c4f146106f4578063fe9d93031461071057610211565b8063dd62ed3e146105de578063e4aaac211461060e578063e4fe10811461062c578063ef5cdd7a1461065c57610211565b8063a568cd89116100f4578063a568cd8914610500578063a9059cbb14610530578063cc99454114610560578063d5abeb0114610590578063d95b6371146105ae57610211565b8063959b8c3f1461047a57806395d89b41146104965780639bd9bbc6146104b4578063a3064fef146104d057610211565b806342b7c341116101a8578063637bcd2a11610177578063637bcd2a146103c25780636e752e8a146103f257806370a0823114610422578063715018a6146104525780638da5cb5b1461045c57610211565b806342b7c3411461033a5780634e71d92d1461036a578063556f0dc71461038857806362ad1b83146103a657610211565b806323b872dd116101e457806323b872dd146102a0578063313ce567146102d05780633357c7c2146102ee578063425a51771461030a57610211565b806306e485381461021657806306fdde0314610234578063095ea7b31461025257806318160ddd14610282575b600080fd5b61021e61072c565b60405161022b919061362d565b60405180910390f35b61023c6107ba565b60405161024991906136df565b60405180910390f35b61026c60048036038101906102679190613777565b61084c565b60405161027991906137d2565b60405180910390f35b61028a61086f565b60405161029791906137fc565b60405180910390f35b6102ba60048036038101906102b59190613817565b610879565b6040516102c791906137d2565b60405180910390f35b6102d8610ad1565b6040516102e59190613886565b60405180910390f35b610308600480360381019061030391906138a1565b610ada565b005b610324600480360381019061031f91906138ce565b610b64565b60405161033191906137fc565b60405180910390f35b610354600480360381019061034f91906138ce565b610b7c565b60405161036191906137fc565b60405180910390f35b610372610b94565b60405161037f91906137d2565b60405180910390f35b610390610f3b565b60405161039d91906137fc565b60405180910390f35b6103c060048036038101906103bb9190613a30565b610f44565b005b6103dc60048036038101906103d791906138ce565b610faa565b6040516103e991906137d2565b60405180910390f35b61040c600480360381019061040791906138ce565b610fca565b60405161041991906137fc565b60405180910390f35b61043c600480360381019061043791906138ce565b610fe2565b60405161044991906137fc565b60405180910390f35b61045a61102a565b005b61046461103e565b6040516104719190613af2565b60405180910390f35b610494600480360381019061048f91906138ce565b611068565b005b61049e6112c8565b6040516104ab91906136df565b60405180910390f35b6104ce60048036038101906104c99190613b0d565b61135a565b005b6104ea60048036038101906104e591906138ce565b611384565b6040516104f791906137fc565b60405180910390f35b61051a600480360381019061051591906138ce565b61139c565b60405161052791906137fc565b60405180910390f35b61054a60048036038101906105459190613777565b6115bd565b60405161055791906137d2565b60405180910390f35b61057a60048036038101906105759190613d07565b6116ca565b60405161058791906137d2565b60405180910390f35b610598611b15565b6040516105a591906137fc565b60405180910390f35b6105c860048036038101906105c39190613d7f565b611b1f565b6040516105d591906137d2565b60405180910390f35b6105f860048036038101906105f39190613d7f565b611cd0565b60405161060591906137fc565b60405180910390f35b610616611d57565b60405161062391906137fc565b60405180910390f35b61064660048036038101906106419190613d07565b611db6565b60405161065391906137d2565b60405180910390f35b610676600480360381019061067191906138ce565b612129565b60405161068391906137fc565b60405180910390f35b6106a660048036038101906106a191906138ce565b612141565b005b6106c260048036038101906106bd9190613dbf565b6121c4565b6040516106cf91906137d2565b60405180910390f35b6106f260048036038101906106ed91906138ce565b6123c8565b005b61070e60048036038101906107099190613e08565b612628565b005b61072a60048036038101906107259190613ea7565b61268a565b005b606060058054806020026020016040519081016040528092919081815260200182805480156107b057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610766575b5050505050905090565b6060600280546107c990613f32565b80601f01602080910402602001604051908101604052809291908181526020018280546107f590613f32565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b6000806108576126c3565b90506108648185856126cb565b600191505092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613fd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90614067565b60405180910390fd5b60006109626126c3565b9050610990818686866040518060200160405280600081525060405180602001604052806000815250612894565b6109bc8186868660405180602001604052806000815250604051806020016040528060008152506129fb565b6000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a77906140f9565b60405180910390fd5b610a9686838684610a919190614148565b6126cb565b610ac48287878760405180602001604052806000815250604051806020016040528060008152506000612c15565b6001925050509392505050565b60006012905090565b610ae2612de7565b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b1d92919061417c565b6020604051808303816000875af1158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6091906141d1565b5050565b600d6020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b6000610b9e612e65565b60011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c289061424a565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211610c7c57600080fd5b60006103e8601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ccb9190614299565b90506000429050600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d5c57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600062015180600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610dad9190614148565b610db79190614299565b905060008111610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614316565b60405180910390fd5b60008382610e0a9190614336565b9050610e3633826040518060200160405280600081525060405180602001604052806000815250612eb4565b6201518082610e459190614336565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8f9190614378565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f219190614148565b925050819055506001945050505050610f38612ec8565b90565b60006001905090565b610f55610f4f6126c3565b86611b1f565b610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b9061441e565b60405180910390fd5b610fa385858585856001612ed2565b5050505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611032612de7565b61103c6000612ff0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff166110876126c3565b73ffffffffffffffffffffffffffffffffffffffff16036110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906144b0565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111c7576008600061113b6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055611264565b6001600760006111d56126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61126c6126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b6060600380546112d790613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461130390613f32565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b61137f6113656126c3565b848484604051806020016040528060008152506001612ed2565b505050565b600e6020528060005260406000206000915090505481565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211156115b35760001515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361144657600090506115b8565b60006103e8601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114959190614299565b90506000429050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561152657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600062015180600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836115779190614148565b6115819190614299565b90506000810361159757600093505050506115b8565b600083826115a59190614336565b9050809450505050506115b8565b600090505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613fd5565b60405180910390fd5b60006116376126c3565b9050611665818286866040518060200160405280600081525060405180602001604052806000815250612894565b6116918182868660405180602001604052806000815250604051806020016040528060008152506129fb565b6116bf8182868660405180602001604052806000815250604051806020016040528060008152506000612c15565b600191505092915050565b60006116d4612de7565b81518351146116e257600080fd5b60006116ec611d57565b905060005b8351811015611b0957600084828151811061170f5761170e6144d0565b5b602002602001015190506000670de0b6b3a7640000878481518110611737576117366144d0565b5b60200260200101516117499190614336565b905060011515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611af45783600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506305265c00600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118369190614378565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008103611af3576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b50508080611b01906144ff565b9150506116f1565b50600191505092915050565b6000600454905090565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c375750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611c365750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b80611cc85750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008042905060006201518082611d6e9190614299565b905060006201518082611d819190614336565b905060008184611d919190614148565b90508062015180611da29190614148565b84611dad9190614378565b94505050505090565b6000611dc0612de7565b8151835114611dce57600080fd5b6000611dd8611d57565b905060005b835181101561211d576000848281518110611dfb57611dfa6144d0565b5b602002602001015190506000868381518110611e1a57611e196144d0565b5b6020026020010151905060001515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612108576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506305265c00600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f679190614378565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550670de0b6b3a7640000816120419190614336565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50508080612115906144ff565b915050611ddd565b50600191505092915050565b60116020528060005260406000206000915090505481565b612149612de7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906145b9565b60405180910390fd5b6121c181612ff0565b50565b60006121ce612de7565b60005b82518110156123be5760008382815181106121ef576121ee6144d0565b5b602002602001015190506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806123b6906144ff565b9150506121d1565b5060019050919050565b6123d06126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061464b565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125305760016008600061249d6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125c4565b6007600061253c6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b6125cc6126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6126396126336126c3565b85611b1f565b612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f9061441e565b60405180910390fd5b612684848484846130b6565b50505050565b6126ac6126956126c3565b8383604051806020016040528060008152506130b6565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612731906146dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a09061476f565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161288791906137fc565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016129059291906147a8565b602060405180830381865afa158015612922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294691906147e6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129f2578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b81526004016129bf96959493929190614868565b600060405180830381600087803b1580156129d957600080fd5b505af11580156129ed573d6000803e3d6000fd5b505050505b50505050505050565b612a0786868686613308565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8490614949565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b209190614378565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051612b9f93929190614969565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612c0491906137fc565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401612c869291906147a8565b602060405180830381865afa158015612ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc791906147e6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d76578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401612d3f96959493929190614868565b600060405180830381600087803b158015612d5957600080fd5b505af1158015612d6d573d6000803e3d6000fd5b50505050612ddd565b8115612ddc57612d9b8673ffffffffffffffffffffffffffffffffffffffff166126b0565b15612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614a46565b60405180910390fd5b5b5b5050505050505050565b612def6126c3565b73ffffffffffffffffffffffffffffffffffffffff16612e0d61103e565b73ffffffffffffffffffffffffffffffffffffffff1614612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a90614ab2565b60405180910390fd5b565b6002600b5403612eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea190614b1e565b60405180910390fd5b6002600b81905550565b612ec284848484600161330e565b50505050565b6001600b81905550565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3890614bb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790614c1c565b60405180910390fd5b6000612fba6126c3565b9050612fca818888888888612894565b612fd88188888888886129fb565b612fe781888888888888612c15565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311c90614cae565b60405180910390fd5b600061312f6126c3565b905061314081866000878787612894565b61314d8186600087613308565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156131d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ca90614d40565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550846001600082825461322a9190614148565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161329293929190614969565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516132f891906137fc565b60405180910390a3505050505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361337d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337490614dac565b60405180910390fd5b6004546001548561338e9190614378565b11156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614e18565b60405180910390fd5b60006133d96126c3565b90506133e88160008888613308565b84600160008282546133fa9190614378565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344f9190614378565b925050819055506134668160008888888888612c15565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516134c793929190614969565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161352d91906137fc565b60405180910390a3505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359482613569565b9050919050565b6135a481613589565b82525050565b60006135b6838361359b565b60208301905092915050565b6000602082019050919050565b60006135da8261353d565b6135e48185613548565b93506135ef83613559565b8060005b8381101561362057815161360788826135aa565b9750613612836135c2565b9250506001810190506135f3565b5085935050505092915050565b6000602082019050818103600083015261364781846135cf565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368957808201518184015260208101905061366e565b60008484015250505050565b6000601f19601f8301169050919050565b60006136b18261364f565b6136bb818561365a565b93506136cb81856020860161366b565b6136d481613695565b840191505092915050565b600060208201905081810360008301526136f981846136a6565b905092915050565b6000604051905090565b600080fd5b600080fd5b61371e81613589565b811461372957600080fd5b50565b60008135905061373b81613715565b92915050565b6000819050919050565b61375481613741565b811461375f57600080fd5b50565b6000813590506137718161374b565b92915050565b6000806040838503121561378e5761378d61370b565b5b600061379c8582860161372c565b92505060206137ad85828601613762565b9150509250929050565b60008115159050919050565b6137cc816137b7565b82525050565b60006020820190506137e760008301846137c3565b92915050565b6137f681613741565b82525050565b600060208201905061381160008301846137ed565b92915050565b6000806000606084860312156138305761382f61370b565b5b600061383e8682870161372c565b935050602061384f8682870161372c565b925050604061386086828701613762565b9150509250925092565b600060ff82169050919050565b6138808161386a565b82525050565b600060208201905061389b6000830184613877565b92915050565b6000602082840312156138b7576138b661370b565b5b60006138c584828501613762565b91505092915050565b6000602082840312156138e4576138e361370b565b5b60006138f28482850161372c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61393d82613695565b810181811067ffffffffffffffff8211171561395c5761395b613905565b5b80604052505050565b600061396f613701565b905061397b8282613934565b919050565b600067ffffffffffffffff82111561399b5761399a613905565b5b6139a482613695565b9050602081019050919050565b82818337600083830152505050565b60006139d36139ce84613980565b613965565b9050828152602081018484840111156139ef576139ee613900565b5b6139fa8482856139b1565b509392505050565b600082601f830112613a1757613a166138fb565b5b8135613a278482602086016139c0565b91505092915050565b600080600080600060a08688031215613a4c57613a4b61370b565b5b6000613a5a8882890161372c565b9550506020613a6b8882890161372c565b9450506040613a7c88828901613762565b935050606086013567ffffffffffffffff811115613a9d57613a9c613710565b5b613aa988828901613a02565b925050608086013567ffffffffffffffff811115613aca57613ac9613710565b5b613ad688828901613a02565b9150509295509295909350565b613aec81613589565b82525050565b6000602082019050613b076000830184613ae3565b92915050565b600080600060608486031215613b2657613b2561370b565b5b6000613b348682870161372c565b9350506020613b4586828701613762565b925050604084013567ffffffffffffffff811115613b6657613b65613710565b5b613b7286828701613a02565b9150509250925092565b600067ffffffffffffffff821115613b9757613b96613905565b5b602082029050602081019050919050565b600080fd5b6000613bc0613bbb84613b7c565b613965565b90508083825260208201905060208402830185811115613be357613be2613ba8565b5b835b81811015613c0c5780613bf88882613762565b845260208401935050602081019050613be5565b5050509392505050565b600082601f830112613c2b57613c2a6138fb565b5b8135613c3b848260208601613bad565b91505092915050565b600067ffffffffffffffff821115613c5f57613c5e613905565b5b602082029050602081019050919050565b6000613c83613c7e84613c44565b613965565b90508083825260208201905060208402830185811115613ca657613ca5613ba8565b5b835b81811015613ccf5780613cbb888261372c565b845260208401935050602081019050613ca8565b5050509392505050565b600082601f830112613cee57613ced6138fb565b5b8135613cfe848260208601613c70565b91505092915050565b60008060408385031215613d1e57613d1d61370b565b5b600083013567ffffffffffffffff811115613d3c57613d3b613710565b5b613d4885828601613c16565b925050602083013567ffffffffffffffff811115613d6957613d68613710565b5b613d7585828601613cd9565b9150509250929050565b60008060408385031215613d9657613d9561370b565b5b6000613da48582860161372c565b9250506020613db58582860161372c565b9150509250929050565b600060208284031215613dd557613dd461370b565b5b600082013567ffffffffffffffff811115613df357613df2613710565b5b613dff84828501613cd9565b91505092915050565b60008060008060808587031215613e2257613e2161370b565b5b6000613e308782880161372c565b9450506020613e4187828801613762565b935050604085013567ffffffffffffffff811115613e6257613e61613710565b5b613e6e87828801613a02565b925050606085013567ffffffffffffffff811115613e8f57613e8e613710565b5b613e9b87828801613a02565b91505092959194509250565b60008060408385031215613ebe57613ebd61370b565b5b6000613ecc85828601613762565b925050602083013567ffffffffffffffff811115613eed57613eec613710565b5b613ef985828601613a02565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f4a57607f821691505b602082108103613f5d57613f5c613f03565b5b50919050565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613fbf60248361365a565b9150613fca82613f63565b604082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061405160268361365a565b915061405c82613ff5565b604082019050919050565b6000602082019050818103600083015261408081614044565b9050919050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b60006140e360298361365a565b91506140ee82614087565b604082019050919050565b60006020820190508181036000830152614112816140d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061415382613741565b915061415e83613741565b925082820390508181111561417657614175614119565b5b92915050565b60006040820190506141916000830185613ae3565b61419e60208301846137ed565b9392505050565b6141ae816137b7565b81146141b957600080fd5b50565b6000815190506141cb816141a5565b92915050565b6000602082840312156141e7576141e661370b565b5b60006141f5848285016141bc565b91505092915050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b6000614234600f8361365a565b915061423f826141fe565b602082019050919050565b6000602082019050818103600083015261426381614227565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142a482613741565b91506142af83613741565b9250826142bf576142be61426a565b5b828204905092915050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b600061430060108361365a565b915061430b826142ca565b602082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600061434182613741565b915061434c83613741565b925082820261435a81613741565b9150828204841483151761437157614370614119565b5b5092915050565b600061438382613741565b915061438e83613741565b92508282019050808211156143a6576143a5614119565b5b92915050565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b6000614408602c8361365a565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b600061449a60248361365a565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061450a82613741565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361453c5761453b614119565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145a360268361365a565b91506145ae82614547565b604082019050919050565b600060208201905081810360008301526145d281614596565b9050919050565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061463560218361365a565b9150614640826145d9565b604082019050919050565b6000602082019050818103600083015261466481614628565b9050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146c760258361365a565b91506146d28261466b565b604082019050919050565b600060208201905081810360008301526146f6816146ba565b9050919050565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061475960238361365a565b9150614764826146fd565b604082019050919050565b600060208201905081810360008301526147888161474c565b9050919050565b6000819050919050565b6147a28161478f565b82525050565b60006040820190506147bd6000830185613ae3565b6147ca6020830184614799565b9392505050565b6000815190506147e081613715565b92915050565b6000602082840312156147fc576147fb61370b565b5b600061480a848285016147d1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061483a82614813565b614844818561481e565b935061485481856020860161366b565b61485d81613695565b840191505092915050565b600060c08201905061487d6000830189613ae3565b61488a6020830188613ae3565b6148976040830187613ae3565b6148a460608301866137ed565b81810360808301526148b6818561482f565b905081810360a08301526148ca818461482f565b9050979650505050505050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b600061493360278361365a565b915061493e826148d7565b604082019050919050565b6000602082019050818103600083015261496281614926565b9050919050565b600060608201905061497e60008301866137ed565b8181036020830152614990818561482f565b905081810360408301526149a4818461482f565b9050949350505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b6000614a30604d8361365a565b9150614a3b826149ae565b606082019050919050565b60006020820190508181036000830152614a5f81614a23565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a9c60208361365a565b9150614aa782614a66565b602082019050919050565b60006020820190508181036000830152614acb81614a8f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614b08601f8361365a565b9150614b1382614ad2565b602082019050919050565b60006020820190508181036000830152614b3781614afb565b9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b9a60228361365a565b9150614ba582614b3e565b604082019050919050565b60006020820190508181036000830152614bc981614b8d565b9050919050565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b6000614c0660208361365a565b9150614c1182614bd0565b602082019050919050565b60006020820190508181036000830152614c3581614bf9565b9050919050565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c9860228361365a565b9150614ca382614c3c565b604082019050919050565b60006020820190508181036000830152614cc781614c8b565b9050919050565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000614d2a60238361365a565b9150614d3582614cce565b604082019050919050565b60006020820190508181036000830152614d5981614d1d565b9050919050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d9660208361365a565b9150614da182614d60565b602082019050919050565b60006020820190508181036000830152614dc581614d89565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b6000614e0260118361365a565b9150614e0d82614dcc565b602082019050919050565b60006020820190508181036000830152614e3181614df5565b905091905056fea26469706673582212209f1b05eba27e7396061c136ca6755d1cb8d607f139fabf77a3ce492bc77664ae64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063959b8c3f11610125578063dd62ed3e116100ad578063f2fde38b1161007c578063f2fde38b1461068c578063f9b3055b146106a8578063fad8b32a146106d8578063fc673c4f146106f4578063fe9d93031461071057610211565b8063dd62ed3e146105de578063e4aaac211461060e578063e4fe10811461062c578063ef5cdd7a1461065c57610211565b8063a568cd89116100f4578063a568cd8914610500578063a9059cbb14610530578063cc99454114610560578063d5abeb0114610590578063d95b6371146105ae57610211565b8063959b8c3f1461047a57806395d89b41146104965780639bd9bbc6146104b4578063a3064fef146104d057610211565b806342b7c341116101a8578063637bcd2a11610177578063637bcd2a146103c25780636e752e8a146103f257806370a0823114610422578063715018a6146104525780638da5cb5b1461045c57610211565b806342b7c3411461033a5780634e71d92d1461036a578063556f0dc71461038857806362ad1b83146103a657610211565b806323b872dd116101e457806323b872dd146102a0578063313ce567146102d05780633357c7c2146102ee578063425a51771461030a57610211565b806306e485381461021657806306fdde0314610234578063095ea7b31461025257806318160ddd14610282575b600080fd5b61021e61072c565b60405161022b919061362d565b60405180910390f35b61023c6107ba565b60405161024991906136df565b60405180910390f35b61026c60048036038101906102679190613777565b61084c565b60405161027991906137d2565b60405180910390f35b61028a61086f565b60405161029791906137fc565b60405180910390f35b6102ba60048036038101906102b59190613817565b610879565b6040516102c791906137d2565b60405180910390f35b6102d8610ad1565b6040516102e59190613886565b60405180910390f35b610308600480360381019061030391906138a1565b610ada565b005b610324600480360381019061031f91906138ce565b610b64565b60405161033191906137fc565b60405180910390f35b610354600480360381019061034f91906138ce565b610b7c565b60405161036191906137fc565b60405180910390f35b610372610b94565b60405161037f91906137d2565b60405180910390f35b610390610f3b565b60405161039d91906137fc565b60405180910390f35b6103c060048036038101906103bb9190613a30565b610f44565b005b6103dc60048036038101906103d791906138ce565b610faa565b6040516103e991906137d2565b60405180910390f35b61040c600480360381019061040791906138ce565b610fca565b60405161041991906137fc565b60405180910390f35b61043c600480360381019061043791906138ce565b610fe2565b60405161044991906137fc565b60405180910390f35b61045a61102a565b005b61046461103e565b6040516104719190613af2565b60405180910390f35b610494600480360381019061048f91906138ce565b611068565b005b61049e6112c8565b6040516104ab91906136df565b60405180910390f35b6104ce60048036038101906104c99190613b0d565b61135a565b005b6104ea60048036038101906104e591906138ce565b611384565b6040516104f791906137fc565b60405180910390f35b61051a600480360381019061051591906138ce565b61139c565b60405161052791906137fc565b60405180910390f35b61054a60048036038101906105459190613777565b6115bd565b60405161055791906137d2565b60405180910390f35b61057a60048036038101906105759190613d07565b6116ca565b60405161058791906137d2565b60405180910390f35b610598611b15565b6040516105a591906137fc565b60405180910390f35b6105c860048036038101906105c39190613d7f565b611b1f565b6040516105d591906137d2565b60405180910390f35b6105f860048036038101906105f39190613d7f565b611cd0565b60405161060591906137fc565b60405180910390f35b610616611d57565b60405161062391906137fc565b60405180910390f35b61064660048036038101906106419190613d07565b611db6565b60405161065391906137d2565b60405180910390f35b610676600480360381019061067191906138ce565b612129565b60405161068391906137fc565b60405180910390f35b6106a660048036038101906106a191906138ce565b612141565b005b6106c260048036038101906106bd9190613dbf565b6121c4565b6040516106cf91906137d2565b60405180910390f35b6106f260048036038101906106ed91906138ce565b6123c8565b005b61070e60048036038101906107099190613e08565b612628565b005b61072a60048036038101906107259190613ea7565b61268a565b005b606060058054806020026020016040519081016040528092919081815260200182805480156107b057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610766575b5050505050905090565b6060600280546107c990613f32565b80601f01602080910402602001604051908101604052809291908181526020018280546107f590613f32565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b6000806108576126c3565b90506108648185856126cb565b600191505092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613fd5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f90614067565b60405180910390fd5b60006109626126c3565b9050610990818686866040518060200160405280600081525060405180602001604052806000815250612894565b6109bc8186868660405180602001604052806000815250604051806020016040528060008152506129fb565b6000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a77906140f9565b60405180910390fd5b610a9686838684610a919190614148565b6126cb565b610ac48287878760405180602001604052806000815250604051806020016040528060008152506000612c15565b6001925050509392505050565b60006012905090565b610ae2612de7565b3073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610b1d92919061417c565b6020604051808303816000875af1158015610b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6091906141d1565b5050565b600d6020528060005260406000206000915090505481565b600f6020528060005260406000206000915090505481565b6000610b9e612e65565b60011515600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c289061424a565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211610c7c57600080fd5b60006103e8601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ccb9190614299565b90506000429050600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d5c57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600062015180600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610dad9190614148565b610db79190614299565b905060008111610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614316565b60405180910390fd5b60008382610e0a9190614336565b9050610e3633826040518060200160405280600081525060405180602001604052806000815250612eb4565b6201518082610e459190614336565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e8f9190614378565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f219190614148565b925050819055506001945050505050610f38612ec8565b90565b60006001905090565b610f55610f4f6126c3565b86611b1f565b610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b9061441e565b60405180910390fd5b610fa385858585856001612ed2565b5050505050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611032612de7565b61103c6000612ff0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff166110876126c3565b73ffffffffffffffffffffffffffffffffffffffff16036110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906144b0565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111c7576008600061113b6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055611264565b6001600760006111d56126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61126c6126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b6060600380546112d790613f32565b80601f016020809104026020016040519081016040528092919081815260200182805461130390613f32565b80156113505780601f1061132557610100808354040283529160200191611350565b820191906000526020600020905b81548152906001019060200180831161133357829003601f168201915b5050505050905090565b61137f6113656126c3565b848484604051806020016040528060008152506001612ed2565b505050565b600e6020528060005260406000206000915090505481565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211156115b35760001515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615150361144657600090506115b8565b60006103e8601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114959190614299565b90506000429050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561152657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b600062015180600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836115779190614148565b6115819190614299565b90506000810361159757600093505050506115b8565b600083826115a59190614336565b9050809450505050506115b8565b600090505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613fd5565b60405180910390fd5b60006116376126c3565b9050611665818286866040518060200160405280600081525060405180602001604052806000815250612894565b6116918182868660405180602001604052806000815250604051806020016040528060008152506129fb565b6116bf8182868660405180602001604052806000815250604051806020016040528060008152506000612c15565b600191505092915050565b60006116d4612de7565b81518351146116e257600080fd5b60006116ec611d57565b905060005b8351811015611b0957600084828151811061170f5761170e6144d0565b5b602002602001015190506000670de0b6b3a7640000878481518110611737576117366144d0565b5b60200260200101516117499190614336565b905060011515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503611af45783600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506305265c00600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118369190614378565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008103611af3576000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b50508080611b01906144ff565b9150506116f1565b50600191505092915050565b6000600454905090565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c375750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611c365750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b80611cc85750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b905092915050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008042905060006201518082611d6e9190614299565b905060006201518082611d819190614336565b905060008184611d919190614148565b90508062015180611da29190614148565b84611dad9190614378565b94505050505090565b6000611dc0612de7565b8151835114611dce57600080fd5b6000611dd8611d57565b905060005b835181101561211d576000848281518110611dfb57611dfa6144d0565b5b602002602001015190506000868381518110611e1a57611e196144d0565b5b6020026020010151905060001515600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503612108576001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506305265c00600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f679190614378565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550670de0b6b3a7640000816120419190614336565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50508080612115906144ff565b915050611ddd565b50600191505092915050565b60116020528060005260406000206000915090505481565b612149612de7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906145b9565b60405180910390fd5b6121c181612ff0565b50565b60006121ce612de7565b60005b82518110156123be5760008382815181106121ef576121ee6144d0565b5b602002602001015190506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806123b6906144ff565b9150506121d1565b5060019050919050565b6123d06126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061464b565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156125305760016008600061249d6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125c4565b6007600061253c6126c3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690555b6125cc6126c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6126396126336126c3565b85611b1f565b612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f9061441e565b60405180910390fd5b612684848484846130b6565b50505050565b6126ac6126956126c3565b8383604051806020016040528060008152506130b6565b5050565b600080823b905060008111915050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612731906146dd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a09061476f565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161288791906137fc565b60405180910390a3505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956040518363ffffffff1660e01b81526004016129059291906147a8565b602060405180830381865afa158015612922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294691906147e6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129f2578073ffffffffffffffffffffffffffffffffffffffff166375ab97828888888888886040518763ffffffff1660e01b81526004016129bf96959493929190614868565b600060405180830381600087803b1580156129d957600080fd5b505af11580156129ed573d6000803e3d6000fd5b505050505b50505050505050565b612a0786868686613308565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8490614949565b60405180910390fd5b8381036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b209190614378565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051612b9f93929190614969565b60405180910390a48473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612c0491906137fc565b60405180910390a350505050505050565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca877fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6040518363ffffffff1660e01b8152600401612c869291906147a8565b602060405180830381865afa158015612ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc791906147e6565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d76578073ffffffffffffffffffffffffffffffffffffffff166223de298989898989896040518763ffffffff1660e01b8152600401612d3f96959493929190614868565b600060405180830381600087803b158015612d5957600080fd5b505af1158015612d6d573d6000803e3d6000fd5b50505050612ddd565b8115612ddc57612d9b8673ffffffffffffffffffffffffffffffffffffffff166126b0565b15612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd290614a46565b60405180910390fd5b5b5b5050505050505050565b612def6126c3565b73ffffffffffffffffffffffffffffffffffffffff16612e0d61103e565b73ffffffffffffffffffffffffffffffffffffffff1614612e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5a90614ab2565b60405180910390fd5b565b6002600b5403612eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea190614b1e565b60405180910390fd5b6002600b81905550565b612ec284848484600161330e565b50505050565b6001600b81905550565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612f41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3890614bb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790614c1c565b60405180910390fd5b6000612fba6126c3565b9050612fca818888888888612894565b612fd88188888888886129fb565b612fe781888888888888612c15565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311c90614cae565b60405180910390fd5b600061312f6126c3565b905061314081866000878787612894565b61314d8186600087613308565b60008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156131d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ca90614d40565b60405180910390fd5b8481036000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550846001600082825461322a9190614148565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161329293929190614969565b60405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516132f891906137fc565b60405180910390a3505050505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361337d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337490614dac565b60405180910390fd5b6004546001548561338e9190614378565b11156133cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c690614e18565b60405180910390fd5b60006133d96126c3565b90506133e88160008888613308565b84600160008282546133fa9190614378565b92505081905550846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344f9190614378565b925050819055506134668160008888888888612c15565b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516134c793929190614969565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161352d91906137fc565b60405180910390a3505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359482613569565b9050919050565b6135a481613589565b82525050565b60006135b6838361359b565b60208301905092915050565b6000602082019050919050565b60006135da8261353d565b6135e48185613548565b93506135ef83613559565b8060005b8381101561362057815161360788826135aa565b9750613612836135c2565b9250506001810190506135f3565b5085935050505092915050565b6000602082019050818103600083015261364781846135cf565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368957808201518184015260208101905061366e565b60008484015250505050565b6000601f19601f8301169050919050565b60006136b18261364f565b6136bb818561365a565b93506136cb81856020860161366b565b6136d481613695565b840191505092915050565b600060208201905081810360008301526136f981846136a6565b905092915050565b6000604051905090565b600080fd5b600080fd5b61371e81613589565b811461372957600080fd5b50565b60008135905061373b81613715565b92915050565b6000819050919050565b61375481613741565b811461375f57600080fd5b50565b6000813590506137718161374b565b92915050565b6000806040838503121561378e5761378d61370b565b5b600061379c8582860161372c565b92505060206137ad85828601613762565b9150509250929050565b60008115159050919050565b6137cc816137b7565b82525050565b60006020820190506137e760008301846137c3565b92915050565b6137f681613741565b82525050565b600060208201905061381160008301846137ed565b92915050565b6000806000606084860312156138305761382f61370b565b5b600061383e8682870161372c565b935050602061384f8682870161372c565b925050604061386086828701613762565b9150509250925092565b600060ff82169050919050565b6138808161386a565b82525050565b600060208201905061389b6000830184613877565b92915050565b6000602082840312156138b7576138b661370b565b5b60006138c584828501613762565b91505092915050565b6000602082840312156138e4576138e361370b565b5b60006138f28482850161372c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61393d82613695565b810181811067ffffffffffffffff8211171561395c5761395b613905565b5b80604052505050565b600061396f613701565b905061397b8282613934565b919050565b600067ffffffffffffffff82111561399b5761399a613905565b5b6139a482613695565b9050602081019050919050565b82818337600083830152505050565b60006139d36139ce84613980565b613965565b9050828152602081018484840111156139ef576139ee613900565b5b6139fa8482856139b1565b509392505050565b600082601f830112613a1757613a166138fb565b5b8135613a278482602086016139c0565b91505092915050565b600080600080600060a08688031215613a4c57613a4b61370b565b5b6000613a5a8882890161372c565b9550506020613a6b8882890161372c565b9450506040613a7c88828901613762565b935050606086013567ffffffffffffffff811115613a9d57613a9c613710565b5b613aa988828901613a02565b925050608086013567ffffffffffffffff811115613aca57613ac9613710565b5b613ad688828901613a02565b9150509295509295909350565b613aec81613589565b82525050565b6000602082019050613b076000830184613ae3565b92915050565b600080600060608486031215613b2657613b2561370b565b5b6000613b348682870161372c565b9350506020613b4586828701613762565b925050604084013567ffffffffffffffff811115613b6657613b65613710565b5b613b7286828701613a02565b9150509250925092565b600067ffffffffffffffff821115613b9757613b96613905565b5b602082029050602081019050919050565b600080fd5b6000613bc0613bbb84613b7c565b613965565b90508083825260208201905060208402830185811115613be357613be2613ba8565b5b835b81811015613c0c5780613bf88882613762565b845260208401935050602081019050613be5565b5050509392505050565b600082601f830112613c2b57613c2a6138fb565b5b8135613c3b848260208601613bad565b91505092915050565b600067ffffffffffffffff821115613c5f57613c5e613905565b5b602082029050602081019050919050565b6000613c83613c7e84613c44565b613965565b90508083825260208201905060208402830185811115613ca657613ca5613ba8565b5b835b81811015613ccf5780613cbb888261372c565b845260208401935050602081019050613ca8565b5050509392505050565b600082601f830112613cee57613ced6138fb565b5b8135613cfe848260208601613c70565b91505092915050565b60008060408385031215613d1e57613d1d61370b565b5b600083013567ffffffffffffffff811115613d3c57613d3b613710565b5b613d4885828601613c16565b925050602083013567ffffffffffffffff811115613d6957613d68613710565b5b613d7585828601613cd9565b9150509250929050565b60008060408385031215613d9657613d9561370b565b5b6000613da48582860161372c565b9250506020613db58582860161372c565b9150509250929050565b600060208284031215613dd557613dd461370b565b5b600082013567ffffffffffffffff811115613df357613df2613710565b5b613dff84828501613cd9565b91505092915050565b60008060008060808587031215613e2257613e2161370b565b5b6000613e308782880161372c565b9450506020613e4187828801613762565b935050604085013567ffffffffffffffff811115613e6257613e61613710565b5b613e6e87828801613a02565b925050606085013567ffffffffffffffff811115613e8f57613e8e613710565b5b613e9b87828801613a02565b91505092959194509250565b60008060408385031215613ebe57613ebd61370b565b5b6000613ecc85828601613762565b925050602083013567ffffffffffffffff811115613eed57613eec613710565b5b613ef985828601613a02565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f4a57607f821691505b602082108103613f5d57613f5c613f03565b5b50919050565b7f4552433737373a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613fbf60248361365a565b9150613fca82613f63565b604082019050919050565b60006020820190508181036000830152613fee81613fb2565b9050919050565b7f4552433737373a207472616e736665722066726f6d20746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061405160268361365a565b915061405c82613ff5565b604082019050919050565b6000602082019050818103600083015261408081614044565b9050919050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b60006140e360298361365a565b91506140ee82614087565b604082019050919050565b60006020820190508181036000830152614112816140d6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061415382613741565b915061415e83613741565b925082820390508181111561417657614175614119565b5b92915050565b60006040820190506141916000830185613ae3565b61419e60208301846137ed565b9392505050565b6141ae816137b7565b81146141b957600080fd5b50565b6000815190506141cb816141a5565b92915050565b6000602082840312156141e7576141e661370b565b5b60006141f5848285016141bc565b91505092915050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b6000614234600f8361365a565b915061423f826141fe565b602082019050919050565b6000602082019050818103600083015261426381614227565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142a482613741565b91506142af83613741565b9250826142bf576142be61426a565b5b828204905092915050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b600061430060108361365a565b915061430b826142ca565b602082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600061434182613741565b915061434c83613741565b925082820261435a81613741565b9150828204841483151761437157614370614119565b5b5092915050565b600061438382613741565b915061438e83613741565b92508282019050808211156143a6576143a5614119565b5b92915050565b7f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60008201527f7220666f7220686f6c6465720000000000000000000000000000000000000000602082015250565b6000614408602c8361365a565b9150614413826143ac565b604082019050919050565b60006020820190508181036000830152614437816143fb565b9050919050565b7f4552433737373a20617574686f72697a696e672073656c66206173206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b600061449a60248361365a565b91506144a58261443e565b604082019050919050565b600060208201905081810360008301526144c98161448d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061450a82613741565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361453c5761453b614119565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145a360268361365a565b91506145ae82614547565b604082019050919050565b600060208201905081810360008301526145d281614596565b9050919050565b7f4552433737373a207265766f6b696e672073656c66206173206f70657261746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061463560218361365a565b9150614640826145d9565b604082019050919050565b6000602082019050818103600083015261466481614628565b9050919050565b7f4552433737373a20617070726f76652066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006146c760258361365a565b91506146d28261466b565b604082019050919050565b600060208201905081810360008301526146f6816146ba565b9050919050565b7f4552433737373a20617070726f766520746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061475960238361365a565b9150614764826146fd565b604082019050919050565b600060208201905081810360008301526147888161474c565b9050919050565b6000819050919050565b6147a28161478f565b82525050565b60006040820190506147bd6000830185613ae3565b6147ca6020830184614799565b9392505050565b6000815190506147e081613715565b92915050565b6000602082840312156147fc576147fb61370b565b5b600061480a848285016147d1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061483a82614813565b614844818561481e565b935061485481856020860161366b565b61485d81613695565b840191505092915050565b600060c08201905061487d6000830189613ae3565b61488a6020830188613ae3565b6148976040830187613ae3565b6148a460608301866137ed565b81810360808301526148b6818561482f565b905081810360a08301526148ca818461482f565b9050979650505050505050565b7f4552433737373a207472616e7366657220616d6f756e7420657863656564732060008201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b600061493360278361365a565b915061493e826148d7565b604082019050919050565b6000602082019050818103600083015261496281614926565b9050919050565b600060608201905061497e60008301866137ed565b8181036020830152614990818561482f565b905081810360408301526149a4818461482f565b9050949350505050565b7f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460008201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60208201527f6b656e73526563697069656e7400000000000000000000000000000000000000604082015250565b6000614a30604d8361365a565b9150614a3b826149ae565b606082019050919050565b60006020820190508181036000830152614a5f81614a23565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a9c60208361365a565b9150614aa782614a66565b602082019050919050565b60006020820190508181036000830152614acb81614a8f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614b08601f8361365a565b9150614b1382614ad2565b602082019050919050565b60006020820190508181036000830152614b3781614afb565b9050919050565b7f4552433737373a2073656e642066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b9a60228361365a565b9150614ba582614b3e565b604082019050919050565b60006020820190508181036000830152614bc981614b8d565b9050919050565b7f4552433737373a2073656e6420746f20746865207a65726f2061646472657373600082015250565b6000614c0660208361365a565b9150614c1182614bd0565b602082019050919050565b60006020820190508181036000830152614c3581614bf9565b9050919050565b7f4552433737373a206275726e2066726f6d20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c9860228361365a565b9150614ca382614c3c565b604082019050919050565b60006020820190508181036000830152614cc781614c8b565b9050919050565b7f4552433737373a206275726e20616d6f756e7420657863656564732062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b6000614d2a60238361365a565b9150614d3582614cce565b604082019050919050565b60006020820190508181036000830152614d5981614d1d565b9050919050565b7f4552433737373a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d9660208361365a565b9150614da182614d60565b602082019050919050565b60006020820190508181036000830152614dc581614d89565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b6000614e0260118361365a565b9150614e0d82614dcc565b602082019050919050565b60006020820190508181036000830152614e3181614df5565b905091905056fea26469706673582212209f1b05eba27e7396061c136ca6755d1cb8d607f139fabf77a3ce492bc77664ae64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

147:6360:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6887:130:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2994:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8476:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3787:123;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9047:806;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3434:82;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6388:114:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;278:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;393:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5416:964;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3631:95:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7136:366;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;220:49:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4010:150:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:8;;;:::i;:::-;;1194:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5942:412:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3148:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4290:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;332:52:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4337:1041;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4714:439:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2389:1303:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5416:85:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5564:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8187:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;885:297:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1266:1054;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;510:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3746:521:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6418:403:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7623:325;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5283:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6887:130;6953:16;6988:22;6981:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6887:130;:::o;2994:98::-;3048:13;3080:5;3073:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2994:98;:::o;8476:197::-;8558:4;8574:14;8591:12;:10;:12::i;:::-;8574:29;;8613:32;8622:6;8630:7;8639:5;8613:8;:32::i;:::-;8662:4;8655:11;;;8476:197;;;;:::o;3787:123::-;3865:7;3891:12;;3884:19;;3787:123;:::o;9047:806::-;9183:4;9228:1;9207:23;;:9;:23;;;9199:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;9307:1;9289:20;;:6;:20;;;9281:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9363:15;9381:12;:10;:12::i;:::-;9363:30;;9404:61;9422:7;9431:6;9439:9;9450:6;9404:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;9476:49;9482:7;9491:6;9499:9;9510:6;9476:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;9536:24;9563:11;:19;9575:6;9563:19;;;;;;;;;;;;;;;:28;9583:7;9563:28;;;;;;;;;;;;;;;;9536:55;;9629:6;9609:16;:26;;9601:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;9691:52;9700:6;9708:7;9736:6;9717:16;:25;;;;:::i;:::-;9691:8;:52::i;:::-;9754:70;9774:7;9783:6;9791:9;9802:6;9754:70;;;;;;;;;;;;;;;;;;;;;;;;9818:5;9754:19;:70::i;:::-;9842:4;9835:11;;;;9047:806;;;;;:::o;3434:82::-;3483:5;3507:2;3500:9;;3434:82;:::o;6388:114:10:-;1087:13:8;:11;:13::i;:::-;6460:4:10::1;:13;;;6474:10;6486:7;6460:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6388:114:::0;:::o;278:45::-;;;;;;;;;;;;;;;;;:::o;393:50::-;;;;;;;;;;;;;;;;;:::o;5416:964::-;5462:4;2311:21:9;:19;:21::i;:::-;5518:4:10::1;5487:35;;:17;:29;5505:10;5487:29;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;5479:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5576:20;:32;5597:10;5576:32;;;;;;;;;;;;;;;;5560:15;:48;5552:57;;;::::0;::::1;;5620:26;5677:4;5647:17;:29;5665:10;5647:29;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;5620:61;;5692:16;5709:15;5692:32;;5748:18;:30;5767:10;5748:30;;;;;;;;;;;;;;;;5739:8;:39;5735:111;;;5804:18;:30;5823:10;5804:30;;;;;;;;;;;;;;;;5795:39;;5735:111;5937:28;6003:5;5976:13;:25;5990:10;5976:25;;;;;;;;;;;;;;;;5967:8;:34;;;;:::i;:::-;5966:42;;;;:::i;:::-;5937:71;;6048:1;6027:20;:22;6019:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;6080:24;6126:18;6105:20;:39;;;;:::i;:::-;6080:64;;6155:42;6161:10;6173:16;6155:42;;;;;;;;;;;::::0;::::1;;;;;;;;;;;::::0;:5:::1;:42::i;:::-;6282:5;6261:20;:26;;;;:::i;:::-;6234:13;:25;6248:10;6234:25;;;;;;;;;;;;;;;;:54;;;;:::i;:::-;6208:13;:25;6222:10;6208:25;;;;;;;;;;;;;;;:80;;;;6334:16;6299:21;:33;6321:10;6299:33;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;6368:4;6361:11;;;;;;2355:20:9::0;:18;:20::i;:::-;5416:964:10;:::o;3631:95:2:-;3692:7;3718:1;3711:8;;3631:95;:::o;7136:366::-;7343:35;7357:12;:10;:12::i;:::-;7371:6;7343:13;:35::i;:::-;7335:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;7437:58;7443:6;7451:9;7462:6;7470:4;7476:12;7490:4;7437:5;:58::i;:::-;7136:366;;;;;:::o;220:49:10:-;;;;;;;;;;;;;;;;;;;;;;:::o;452:::-;;;;;;;;;;;;;;;;;:::o;4010:150:2:-;4105:7;4131:9;:22;4141:11;4131:22;;;;;;;;;;;;;;;;4124:29;;4010:150;;;:::o;1824:101:8:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1194:85::-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;5942:412:2:-;6045:8;6029:24;;:12;:10;:12::i;:::-;:24;;;6021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6109:17;:27;6127:8;6109:27;;;;;;;;;;;;;;;;;;;;;;;;;6105:185;;;6159:24;:38;6184:12;:10;:12::i;:::-;6159:38;;;;;;;;;;;;;;;:48;6198:8;6159:48;;;;;;;;;;;;;;;;6152:55;;;;;;;;;;;6105:185;;;6275:4;6238:10;:24;6249:12;:10;:12::i;:::-;6238:24;;;;;;;;;;;;;;;:34;6263:8;6238:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;6105:185;6334:12;:10;:12::i;:::-;6305:42;;6324:8;6305:42;;;;;;;;;;;;5942:412;:::o;3148:102::-;3204:13;3236:7;3229:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3148:102;:::o;4290:193::-;4422:54;4428:12;:10;:12::i;:::-;4442:9;4453:6;4461:4;4422:54;;;;;;;;;;;;4471:4;4422:5;:54::i;:::-;4290:193;;;:::o;332:52:10:-;;;;;;;;;;;;;;;;;:::o;4337:1041::-;4404:7;4442:20;:32;4463:10;4442:32;;;;;;;;;;;;;;;;4426:15;:48;4423:948;;;4520:5;4494:31;;:17;:24;4512:5;4494:24;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;4490:821;;4552:1;4545:8;;;;4490:821;4607:26;4659:4;4634:17;:24;4652:5;4634:24;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;4607:56;;4682:16;4699:15;4682:32;;4746:18;:25;4765:5;4746:25;;;;;;;;;;;;;;;;4737:8;:34;4733:117;;;4805:18;:25;4824:5;4805:25;;;;;;;;;;;;;;;;4796:34;;4733:117;4957:28;5018:5;4996:13;:20;5010:5;4996:20;;;;;;;;;;;;;;;;4987:8;:29;;;;:::i;:::-;4986:37;;;;:::i;:::-;4957:66;;5068:1;5046:20;:23;5042:254;;5100:1;5093:8;;;;;;;5042:254;5166:24;5212:18;5191:20;:39;;;;:::i;:::-;5166:64;;5260:16;5253:23;;;;;;;;4423:948;5358:1;5351:8;;4337:1041;;;;:::o;4714:439:2:-;4800:4;4845:1;4824:23;;:9;:23;;;4816:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4899:12;4914;:10;:12::i;:::-;4899:27;;4937:56;4955:4;4961;4967:9;4978:6;4937:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;5004:44;5010:4;5016;5022:9;5033:6;5004:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;5059:65;5079:4;5085;5091:9;5102:6;5059:65;;;;;;;;;;;;;;;;;;;;;;;;5118:5;5059:19;:65::i;:::-;5142:4;5135:11;;;4714:439;;;;:::o;2389:1303:10:-;2516:4;1087:13:8;:11;:13::i;:::-;2567:10:10::1;:17;2541;:24;:43;2533:52;;;::::0;::::1;;2596:32;2629:15;:13;:15::i;:::-;2596:48;;2659:6;2655:1008;2670:10;:17;2668:1;:19;2655:1008;;;2707:20;2728:10;2739:1;2728:13;;;;;;;;:::i;:::-;;;;;;;;2707:34;;2756:23;2801:4;2780:17;2798:1;2780:20;;;;;;;;:::i;:::-;;;;;;;;:25;;;;:::i;:::-;2756:49;;2856:4;2823:37;;:17;:31;2841:12;2823:31;;;;;;;;;;;;;;;;;;;;;;;;;:37;;::::0;2820:832:::1;;2991:24;2956:20;:34;2977:12;2956:34;;;;;;;;;;;;;;;:59;;;;3104:9;3067:20;:34;3088:12;3067:34;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;3034:18;:32;3053:12;3034:32;;;;;;;;;;;;;;;:79;;;;3160:20;:34;3181:12;3160:34;;;;;;;;;;;;;;;;3132:13;:27;3146:12;3132:27;;;;;;;;;;;;;;;:62;;;;3245:15;3213:17;:31;3231:12;3213:31;;;;;;;;;;;;;;;:47;;;;3315:17;:31;3333:12;3315:31;;;;;;;;;;;;;;;;3279:21;:35;3301:12;3279:35;;;;;;;;;;;;;;;:67;;;;3387:1;3370:15;:18:::0;3367:270:::1;;3444:5;3412:17;:31;3430:12;3412:31;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;3507:1;3472:20;:34;3493:12;3472:34;;;;;;;;;;;;;;;:36;;;;3564:1;3531:18;:32;3550:12;3531:32;;;;;;;;;;;;;;;:34;;;;3616:1;3588:13;:27;3602:12;3588:27;;;;;;;;;;;;;;;:29;;;;3367:270;2820:832;2692:971;;2688:3;;;;;:::i;:::-;;;;2655:1008;;;;3680:4;3673:11;;;2389:1303:::0;;;;:::o;5416:85:2:-;5458:7;5484:10;;5477:17;;5416:85;:::o;5564:311::-;5664:4;5711:11;5699:23;;:8;:23;;;:120;;;;5739:17;:27;5757:8;5739:27;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;5771:24;:37;5796:11;5771:37;;;;;;;;;;;;;;;:47;5809:8;5771:47;;;;;;;;;;;;;;;;;;;;;;;;;5770:48;5739:79;5699:120;:169;;;;5835:10;:23;5846:11;5835:23;;;;;;;;;;;;;;;:33;5859:8;5835:33;;;;;;;;;;;;;;;;;;;;;;;;;5699:169;5680:188;;5564:311;;;;:::o;8187:151::-;8277:7;8303:11;:19;8315:6;8303:19;;;;;;;;;;;;;;;:28;8323:7;8303:28;;;;;;;;;;;;;;;;8296:35;;8187:151;;;;:::o;885:297:10:-;931:7;951:16;968:15;951:32;;994:23;1027:5;1018:8;:14;;;;:::i;:::-;994:38;;1043:21;1082:5;1066:15;:21;;;;:::i;:::-;1043:44;;1098:12;1120:13;1111:8;:22;;;;:::i;:::-;1098:35;;1169:4;1163:5;:10;;;;:::i;:::-;1151:8;:23;;;;:::i;:::-;1144:30;;;;;;885:297;:::o;1266:1054::-;1390:4;1087:13:8;:11;:13::i;:::-;1441:10:10::1;:17;1415;:24;:43;1407:52;;;::::0;::::1;;1470:32;1503:15;:13;:15::i;:::-;1470:48;;1533:6;1529:762;1544:10;:17;1542:1;:19;1529:762;;;1581:20;1602:10;1613:1;1602:13;;;;;;;;:::i;:::-;;;;;;;;1581:34;;1630:19;1650:17;1668:1;1650:20;;;;;;;;:::i;:::-;;;;;;;;1630:40;;1789:5;1756:38;;:17;:31;1774:12;1756:31;;;;;;;;;;;;;;;;;;;;;;;;;:38;;::::0;1753:527:::1;;1846:4;1814:17;:31;1832:12;1814:31;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;1904:24;1869:20;:34;1890:12;1869:34;;;;;;;;;;;;;;;:59;;;;2017:9;1980:20;:34;2001:12;1980:34;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;1947:18;:32;1966:12;1947:32;;;;;;;;;;;;;;;:79;;;;2073:20;:34;2094:12;2073:34;;;;;;;;;;;;;;;;2045:13;:27;2059:12;2045:27;;;;;;;;;;;;;;;:62;;;;2174:4;2162:11;:16;;;;:::i;:::-;2126:21;:35;2148:12;2126:35;;;;;;;;;;;;;;;:52;;;;2229:21;:35;2251:12;2229:35;;;;;;;;;;;;;;;;2197:17;:31;2215:12;2197:31;;;;;;;;;;;;;;;:67;;;;1753:527;1566:725;;1562:3;;;;;:::i;:::-;;;;1529:762;;;;2308:4;2301:11;;;1266:1054:::0;;;;:::o;510:53::-;;;;;;;;;;;;;;;;;:::o;2074:198:8:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;3746:521:10:-;3827:4;1087:13:8;:11;:13::i;:::-;3848:6:10::1;3844:394;3859:10;:17;3857:1;:19;3844:394;;;3896:20;3917:10;3928:1;3917:13;;;;;;;;:::i;:::-;;;;;;;;3896:34;;3977:5;3945:17;:31;3963:12;3945:31;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4032:1;3997:20;:34;4018:12;3997:34;;;;;;;;;;;;;;;:36;;;;4081:1;4048:18;:32;4067:12;4048:32;;;;;;;;;;;;;;;:34;;;;4125:1;4097:13;:27;4111:12;4097:27;;;;;;;;;;;;;;;:29;;;;4173:1;4141:17;:31;4159:12;4141:31;;;;;;;;;;;;;;;:33;;;;4225:1;4189:21;:35;4211:12;4189:35;;;;;;;;;;;;;;;:37;;;;3881:357;3877:3;;;;;:::i;:::-;;;;3844:394;;;;4255:4;4248:11;;3746:521:::0;;;:::o;6418:403:2:-;6514:12;:10;:12::i;:::-;6502:24;;:8;:24;;;6494:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;6579:17;:27;6597:8;6579:27;;;;;;;;;;;;;;;;;;;;;;;;;6575:185;;;6673:4;6622:24;:38;6647:12;:10;:12::i;:::-;6622:38;;;;;;;;;;;;;;;:48;6661:8;6622:48;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;6575:185;;;6715:10;:24;6726:12;:10;:12::i;:::-;6715:24;;;;;;;;;;;;;;;:34;6740:8;6715:34;;;;;;;;;;;;;;;;6708:41;;;;;;;;;;;6575:185;6801:12;:10;:12::i;:::-;6775:39;;6791:8;6775:39;;;;;;;;;;;;6418:403;:::o;7623:325::-;7804:36;7818:12;:10;:12::i;:::-;7832:7;7804:13;:36::i;:::-;7796:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;7899:42;7905:7;7914:6;7922:4;7928:12;7899:5;:42::i;:::-;7623:325;;;;:::o;5283:127::-;5366:37;5372:12;:10;:12::i;:::-;5386:6;5394:4;5366:37;;;;;;;;;;;;:5;:37::i;:::-;5283:127;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;15062:365:2:-;15203:1;15185:20;;:6;:20;;;15177:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;15284:1;15265:21;;:7;:21;;;15257:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;15368:5;15337:11;:19;15349:6;15337:19;;;;;;;;;;;;;;;:28;15357:7;15337:28;;;;;;;;;;;;;;;:36;;;;15405:7;15388:32;;15397:6;15388:32;;;15414:5;15388:32;;;;;;:::i;:::-;;;;;;;;15062:365;;;:::o;15900:472::-;16109:19;1176:42;16131:41;;;16173:4;1503:31;16131:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16109:100;;16246:1;16223:25;;:11;:25;;;16219:147;;16278:11;16264:39;;;16304:8;16314:4;16320:2;16324:6;16332:8;16342:12;16264:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16219:147;16099:273;15900:472;;;;;;:::o;14313:611::-;14510:48;14531:8;14541:4;14547:2;14551:6;14510:20;:48::i;:::-;14569:19;14591:9;:15;14601:4;14591:15;;;;;;;;;;;;;;;;14569:37;;14639:6;14624:11;:21;;14616:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14755:6;14741:11;:20;14723:9;:15;14733:4;14723:15;;;;;;;;;;;;;;;:38;;;;14798:6;14781:9;:13;14791:2;14781:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;14841:2;14820:56;;14835:4;14820:56;;14825:8;14820:56;;;14845:6;14853:8;14863:12;14820:56;;;;;;;;:::i;:::-;;;;;;;;14906:2;14891:26;;14900:4;14891:26;;;14910:6;14891:26;;;;;;:::i;:::-;;;;;;;;14500:424;14313:611;;;;;;:::o;17061:676::-;17306:19;1176:42;17328:41;;;17370:2;1600:34;17328:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17306:101;;17444:1;17421:25;;:11;:25;;;17417:314;;17479:11;17462:44;;;17507:8;17517:4;17523:2;17527:6;17535:8;17545:12;17462:96;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17417:314;;;17579:19;17575:156;;;17623:15;:2;:13;;;:15::i;:::-;17622:16;17614:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;17575:156;17417:314;17296:441;17061:676;;;;;;;:::o;1352:130:8:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;2391:293:9:-;1793:1;2525:7;;:19;2517:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1793:1;2658:7;:18;;;;2391:293::o;10423:222:2:-;10586:52;10592:7;10601:6;10609:8;10619:12;10633:4;10586:5;:52::i;:::-;10423:222;;;;:::o;2692:213:9:-;1749:1;2875:7;:22;;;;2692:213::o;12541:650:2:-;12779:1;12763:18;;:4;:18;;;12755:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12852:1;12838:16;;:2;:16;;;12830:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;12902:16;12921:12;:10;:12::i;:::-;12902:31;;12944:69;12962:8;12972:4;12978:2;12982:6;12990:8;13000:12;12944:17;:69::i;:::-;13024:57;13030:8;13040:4;13046:2;13050:6;13058:8;13068:12;13024:5;:57::i;:::-;13092:92;13112:8;13122:4;13128:2;13132:6;13140:8;13150:12;13164:19;13092;:92::i;:::-;12745:446;12541:650;;;;;;:::o;2426:187:8:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;13496:811:2:-;13676:1;13660:18;;:4;:18;;;13652:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13728:16;13747:12;:10;:12::i;:::-;13728:31;;13770:73;13788:8;13798:4;13812:1;13816:6;13824:4;13830:12;13770:17;:73::i;:::-;13854:56;13875:8;13885:4;13899:1;13903:6;13854:20;:56::i;:::-;13955:19;13977:9;:15;13987:4;13977:15;;;;;;;;;;;;;;;;13955:37;;14025:6;14010:11;:21;;14002:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;14137:6;14123:11;:20;14105:9;:15;14115:4;14105:15;;;;;;;;;;;;;;;:38;;;;14179:6;14163:12;;:22;;;;;;;:::i;:::-;;;;;;;;14218:4;14201:50;;14208:8;14201:50;;;14224:6;14232:4;14238:12;14201:50;;;;;;;;:::i;:::-;;;;;;;;14289:1;14266:34;;14275:4;14266:34;;;14293:6;14266:34;;;;;;:::i;:::-;;;;;;;;13642:665;;13496:811;;;;:::o;18365:147::-;;;;;:::o;11267:798::-;11491:1;11472:21;;:7;:21;;;11464:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11571:10;;11556:12;;11549:6;:19;;;;:::i;:::-;11548:33;;11540:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;11613:16;11632:12;:10;:12::i;:::-;11613:31;;11655:59;11676:8;11694:1;11698:7;11707:6;11655:20;:59::i;:::-;11775:6;11759:12;;:22;;;;;;;:::i;:::-;;;;;;;;11813:6;11791:9;:18;11801:7;11791:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;11830:103;11850:8;11868:1;11872:7;11881:6;11889:8;11899:12;11913:19;11830;:103::i;:::-;11966:7;11949:57;;11956:8;11949:57;;;11975:6;11983:8;11993:12;11949:57;;;;;;;;:::i;:::-;;;;;;;;12042:7;12021:37;;12038:1;12021:37;;;12051:6;12021:37;;;;;;:::i;:::-;;;;;;;;11454:611;11267:798;;;;;:::o;7:114:11:-;74:6;108:5;102:12;92:22;;7:114;;;:::o;127:184::-;226:11;260:6;255:3;248:19;300:4;295:3;291:14;276:29;;127:184;;;;:::o;317:132::-;384:4;407:3;399:11;;437:4;432:3;428:14;420:22;;317:132;;;:::o;455:126::-;492:7;532:42;525:5;521:54;510:65;;455:126;;;:::o;587:96::-;624:7;653:24;671:5;653:24;:::i;:::-;642:35;;587:96;;;:::o;689:108::-;766:24;784:5;766:24;:::i;:::-;761:3;754:37;689:108;;:::o;803:179::-;872:10;893:46;935:3;927:6;893:46;:::i;:::-;971:4;966:3;962:14;948:28;;803:179;;;;:::o;988:113::-;1058:4;1090;1085:3;1081:14;1073:22;;988:113;;;:::o;1137:732::-;1256:3;1285:54;1333:5;1285:54;:::i;:::-;1355:86;1434:6;1429:3;1355:86;:::i;:::-;1348:93;;1465:56;1515:5;1465:56;:::i;:::-;1544:7;1575:1;1560:284;1585:6;1582:1;1579:13;1560:284;;;1661:6;1655:13;1688:63;1747:3;1732:13;1688:63;:::i;:::-;1681:70;;1774:60;1827:6;1774:60;:::i;:::-;1764:70;;1620:224;1607:1;1604;1600:9;1595:14;;1560:284;;;1564:14;1860:3;1853:10;;1261:608;;;1137:732;;;;:::o;1875:373::-;2018:4;2056:2;2045:9;2041:18;2033:26;;2105:9;2099:4;2095:20;2091:1;2080:9;2076:17;2069:47;2133:108;2236:4;2227:6;2133:108;:::i;:::-;2125:116;;1875:373;;;;:::o;2254:99::-;2306:6;2340:5;2334:12;2324:22;;2254:99;;;:::o;2359:169::-;2443:11;2477:6;2472:3;2465:19;2517:4;2512:3;2508:14;2493:29;;2359:169;;;;:::o;2534:246::-;2615:1;2625:113;2639:6;2636:1;2633:13;2625:113;;;2724:1;2719:3;2715:11;2709:18;2705:1;2700:3;2696:11;2689:39;2661:2;2658:1;2654:10;2649:15;;2625:113;;;2772:1;2763:6;2758:3;2754:16;2747:27;2596:184;2534:246;;;:::o;2786:102::-;2827:6;2878:2;2874:7;2869:2;2862:5;2858:14;2854:28;2844:38;;2786:102;;;:::o;2894:377::-;2982:3;3010:39;3043:5;3010:39;:::i;:::-;3065:71;3129:6;3124:3;3065:71;:::i;:::-;3058:78;;3145:65;3203:6;3198:3;3191:4;3184:5;3180:16;3145:65;:::i;:::-;3235:29;3257:6;3235:29;:::i;:::-;3230:3;3226:39;3219:46;;2986:285;2894:377;;;;:::o;3277:313::-;3390:4;3428:2;3417:9;3413:18;3405:26;;3477:9;3471:4;3467:20;3463:1;3452:9;3448:17;3441:47;3505:78;3578:4;3569:6;3505:78;:::i;:::-;3497:86;;3277:313;;;;:::o;3596:75::-;3629:6;3662:2;3656:9;3646:19;;3596:75;:::o;3677:117::-;3786:1;3783;3776:12;3800:117;3909:1;3906;3899:12;3923:122;3996:24;4014:5;3996:24;:::i;:::-;3989:5;3986:35;3976:63;;4035:1;4032;4025:12;3976:63;3923:122;:::o;4051:139::-;4097:5;4135:6;4122:20;4113:29;;4151:33;4178:5;4151:33;:::i;:::-;4051:139;;;;:::o;4196:77::-;4233:7;4262:5;4251:16;;4196:77;;;:::o;4279:122::-;4352:24;4370:5;4352:24;:::i;:::-;4345:5;4342:35;4332:63;;4391:1;4388;4381:12;4332:63;4279:122;:::o;4407:139::-;4453:5;4491:6;4478:20;4469:29;;4507:33;4534:5;4507:33;:::i;:::-;4407:139;;;;:::o;4552:474::-;4620:6;4628;4677:2;4665:9;4656:7;4652:23;4648:32;4645:119;;;4683:79;;:::i;:::-;4645:119;4803:1;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4774:117;4930:2;4956:53;5001:7;4992:6;4981:9;4977:22;4956:53;:::i;:::-;4946:63;;4901:118;4552:474;;;;;:::o;5032:90::-;5066:7;5109:5;5102:13;5095:21;5084:32;;5032:90;;;:::o;5128:109::-;5209:21;5224:5;5209:21;:::i;:::-;5204:3;5197:34;5128:109;;:::o;5243:210::-;5330:4;5368:2;5357:9;5353:18;5345:26;;5381:65;5443:1;5432:9;5428:17;5419:6;5381:65;:::i;:::-;5243:210;;;;:::o;5459:118::-;5546:24;5564:5;5546:24;:::i;:::-;5541:3;5534:37;5459:118;;:::o;5583:222::-;5676:4;5714:2;5703:9;5699:18;5691:26;;5727:71;5795:1;5784:9;5780:17;5771:6;5727:71;:::i;:::-;5583:222;;;;:::o;5811:619::-;5888:6;5896;5904;5953:2;5941:9;5932:7;5928:23;5924:32;5921:119;;;5959:79;;:::i;:::-;5921:119;6079:1;6104:53;6149:7;6140:6;6129:9;6125:22;6104:53;:::i;:::-;6094:63;;6050:117;6206:2;6232:53;6277:7;6268:6;6257:9;6253:22;6232:53;:::i;:::-;6222:63;;6177:118;6334:2;6360:53;6405:7;6396:6;6385:9;6381:22;6360:53;:::i;:::-;6350:63;;6305:118;5811:619;;;;;:::o;6436:86::-;6471:7;6511:4;6504:5;6500:16;6489:27;;6436:86;;;:::o;6528:112::-;6611:22;6627:5;6611:22;:::i;:::-;6606:3;6599:35;6528:112;;:::o;6646:214::-;6735:4;6773:2;6762:9;6758:18;6750:26;;6786:67;6850:1;6839:9;6835:17;6826:6;6786:67;:::i;:::-;6646:214;;;;:::o;6866:329::-;6925:6;6974:2;6962:9;6953:7;6949:23;6945:32;6942:119;;;6980:79;;:::i;:::-;6942:119;7100:1;7125:53;7170:7;7161:6;7150:9;7146:22;7125:53;:::i;:::-;7115:63;;7071:117;6866:329;;;;:::o;7201:::-;7260:6;7309:2;7297:9;7288:7;7284:23;7280:32;7277:119;;;7315:79;;:::i;:::-;7277:119;7435:1;7460:53;7505:7;7496:6;7485:9;7481:22;7460:53;:::i;:::-;7450:63;;7406:117;7201:329;;;;:::o;7536:117::-;7645:1;7642;7635:12;7659:117;7768:1;7765;7758:12;7782:180;7830:77;7827:1;7820:88;7927:4;7924:1;7917:15;7951:4;7948:1;7941:15;7968:281;8051:27;8073:4;8051:27;:::i;:::-;8043:6;8039:40;8181:6;8169:10;8166:22;8145:18;8133:10;8130:34;8127:62;8124:88;;;8192:18;;:::i;:::-;8124:88;8232:10;8228:2;8221:22;8011:238;7968:281;;:::o;8255:129::-;8289:6;8316:20;;:::i;:::-;8306:30;;8345:33;8373:4;8365:6;8345:33;:::i;:::-;8255:129;;;:::o;8390:307::-;8451:4;8541:18;8533:6;8530:30;8527:56;;;8563:18;;:::i;:::-;8527:56;8601:29;8623:6;8601:29;:::i;:::-;8593:37;;8685:4;8679;8675:15;8667:23;;8390:307;;;:::o;8703:146::-;8800:6;8795:3;8790;8777:30;8841:1;8832:6;8827:3;8823:16;8816:27;8703:146;;;:::o;8855:423::-;8932:5;8957:65;8973:48;9014:6;8973:48;:::i;:::-;8957:65;:::i;:::-;8948:74;;9045:6;9038:5;9031:21;9083:4;9076:5;9072:16;9121:3;9112:6;9107:3;9103:16;9100:25;9097:112;;;9128:79;;:::i;:::-;9097:112;9218:54;9265:6;9260:3;9255;9218:54;:::i;:::-;8938:340;8855:423;;;;;:::o;9297:338::-;9352:5;9401:3;9394:4;9386:6;9382:17;9378:27;9368:122;;9409:79;;:::i;:::-;9368:122;9526:6;9513:20;9551:78;9625:3;9617:6;9610:4;9602:6;9598:17;9551:78;:::i;:::-;9542:87;;9358:277;9297:338;;;;:::o;9641:1267::-;9754:6;9762;9770;9778;9786;9835:3;9823:9;9814:7;9810:23;9806:33;9803:120;;;9842:79;;:::i;:::-;9803:120;9962:1;9987:53;10032:7;10023:6;10012:9;10008:22;9987:53;:::i;:::-;9977:63;;9933:117;10089:2;10115:53;10160:7;10151:6;10140:9;10136:22;10115:53;:::i;:::-;10105:63;;10060:118;10217:2;10243:53;10288:7;10279:6;10268:9;10264:22;10243:53;:::i;:::-;10233:63;;10188:118;10373:2;10362:9;10358:18;10345:32;10404:18;10396:6;10393:30;10390:117;;;10426:79;;:::i;:::-;10390:117;10531:62;10585:7;10576:6;10565:9;10561:22;10531:62;:::i;:::-;10521:72;;10316:287;10670:3;10659:9;10655:19;10642:33;10702:18;10694:6;10691:30;10688:117;;;10724:79;;:::i;:::-;10688:117;10829:62;10883:7;10874:6;10863:9;10859:22;10829:62;:::i;:::-;10819:72;;10613:288;9641:1267;;;;;;;;:::o;10914:118::-;11001:24;11019:5;11001:24;:::i;:::-;10996:3;10989:37;10914:118;;:::o;11038:222::-;11131:4;11169:2;11158:9;11154:18;11146:26;;11182:71;11250:1;11239:9;11235:17;11226:6;11182:71;:::i;:::-;11038:222;;;;:::o;11266:797::-;11352:6;11360;11368;11417:2;11405:9;11396:7;11392:23;11388:32;11385:119;;;11423:79;;:::i;:::-;11385:119;11543:1;11568:53;11613:7;11604:6;11593:9;11589:22;11568:53;:::i;:::-;11558:63;;11514:117;11670:2;11696:53;11741:7;11732:6;11721:9;11717:22;11696:53;:::i;:::-;11686:63;;11641:118;11826:2;11815:9;11811:18;11798:32;11857:18;11849:6;11846:30;11843:117;;;11879:79;;:::i;:::-;11843:117;11984:62;12038:7;12029:6;12018:9;12014:22;11984:62;:::i;:::-;11974:72;;11769:287;11266:797;;;;;:::o;12069:311::-;12146:4;12236:18;12228:6;12225:30;12222:56;;;12258:18;;:::i;:::-;12222:56;12308:4;12300:6;12296:17;12288:25;;12368:4;12362;12358:15;12350:23;;12069:311;;;:::o;12386:117::-;12495:1;12492;12485:12;12526:710;12622:5;12647:81;12663:64;12720:6;12663:64;:::i;:::-;12647:81;:::i;:::-;12638:90;;12748:5;12777:6;12770:5;12763:21;12811:4;12804:5;12800:16;12793:23;;12864:4;12856:6;12852:17;12844:6;12840:30;12893:3;12885:6;12882:15;12879:122;;;12912:79;;:::i;:::-;12879:122;13027:6;13010:220;13044:6;13039:3;13036:15;13010:220;;;13119:3;13148:37;13181:3;13169:10;13148:37;:::i;:::-;13143:3;13136:50;13215:4;13210:3;13206:14;13199:21;;13086:144;13070:4;13065:3;13061:14;13054:21;;13010:220;;;13014:21;12628:608;;12526:710;;;;;:::o;13259:370::-;13330:5;13379:3;13372:4;13364:6;13360:17;13356:27;13346:122;;13387:79;;:::i;:::-;13346:122;13504:6;13491:20;13529:94;13619:3;13611:6;13604:4;13596:6;13592:17;13529:94;:::i;:::-;13520:103;;13336:293;13259:370;;;;:::o;13635:311::-;13712:4;13802:18;13794:6;13791:30;13788:56;;;13824:18;;:::i;:::-;13788:56;13874:4;13866:6;13862:17;13854:25;;13934:4;13928;13924:15;13916:23;;13635:311;;;:::o;13969:710::-;14065:5;14090:81;14106:64;14163:6;14106:64;:::i;:::-;14090:81;:::i;:::-;14081:90;;14191:5;14220:6;14213:5;14206:21;14254:4;14247:5;14243:16;14236:23;;14307:4;14299:6;14295:17;14287:6;14283:30;14336:3;14328:6;14325:15;14322:122;;;14355:79;;:::i;:::-;14322:122;14470:6;14453:220;14487:6;14482:3;14479:15;14453:220;;;14562:3;14591:37;14624:3;14612:10;14591:37;:::i;:::-;14586:3;14579:50;14658:4;14653:3;14649:14;14642:21;;14529:144;14513:4;14508:3;14504:14;14497:21;;14453:220;;;14457:21;14071:608;;13969:710;;;;;:::o;14702:370::-;14773:5;14822:3;14815:4;14807:6;14803:17;14799:27;14789:122;;14830:79;;:::i;:::-;14789:122;14947:6;14934:20;14972:94;15062:3;15054:6;15047:4;15039:6;15035:17;14972:94;:::i;:::-;14963:103;;14779:293;14702:370;;;;:::o;15078:894::-;15196:6;15204;15253:2;15241:9;15232:7;15228:23;15224:32;15221:119;;;15259:79;;:::i;:::-;15221:119;15407:1;15396:9;15392:17;15379:31;15437:18;15429:6;15426:30;15423:117;;;15459:79;;:::i;:::-;15423:117;15564:78;15634:7;15625:6;15614:9;15610:22;15564:78;:::i;:::-;15554:88;;15350:302;15719:2;15708:9;15704:18;15691:32;15750:18;15742:6;15739:30;15736:117;;;15772:79;;:::i;:::-;15736:117;15877:78;15947:7;15938:6;15927:9;15923:22;15877:78;:::i;:::-;15867:88;;15662:303;15078:894;;;;;:::o;15978:474::-;16046:6;16054;16103:2;16091:9;16082:7;16078:23;16074:32;16071:119;;;16109:79;;:::i;:::-;16071:119;16229:1;16254:53;16299:7;16290:6;16279:9;16275:22;16254:53;:::i;:::-;16244:63;;16200:117;16356:2;16382:53;16427:7;16418:6;16407:9;16403:22;16382:53;:::i;:::-;16372:63;;16327:118;15978:474;;;;;:::o;16458:539::-;16542:6;16591:2;16579:9;16570:7;16566:23;16562:32;16559:119;;;16597:79;;:::i;:::-;16559:119;16745:1;16734:9;16730:17;16717:31;16775:18;16767:6;16764:30;16761:117;;;16797:79;;:::i;:::-;16761:117;16902:78;16972:7;16963:6;16952:9;16948:22;16902:78;:::i;:::-;16892:88;;16688:302;16458:539;;;;:::o;17003:1121::-;17107:6;17115;17123;17131;17180:3;17168:9;17159:7;17155:23;17151:33;17148:120;;;17187:79;;:::i;:::-;17148:120;17307:1;17332:53;17377:7;17368:6;17357:9;17353:22;17332:53;:::i;:::-;17322:63;;17278:117;17434:2;17460:53;17505:7;17496:6;17485:9;17481:22;17460:53;:::i;:::-;17450:63;;17405:118;17590:2;17579:9;17575:18;17562:32;17621:18;17613:6;17610:30;17607:117;;;17643:79;;:::i;:::-;17607:117;17748:62;17802:7;17793:6;17782:9;17778:22;17748:62;:::i;:::-;17738:72;;17533:287;17887:2;17876:9;17872:18;17859:32;17918:18;17910:6;17907:30;17904:117;;;17940:79;;:::i;:::-;17904:117;18045:62;18099:7;18090:6;18079:9;18075:22;18045:62;:::i;:::-;18035:72;;17830:287;17003:1121;;;;;;;:::o;18130:652::-;18207:6;18215;18264:2;18252:9;18243:7;18239:23;18235:32;18232:119;;;18270:79;;:::i;:::-;18232:119;18390:1;18415:53;18460:7;18451:6;18440:9;18436:22;18415:53;:::i;:::-;18405:63;;18361:117;18545:2;18534:9;18530:18;18517:32;18576:18;18568:6;18565:30;18562:117;;;18598:79;;:::i;:::-;18562:117;18703:62;18757:7;18748:6;18737:9;18733:22;18703:62;:::i;:::-;18693:72;;18488:287;18130:652;;;;;:::o;18788:180::-;18836:77;18833:1;18826:88;18933:4;18930:1;18923:15;18957:4;18954:1;18947:15;18974:320;19018:6;19055:1;19049:4;19045:12;19035:22;;19102:1;19096:4;19092:12;19123:18;19113:81;;19179:4;19171:6;19167:17;19157:27;;19113:81;19241:2;19233:6;19230:14;19210:18;19207:38;19204:84;;19260:18;;:::i;:::-;19204:84;19025:269;18974:320;;;:::o;19300:223::-;19440:34;19436:1;19428:6;19424:14;19417:58;19509:6;19504:2;19496:6;19492:15;19485:31;19300:223;:::o;19529:366::-;19671:3;19692:67;19756:2;19751:3;19692:67;:::i;:::-;19685:74;;19768:93;19857:3;19768:93;:::i;:::-;19886:2;19881:3;19877:12;19870:19;;19529:366;;;:::o;19901:419::-;20067:4;20105:2;20094:9;20090:18;20082:26;;20154:9;20148:4;20144:20;20140:1;20129:9;20125:17;20118:47;20182:131;20308:4;20182:131;:::i;:::-;20174:139;;19901:419;;;:::o;20326:225::-;20466:34;20462:1;20454:6;20450:14;20443:58;20535:8;20530:2;20522:6;20518:15;20511:33;20326:225;:::o;20557:366::-;20699:3;20720:67;20784:2;20779:3;20720:67;:::i;:::-;20713:74;;20796:93;20885:3;20796:93;:::i;:::-;20914:2;20909:3;20905:12;20898:19;;20557:366;;;:::o;20929:419::-;21095:4;21133:2;21122:9;21118:18;21110:26;;21182:9;21176:4;21172:20;21168:1;21157:9;21153:17;21146:47;21210:131;21336:4;21210:131;:::i;:::-;21202:139;;20929:419;;;:::o;21354:228::-;21494:34;21490:1;21482:6;21478:14;21471:58;21563:11;21558:2;21550:6;21546:15;21539:36;21354:228;:::o;21588:366::-;21730:3;21751:67;21815:2;21810:3;21751:67;:::i;:::-;21744:74;;21827:93;21916:3;21827:93;:::i;:::-;21945:2;21940:3;21936:12;21929:19;;21588:366;;;:::o;21960:419::-;22126:4;22164:2;22153:9;22149:18;22141:26;;22213:9;22207:4;22203:20;22199:1;22188:9;22184:17;22177:47;22241:131;22367:4;22241:131;:::i;:::-;22233:139;;21960:419;;;:::o;22385:180::-;22433:77;22430:1;22423:88;22530:4;22527:1;22520:15;22554:4;22551:1;22544:15;22571:194;22611:4;22631:20;22649:1;22631:20;:::i;:::-;22626:25;;22665:20;22683:1;22665:20;:::i;:::-;22660:25;;22709:1;22706;22702:9;22694:17;;22733:1;22727:4;22724:11;22721:37;;;22738:18;;:::i;:::-;22721:37;22571:194;;;;:::o;22771:332::-;22892:4;22930:2;22919:9;22915:18;22907:26;;22943:71;23011:1;23000:9;22996:17;22987:6;22943:71;:::i;:::-;23024:72;23092:2;23081:9;23077:18;23068:6;23024:72;:::i;:::-;22771:332;;;;;:::o;23109:116::-;23179:21;23194:5;23179:21;:::i;:::-;23172:5;23169:32;23159:60;;23215:1;23212;23205:12;23159:60;23109:116;:::o;23231:137::-;23285:5;23316:6;23310:13;23301:22;;23332:30;23356:5;23332:30;:::i;:::-;23231:137;;;;:::o;23374:345::-;23441:6;23490:2;23478:9;23469:7;23465:23;23461:32;23458:119;;;23496:79;;:::i;:::-;23458:119;23616:1;23641:61;23694:7;23685:6;23674:9;23670:22;23641:61;:::i;:::-;23631:71;;23587:125;23374:345;;;;:::o;23725:165::-;23865:17;23861:1;23853:6;23849:14;23842:41;23725:165;:::o;23896:366::-;24038:3;24059:67;24123:2;24118:3;24059:67;:::i;:::-;24052:74;;24135:93;24224:3;24135:93;:::i;:::-;24253:2;24248:3;24244:12;24237:19;;23896:366;;;:::o;24268:419::-;24434:4;24472:2;24461:9;24457:18;24449:26;;24521:9;24515:4;24511:20;24507:1;24496:9;24492:17;24485:47;24549:131;24675:4;24549:131;:::i;:::-;24541:139;;24268:419;;;:::o;24693:180::-;24741:77;24738:1;24731:88;24838:4;24835:1;24828:15;24862:4;24859:1;24852:15;24879:185;24919:1;24936:20;24954:1;24936:20;:::i;:::-;24931:25;;24970:20;24988:1;24970:20;:::i;:::-;24965:25;;25009:1;24999:35;;25014:18;;:::i;:::-;24999:35;25056:1;25053;25049:9;25044:14;;24879:185;;;;:::o;25070:166::-;25210:18;25206:1;25198:6;25194:14;25187:42;25070:166;:::o;25242:366::-;25384:3;25405:67;25469:2;25464:3;25405:67;:::i;:::-;25398:74;;25481:93;25570:3;25481:93;:::i;:::-;25599:2;25594:3;25590:12;25583:19;;25242:366;;;:::o;25614:419::-;25780:4;25818:2;25807:9;25803:18;25795:26;;25867:9;25861:4;25857:20;25853:1;25842:9;25838:17;25831:47;25895:131;26021:4;25895:131;:::i;:::-;25887:139;;25614:419;;;:::o;26039:410::-;26079:7;26102:20;26120:1;26102:20;:::i;:::-;26097:25;;26136:20;26154:1;26136:20;:::i;:::-;26131:25;;26191:1;26188;26184:9;26213:30;26231:11;26213:30;:::i;:::-;26202:41;;26392:1;26383:7;26379:15;26376:1;26373:22;26353:1;26346:9;26326:83;26303:139;;26422:18;;:::i;:::-;26303:139;26087:362;26039:410;;;;:::o;26455:191::-;26495:3;26514:20;26532:1;26514:20;:::i;:::-;26509:25;;26548:20;26566:1;26548:20;:::i;:::-;26543:25;;26591:1;26588;26584:9;26577:16;;26612:3;26609:1;26606:10;26603:36;;;26619:18;;:::i;:::-;26603:36;26455:191;;;;:::o;26652:231::-;26792:34;26788:1;26780:6;26776:14;26769:58;26861:14;26856:2;26848:6;26844:15;26837:39;26652:231;:::o;26889:366::-;27031:3;27052:67;27116:2;27111:3;27052:67;:::i;:::-;27045:74;;27128:93;27217:3;27128:93;:::i;:::-;27246:2;27241:3;27237:12;27230:19;;26889:366;;;:::o;27261:419::-;27427:4;27465:2;27454:9;27450:18;27442:26;;27514:9;27508:4;27504:20;27500:1;27489:9;27485:17;27478:47;27542:131;27668:4;27542:131;:::i;:::-;27534:139;;27261:419;;;:::o;27686:223::-;27826:34;27822:1;27814:6;27810:14;27803:58;27895:6;27890:2;27882:6;27878:15;27871:31;27686:223;:::o;27915:366::-;28057:3;28078:67;28142:2;28137:3;28078:67;:::i;:::-;28071:74;;28154:93;28243:3;28154:93;:::i;:::-;28272:2;28267:3;28263:12;28256:19;;27915:366;;;:::o;28287:419::-;28453:4;28491:2;28480:9;28476:18;28468:26;;28540:9;28534:4;28530:20;28526:1;28515:9;28511:17;28504:47;28568:131;28694:4;28568:131;:::i;:::-;28560:139;;28287:419;;;:::o;28712:180::-;28760:77;28757:1;28750:88;28857:4;28854:1;28847:15;28881:4;28878:1;28871:15;28898:233;28937:3;28960:24;28978:5;28960:24;:::i;:::-;28951:33;;29006:66;28999:5;28996:77;28993:103;;29076:18;;:::i;:::-;28993:103;29123:1;29116:5;29112:13;29105:20;;28898:233;;;:::o;29137:225::-;29277:34;29273:1;29265:6;29261:14;29254:58;29346:8;29341:2;29333:6;29329:15;29322:33;29137:225;:::o;29368:366::-;29510:3;29531:67;29595:2;29590:3;29531:67;:::i;:::-;29524:74;;29607:93;29696:3;29607:93;:::i;:::-;29725:2;29720:3;29716:12;29709:19;;29368:366;;;:::o;29740:419::-;29906:4;29944:2;29933:9;29929:18;29921:26;;29993:9;29987:4;29983:20;29979:1;29968:9;29964:17;29957:47;30021:131;30147:4;30021:131;:::i;:::-;30013:139;;29740:419;;;:::o;30165:220::-;30305:34;30301:1;30293:6;30289:14;30282:58;30374:3;30369:2;30361:6;30357:15;30350:28;30165:220;:::o;30391:366::-;30533:3;30554:67;30618:2;30613:3;30554:67;:::i;:::-;30547:74;;30630:93;30719:3;30630:93;:::i;:::-;30748:2;30743:3;30739:12;30732:19;;30391:366;;;:::o;30763:419::-;30929:4;30967:2;30956:9;30952:18;30944:26;;31016:9;31010:4;31006:20;31002:1;30991:9;30987:17;30980:47;31044:131;31170:4;31044:131;:::i;:::-;31036:139;;30763:419;;;:::o;31188:224::-;31328:34;31324:1;31316:6;31312:14;31305:58;31397:7;31392:2;31384:6;31380:15;31373:32;31188:224;:::o;31418:366::-;31560:3;31581:67;31645:2;31640:3;31581:67;:::i;:::-;31574:74;;31657:93;31746:3;31657:93;:::i;:::-;31775:2;31770:3;31766:12;31759:19;;31418:366;;;:::o;31790:419::-;31956:4;31994:2;31983:9;31979:18;31971:26;;32043:9;32037:4;32033:20;32029:1;32018:9;32014:17;32007:47;32071:131;32197:4;32071:131;:::i;:::-;32063:139;;31790:419;;;:::o;32215:222::-;32355:34;32351:1;32343:6;32339:14;32332:58;32424:5;32419:2;32411:6;32407:15;32400:30;32215:222;:::o;32443:366::-;32585:3;32606:67;32670:2;32665:3;32606:67;:::i;:::-;32599:74;;32682:93;32771:3;32682:93;:::i;:::-;32800:2;32795:3;32791:12;32784:19;;32443:366;;;:::o;32815:419::-;32981:4;33019:2;33008:9;33004:18;32996:26;;33068:9;33062:4;33058:20;33054:1;33043:9;33039:17;33032:47;33096:131;33222:4;33096:131;:::i;:::-;33088:139;;32815:419;;;:::o;33240:77::-;33277:7;33306:5;33295:16;;33240:77;;;:::o;33323:118::-;33410:24;33428:5;33410:24;:::i;:::-;33405:3;33398:37;33323:118;;:::o;33447:332::-;33568:4;33606:2;33595:9;33591:18;33583:26;;33619:71;33687:1;33676:9;33672:17;33663:6;33619:71;:::i;:::-;33700:72;33768:2;33757:9;33753:18;33744:6;33700:72;:::i;:::-;33447:332;;;;;:::o;33785:143::-;33842:5;33873:6;33867:13;33858:22;;33889:33;33916:5;33889:33;:::i;:::-;33785:143;;;;:::o;33934:351::-;34004:6;34053:2;34041:9;34032:7;34028:23;34024:32;34021:119;;;34059:79;;:::i;:::-;34021:119;34179:1;34204:64;34260:7;34251:6;34240:9;34236:22;34204:64;:::i;:::-;34194:74;;34150:128;33934:351;;;;:::o;34291:98::-;34342:6;34376:5;34370:12;34360:22;;34291:98;;;:::o;34395:168::-;34478:11;34512:6;34507:3;34500:19;34552:4;34547:3;34543:14;34528:29;;34395:168;;;;:::o;34569:373::-;34655:3;34683:38;34715:5;34683:38;:::i;:::-;34737:70;34800:6;34795:3;34737:70;:::i;:::-;34730:77;;34816:65;34874:6;34869:3;34862:4;34855:5;34851:16;34816:65;:::i;:::-;34906:29;34928:6;34906:29;:::i;:::-;34901:3;34897:39;34890:46;;34659:283;34569:373;;;;:::o;34948:949::-;35217:4;35255:3;35244:9;35240:19;35232:27;;35269:71;35337:1;35326:9;35322:17;35313:6;35269:71;:::i;:::-;35350:72;35418:2;35407:9;35403:18;35394:6;35350:72;:::i;:::-;35432;35500:2;35489:9;35485:18;35476:6;35432:72;:::i;:::-;35514;35582:2;35571:9;35567:18;35558:6;35514:72;:::i;:::-;35634:9;35628:4;35624:20;35618:3;35607:9;35603:19;35596:49;35662:76;35733:4;35724:6;35662:76;:::i;:::-;35654:84;;35786:9;35780:4;35776:20;35770:3;35759:9;35755:19;35748:49;35814:76;35885:4;35876:6;35814:76;:::i;:::-;35806:84;;34948:949;;;;;;;;;:::o;35903:226::-;36043:34;36039:1;36031:6;36027:14;36020:58;36112:9;36107:2;36099:6;36095:15;36088:34;35903:226;:::o;36135:366::-;36277:3;36298:67;36362:2;36357:3;36298:67;:::i;:::-;36291:74;;36374:93;36463:3;36374:93;:::i;:::-;36492:2;36487:3;36483:12;36476:19;;36135:366;;;:::o;36507:419::-;36673:4;36711:2;36700:9;36696:18;36688:26;;36760:9;36754:4;36750:20;36746:1;36735:9;36731:17;36724:47;36788:131;36914:4;36788:131;:::i;:::-;36780:139;;36507:419;;;:::o;36932:616::-;37117:4;37155:2;37144:9;37140:18;37132:26;;37168:71;37236:1;37225:9;37221:17;37212:6;37168:71;:::i;:::-;37286:9;37280:4;37276:20;37271:2;37260:9;37256:18;37249:48;37314:76;37385:4;37376:6;37314:76;:::i;:::-;37306:84;;37437:9;37431:4;37427:20;37422:2;37411:9;37407:18;37400:48;37465:76;37536:4;37527:6;37465:76;:::i;:::-;37457:84;;36932:616;;;;;;:::o;37554:301::-;37694:34;37690:1;37682:6;37678:14;37671:58;37763:34;37758:2;37750:6;37746:15;37739:59;37832:15;37827:2;37819:6;37815:15;37808:40;37554:301;:::o;37861:366::-;38003:3;38024:67;38088:2;38083:3;38024:67;:::i;:::-;38017:74;;38100:93;38189:3;38100:93;:::i;:::-;38218:2;38213:3;38209:12;38202:19;;37861:366;;;:::o;38233:419::-;38399:4;38437:2;38426:9;38422:18;38414:26;;38486:9;38480:4;38476:20;38472:1;38461:9;38457:17;38450:47;38514:131;38640:4;38514:131;:::i;:::-;38506:139;;38233:419;;;:::o;38658:182::-;38798:34;38794:1;38786:6;38782:14;38775:58;38658:182;:::o;38846:366::-;38988:3;39009:67;39073:2;39068:3;39009:67;:::i;:::-;39002:74;;39085:93;39174:3;39085:93;:::i;:::-;39203:2;39198:3;39194:12;39187:19;;38846:366;;;:::o;39218:419::-;39384:4;39422:2;39411:9;39407:18;39399:26;;39471:9;39465:4;39461:20;39457:1;39446:9;39442:17;39435:47;39499:131;39625:4;39499:131;:::i;:::-;39491:139;;39218:419;;;:::o;39643:181::-;39783:33;39779:1;39771:6;39767:14;39760:57;39643:181;:::o;39830:366::-;39972:3;39993:67;40057:2;40052:3;39993:67;:::i;:::-;39986:74;;40069:93;40158:3;40069:93;:::i;:::-;40187:2;40182:3;40178:12;40171:19;;39830:366;;;:::o;40202:419::-;40368:4;40406:2;40395:9;40391:18;40383:26;;40455:9;40449:4;40445:20;40441:1;40430:9;40426:17;40419:47;40483:131;40609:4;40483:131;:::i;:::-;40475:139;;40202:419;;;:::o;40627:221::-;40767:34;40763:1;40755:6;40751:14;40744:58;40836:4;40831:2;40823:6;40819:15;40812:29;40627:221;:::o;40854:366::-;40996:3;41017:67;41081:2;41076:3;41017:67;:::i;:::-;41010:74;;41093:93;41182:3;41093:93;:::i;:::-;41211:2;41206:3;41202:12;41195:19;;40854:366;;;:::o;41226:419::-;41392:4;41430:2;41419:9;41415:18;41407:26;;41479:9;41473:4;41469:20;41465:1;41454:9;41450:17;41443:47;41507:131;41633:4;41507:131;:::i;:::-;41499:139;;41226:419;;;:::o;41651:182::-;41791:34;41787:1;41779:6;41775:14;41768:58;41651:182;:::o;41839:366::-;41981:3;42002:67;42066:2;42061:3;42002:67;:::i;:::-;41995:74;;42078:93;42167:3;42078:93;:::i;:::-;42196:2;42191:3;42187:12;42180:19;;41839:366;;;:::o;42211:419::-;42377:4;42415:2;42404:9;42400:18;42392:26;;42464:9;42458:4;42454:20;42450:1;42439:9;42435:17;42428:47;42492:131;42618:4;42492:131;:::i;:::-;42484:139;;42211:419;;;:::o;42636:221::-;42776:34;42772:1;42764:6;42760:14;42753:58;42845:4;42840:2;42832:6;42828:15;42821:29;42636:221;:::o;42863:366::-;43005:3;43026:67;43090:2;43085:3;43026:67;:::i;:::-;43019:74;;43102:93;43191:3;43102:93;:::i;:::-;43220:2;43215:3;43211:12;43204:19;;42863:366;;;:::o;43235:419::-;43401:4;43439:2;43428:9;43424:18;43416:26;;43488:9;43482:4;43478:20;43474:1;43463:9;43459:17;43452:47;43516:131;43642:4;43516:131;:::i;:::-;43508:139;;43235:419;;;:::o;43660:222::-;43800:34;43796:1;43788:6;43784:14;43777:58;43869:5;43864:2;43856:6;43852:15;43845:30;43660:222;:::o;43888:366::-;44030:3;44051:67;44115:2;44110:3;44051:67;:::i;:::-;44044:74;;44127:93;44216:3;44127:93;:::i;:::-;44245:2;44240:3;44236:12;44229:19;;43888:366;;;:::o;44260:419::-;44426:4;44464:2;44453:9;44449:18;44441:26;;44513:9;44507:4;44503:20;44499:1;44488:9;44484:17;44477:47;44541:131;44667:4;44541:131;:::i;:::-;44533:139;;44260:419;;;:::o;44685:182::-;44825:34;44821:1;44813:6;44809:14;44802:58;44685:182;:::o;44873:366::-;45015:3;45036:67;45100:2;45095:3;45036:67;:::i;:::-;45029:74;;45112:93;45201:3;45112:93;:::i;:::-;45230:2;45225:3;45221:12;45214:19;;44873:366;;;:::o;45245:419::-;45411:4;45449:2;45438:9;45434:18;45426:26;;45498:9;45492:4;45488:20;45484:1;45473:9;45469:17;45462:47;45526:131;45652:4;45526:131;:::i;:::-;45518:139;;45245:419;;;:::o;45670:167::-;45810:19;45806:1;45798:6;45794:14;45787:43;45670:167;:::o;45843:366::-;45985:3;46006:67;46070:2;46065:3;46006:67;:::i;:::-;45999:74;;46082:93;46171:3;46082:93;:::i;:::-;46200:2;46195:3;46191:12;46184:19;;45843:366;;;:::o;46215:419::-;46381:4;46419:2;46408:9;46404:18;46396:26;;46468:9;46462:4;46458:20;46454:1;46443:9;46439:17;46432:47;46496:131;46622:4;46496:131;:::i;:::-;46488:139;;46215:419;;;:::o

Swarm Source

ipfs://9f1b05eba27e7396061c136ca6755d1cb8d607f139fabf77a3ce492bc77664ae
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.