ETH Price: $2,951.75 (+0.06%)

Contract

0xEe64930027a31F8a2Ce9F71eC4925E21Dd7CEc43

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve Issue4094171332025-12-11 6:08:3043 days ago1765433310IN
0xEe649300...1Dd7CEc43
0 ETH0.00000130.01
Approve Issue4094166682025-12-11 6:06:3343 days ago1765433193IN
0xEe649300...1Dd7CEc43
0 ETH0.000000650.01
Approve Issue4094158092025-12-11 6:02:5843 days ago1765432978IN
0xEe649300...1Dd7CEc43
0 ETH0.000000770.011879
Request Issue4094152692025-12-11 6:00:4443 days ago1765432844IN
0xEe649300...1Dd7CEc43
0 ETH0.000001910.01
Approve Issue3983728682025-11-09 8:02:2375 days ago1762675343IN
0xEe649300...1Dd7CEc43
0 ETH0.000001310.01
Approve Issue3983724252025-11-09 8:00:3275 days ago1762675232IN
0xEe649300...1Dd7CEc43
0 ETH0.000000650.01
Approve Issue3983719842025-11-09 7:58:4275 days ago1762675122IN
0xEe649300...1Dd7CEc43
0 ETH0.000000760.011706
Request Issue3983713112025-11-09 7:55:5475 days ago1762674954IN
0xEe649300...1Dd7CEc43
0 ETH0.000001920.01
Approve Issue3910654742025-10-19 5:08:3896 days ago1760850518IN
0xEe649300...1Dd7CEc43
0 ETH0.000001310.01
Approve Issue3910650562025-10-19 5:06:5396 days ago1760850413IN
0xEe649300...1Dd7CEc43
0 ETH0.000000660.01
Approve Issue3910644632025-10-19 5:04:2696 days ago1760850266IN
0xEe649300...1Dd7CEc43
0 ETH0.000000660.01
Request Issue3910637802025-10-19 5:01:3596 days ago1760850095IN
0xEe649300...1Dd7CEc43
0 ETH0.000001920.01
Approve Issue3831356082025-09-26 7:16:41119 days ago1758871001IN
0xEe649300...1Dd7CEc43
0 ETH0.000001680.01276
Approve Issue3831347252025-09-26 7:13:00119 days ago1758870780IN
0xEe649300...1Dd7CEc43
0 ETH0.00000080.012112
Approve Issue3831342822025-09-26 7:11:12119 days ago1758870672IN
0xEe649300...1Dd7CEc43
0 ETH0.000000840.012805
Request Issue3831336092025-09-26 7:08:24119 days ago1758870504IN
0xEe649300...1Dd7CEc43
0 ETH0.000003020.015734
Approve Issue3783440442025-09-12 10:46:09133 days ago1757673969IN
0xEe649300...1Dd7CEc43
0 ETH0.000001320.01
Approve Issue3783410472025-09-12 10:33:40133 days ago1757673220IN
0xEe649300...1Dd7CEc43
0 ETH0.000000660.01
Approve Issue3783402882025-09-12 10:30:31133 days ago1757673031IN
0xEe649300...1Dd7CEc43
0 ETH0.000000670.01
Request Issue3783388872025-09-12 10:24:41133 days ago1757672681IN
0xEe649300...1Dd7CEc43
0 ETH0.000001930.01
Approve Issue3447925242025-06-07 8:20:19230 days ago1749284419IN
0xEe649300...1Dd7CEc43
0 ETH0.000001360.01
Approve Issue3447920712025-06-07 8:18:25230 days ago1749284305IN
0xEe649300...1Dd7CEc43
0 ETH0.00000070.01
Approve Issue3447915662025-06-07 8:16:19230 days ago1749284179IN
0xEe649300...1Dd7CEc43
0 ETH0.00000070.01
Request Issue3447906692025-06-07 8:12:34230 days ago1749283954IN
0xEe649300...1Dd7CEc43
0 ETH0.000001990.01
Approve Issue3447399802025-06-07 4:40:49230 days ago1749271249IN
0xEe649300...1Dd7CEc43
0 ETH0.000001330.01
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultisigManager

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: MultisigManager.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;

import "./ManagedToken.sol";

/**
 * @title A multi-signature contract for token management
 * @notice Enables multiple users to manage a token contract.
 * List of contract owners is set on initialization.
 * All actions should be approved by majority (N / 2 + 1) of owners.
 * List of owners can be changed with approval of the same majority of current owners.
 * There must always be at least 3 owner accounts.
 * @notice This contract supports fixed set of actions that can be performed on managed token contracts
 * (or the management contract itself).
 * Such actions include change of token ownership token supply regulation, token blacklist management, etc.
 * For each supported action, there are two methods.
 * First method named `request*` enables any owner account to suggest an action to perform.
 * Such methods create a "request" in this management contract and return it's unique identifier.
 * The second method named `approve*` then should be called by other owner(s) to approve the operation.
 * The action is executed immediately, as part of the `approve*` method when the last approval happens.
 */
contract MultisigManager {
    // region voting accounts management internal
    /**
     * @dev Minimal number of voting accounts.
     * Attempts to initialize the contract with a number of voting accounts less than this one or to change
     * list of voting accounts to such size will be reverted.
     */
    uint public constant MIN_VOTING_ACCOUNTS = 3;

    /**
     * @dev Time interval during which a request may be approved.
     * If a request is not completed after `REQUEST_APPROVAL_DEADLINE_SECONDS` seconds after creation,
     * it can no longer be approved (and thus cannot be executed).
     */
    uint public constant REQUEST_APPROVAL_DEADLINE_SECONDS = 2 days;

    mapping(address => bool) public isVotingAccount;

    /**
     * @dev Number of active voting accounts.
     * List and number of voting accounts can be changed (see `requestVotersListChange`, `approveVotersListChange`)
     * but their number never goes below `MIN_VOTING_ACCOUNTS`.
     */
    uint public votingAccountsNumber;

    /**
     * @dev Version of voting accounts list.
     * This number is increased every time the owners list changes.
     * It is used to prevent requests initiated with different owners list from being approved after the list is
     * changed - that's easier than checking which of the users who previously approved the request have been removed.
     */
    uint private votingAccountsListGeneration;

    /**
     * @notice Emitted when an `address` is added to the owners list
     */
    event VoterAdded(address);
    /**
     * @notice Emitted when `address` is removed from owners list
     */
    event VoterRemoved(address);

    /**
     * @dev Add an address to the list of owners.
     * Does nothing if the address is already an owner.
     */
    function _addVotingAccount(address addr) private {
        require(
            addr != address(0),
            "cannot add zero address to voting accounts list"
        );

        if (!isVotingAccount[addr]) {
            assert(votingAccountsNumber < type(uint).max);
            isVotingAccount[addr] = true;
            votingAccountsNumber += 1;
            emit VoterAdded(addr);
        }
    }

    /**
     * @dev Remove an address from the list of owners.
     * Does nothing if the address is not an owner.
     */
    function _removeVotingAccount(address addr) private {
        if (isVotingAccount[addr]) {
            require(
                votingAccountsNumber - 1 >= MIN_VOTING_ACCOUNTS,
                "not enough voting accounts will remain"
            );
            isVotingAccount[addr] = false;
            votingAccountsNumber -= 1;
            emit VoterRemoved(addr);
        }
    }
    // endregion

    // region generic request handling
    struct Request {
        mapping(address => bool) approvedBy;
        uint approvals;
        bool completed;
        /** @dev `votingAccountsListGeneration` at moment of this request creation */
        uint generation;
        /**
         * @dev a timestamp (in seconds since UNIX epoch, like `block.timestamp`)
         * after which the request can no longer be approved
         */
        uint deadline;
    }

    mapping(bytes32 => Request) private requests;
    uint private requestCount = 0;

    /**
     * @dev Emitted when a request gets executed after getting enough approvals
     */
    event RequestCompleted(bytes32 indexed reqId);

    /**
     * @dev Create a request and approve it from the sender of current transaction.
     * @dev The returned request identifier is a pseudo-random number based on request index and previous block hash.
     * That makes request ids unpredictable enough to make it difficult enough to create (accidentally or maliciously)
     * a confirmation transaction before the request is created.
     * @return reqId identifier of the created request; it can be used later to call `_approveRequest`
     */
    function _makeRequest() private votingAccountOnly returns (bytes32 reqId) {
        reqId = keccak256(
            abi.encode(requestCount++, blockhash(block.number - 1))
        );
        assert(requests[reqId].approvals == 0); // Check for request id collision
        requests[reqId].approvedBy[msg.sender] = true;
        requests[reqId].approvals = 1;
        requests[reqId].generation = votingAccountsListGeneration;
        requests[reqId].deadline =
            block.timestamp +
            REQUEST_APPROVAL_DEADLINE_SECONDS;
    }

    /**
     * @dev Approve given request by the sender of current transaction.
     * @return approved `true` iff the approval is successful and is the last approval necessary to execute the request;
     * the caller is expected to execute the request immediately in such case.
     */
    function _approveRequest(
        bytes32 reqId
    ) private votingAccountOnly returns (bool approved) {
        Request storage req = requests[reqId];

        require(req.approvals > 0, "invalid request id");
        require(!req.completed, "request already completed");
        require(
            req.generation == votingAccountsListGeneration,
            "request invalidated after voters list change"
        );
        require(block.timestamp <= req.deadline, "request is outdated");
        require(
            !req.approvedBy[msg.sender],
            "already approved by this account"
        );

        req.approvedBy[msg.sender] = true;
        req.approvals += 1;

        if (req.approvals >= getMinApprovals()) {
            approved = true;
            req.completed = true;
            emit RequestCompleted(reqId);
        }
    }

    /**
     * @notice Returns the number of approvals necessary to execute a request.
     * The number is based on current owners list size.
     */
    function getMinApprovals() public view returns (uint approvals) {
        approvals = (votingAccountsNumber >> 1) + 1;
    }

    modifier whenTokenAddressValid(ManagedToken token) {
        require(address(token) != address(0), "token address cannot be zero");
        _;
    }

    modifier votingAccountOnly() {
        require(isVotingAccount[msg.sender], "not a voting account");
        _;
    }
    // endregion

    // region constructor
    /**
     * @param votingAccounts initial list of voting accounts/owners.
     *                       Should contain at least `MIN_VOTING_ACCOUNTS` distinct addresses.
     */
    constructor(address[] memory votingAccounts) {
        for (uint i = 0; i < votingAccounts.length; ++i) {
            _addVotingAccount(votingAccounts[i]);
        }

        require(
            votingAccountsNumber >= MIN_VOTING_ACCOUNTS,
            "not enough voting accounts"
        );

        votingAccountsListGeneration = 1;
    }
    // endregion

    // region owner change
    struct OwnerChangeRequest {
        ManagedToken token;
        address newOwner;
    }

    mapping(bytes32 => OwnerChangeRequest) private ownerChangeRequests;

    /**
     * @notice Emitted when token owner change requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param newOwner new owner address
     */
    event OwnerChangeRequested(
        bytes32 reqId,
        address by,
        address token,
        address newOwner
    );

    /**
     * @notice Create a request to change owner of `token` to `newOwner`.
     * @notice Emits `OwnerChangeRequested` event with request id and parameters.
     * @return reqId the identifier of the request that can later be used with `approveOwnerChange`
     */
    function requestOwnerChange(
        ManagedToken token,
        address newOwner
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        ownerChangeRequests[reqId].token = token;
        ownerChangeRequests[reqId].newOwner = newOwner;
        emit OwnerChangeRequested(reqId, msg.sender, address(token), newOwner);
    }

    /**
     * @notice Approve an owner change request
     * @param reqId request id generated by `requestOwnerChange`
     */
    function approveOwnerChange(bytes32 reqId) external {
        require(
            ownerChangeRequests[reqId].newOwner != address(0),
            "invalid owner change request id"
        );

        if (_approveRequest(reqId)) {
            ownerChangeRequests[reqId].token.transferOwnership(
                ownerChangeRequests[reqId].newOwner
            );
        }
    }
    // endregion

    // region voters change
    struct VotersChangeRequest {
        address[] addVoters;
        address[] removeVoters;
    }
    mapping(bytes32 => VotersChangeRequest) private votersChangeRequests;

    /**
     * @notice Emitted when owners list change is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param add addresses to add to owners list
     * @param remove addresses to remove from owners list
     */
    event VotersListChangeRequested(
        bytes32 reqId,
        address by,
        address[] add,
        address[] remove
    );

    /**
     * @notice Create a request to change list of owners.
     * @notice Emits `VotersListChangeRequested` with request id and parameters.
     * @dev When request executes, first `addVoters` will be added to the list then `removeVoters` will be removed.
     * So, `removeVoters` has "higher priority" than `addVoters` and if certain address is contained in both of them
     * then it will not be a voter after request execution.
     * @param addVoters addresses to add to the list
     * @param removeVoters addresses to remove from the list
     * @return reqId the identifier of the request that can later be used with `approveVotersListChange`
     */
    function requestVotersListChange(
        address[] calldata addVoters,
        address[] calldata removeVoters
    ) external returns (bytes32 reqId) {
        require(
            addVoters.length > 0 || removeVoters.length > 0,
            "should either add or remove some accounts"
        );

        reqId = _makeRequest();
        votersChangeRequests[reqId].addVoters = addVoters;
        votersChangeRequests[reqId].removeVoters = removeVoters;
        emit VotersListChangeRequested(
            reqId,
            msg.sender,
            addVoters,
            removeVoters
        );
    }

    /**
     * @notice Approve owners list change request
     * @param reqId request id generated by `requestVotersListChange`
     */
    function approveVotersListChange(bytes32 reqId) external {
        address[] storage addVoters = votersChangeRequests[reqId].addVoters;
        address[] storage removeVoters = votersChangeRequests[reqId]
            .removeVoters;
        require(
            addVoters.length > 0 || removeVoters.length > 0,
            "invalid voters list change request"
        );

        if (_approveRequest(reqId)) {
            for (uint i = 0; i < addVoters.length; ++i) {
                _addVotingAccount(addVoters[i]);
            }

            for (uint i = 0; i < removeVoters.length; ++i) {
                _removeVotingAccount(removeVoters[i]);
            }
        }

        votingAccountsListGeneration += 1;
    }
    // endregion

    // region pause
    mapping(bytes32 => ManagedToken) private pauseRequests;

    /**
     * @notice Emitted when token pause is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     */
    event PauseRequested(bytes32 reqId, address by, address token);

    /**
     * @notice Request token pause.
     * @notice Emits `PauseRequested` with request id and parameters
     * @param token the token to pause
     * @return reqId the identifier of the request that can later be used with `approveTokenPause`
     */
    function requestTokenPause(
        ManagedToken token
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        pauseRequests[reqId] = token;
        emit PauseRequested(reqId, msg.sender, address(token));
    }

    /**
     * @notice Approve token pause request
     * @param reqId request id generated by `requestTokenPause`
     */
    function approveTokenPause(bytes32 reqId) external {
        require(
            address(pauseRequests[reqId]) != address(0),
            "invalid pause request id"
        );

        if (_approveRequest(reqId)) {
            pauseRequests[reqId].pause();
        }
    }
    // endregion

    // region unpause
    mapping(bytes32 => ManagedToken) private unpauseRequests;

    /**
     * @notice Emitted when token unpause is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     */
    event UnpauseRequested(bytes32 reqId, address by, address token);

    /**
     * @notice Request token unpause.
     * @notice Emits `UnpauseRequested` with request id and parameters
     * @param token the token to unpause
     * @return reqId the identifier of the request that can later be used with `approveTokenUnpause`
     */
    function requestTokenUnpause(
        ManagedToken token
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        unpauseRequests[reqId] = token;
        emit UnpauseRequested(reqId, msg.sender, address(token));
    }

    /**
     * @notice Approve token unpause request
     * @param reqId request id generated by `requestTokenUnpause`
     */
    function approveTokenUnpause(bytes32 reqId) external {
        require(
            address(unpauseRequests[reqId]) != address(0),
            "invalid unpause request id"
        );

        if (_approveRequest(reqId)) {
            unpauseRequests[reqId].unpause();
        }
    }
    // endregion

    // region blacklist address
    struct BlacklistRequest {
        ManagedToken token;
        address account;
    }
    mapping(bytes32 => BlacklistRequest) private blacklistRequests;

    /**
     * @notice Emitted when blacklisting is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param account the account to add to blacklist
     */
    event BlacklistRequested(
        bytes32 reqId,
        address by,
        address token,
        address account
    );

    /**
     * @notice Request blacklisting an account.
     * @notice Emits `BlacklistRequested` with request id and parameters
     * @param token the token to blacklist account in
     * @param account address to blacklist
     * @return reqId the identifier of the request that can later be used with `approveBlacklist`
     */
    function requestBlacklist(
        ManagedToken token,
        address account
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        blacklistRequests[reqId].token = token;
        blacklistRequests[reqId].account = account;
        emit BlacklistRequested(reqId, msg.sender, address(token), account);
    }

    /**
     * @notice Approve account blacklisting request
     * @param reqId request id generated by `requestBlacklist`
     */
    function approveBlacklist(bytes32 reqId) external {
        require(
            address(blacklistRequests[reqId].token) != address(0),
            "invalid blacklist request id"
        );

        if (_approveRequest(reqId)) {
            blacklistRequests[reqId].token.addBlackList(
                blacklistRequests[reqId].account
            );
        }
    }
    // endregion

    // region unblacklist address
    mapping(bytes32 => BlacklistRequest) private unblacklistRequests;

    /**
     * @notice Emitted when un-blacklisting is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param account the account to remove from blacklist
     */
    event UnblacklistRequested(
        bytes32 reqId,
        address by,
        address token,
        address account
    );

    /**
     * @notice Request un-blacklisting an account.
     * @notice Emits `UnblacklistRequested` with request id and parameters
     * @param token the token to un-blacklist account in
     * @param account address to un-blacklist
     * @return reqId the identifier of the request that can later be used with `approveUnblacklist`
     */
    function requestUnblacklist(
        ManagedToken token,
        address account
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        unblacklistRequests[reqId].token = token;
        unblacklistRequests[reqId].account = account;
        emit UnblacklistRequested(reqId, msg.sender, address(token), account);
    }

    /**
     * @notice Approve account un-blacklisting request
     * @param reqId request id generated by `requestUnblacklist`
     */
    function approveUnblacklist(bytes32 reqId) external {
        require(
            address(unblacklistRequests[reqId].token) != address(0),
            "invalid unblacklist request id"
        );

        if (_approveRequest(reqId)) {
            unblacklistRequests[reqId].token.removeBlackList(
                unblacklistRequests[reqId].account
            );
        }
    }
    // endregion

    // region destroy black funds
    mapping(bytes32 => BlacklistRequest) private blackFundsDestroyRequests;

    /**
     * @notice Emitted when destruction of tokens owned by a blacklisted account is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param account the account to remove tokens from
     */
    event BlackFundsDestructionRequested(
        bytes32 reqId,
        address by,
        address token,
        address account
    );

    /**
     * @notice Request burning of tokens owned by a blacklisted address.
     * @notice Emits `BlackFundsDestructionRequested` with request id and parameters
     * @param token token contract
     * @param account the blacklisted address whose tokens should be burned
     * @return reqId the identifier of the request that can later be used with `approveBlackFundsDestruction`
     */
    function requestBlackFundsDestruction(
        ManagedToken token,
        address account
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        reqId = _makeRequest();
        blackFundsDestroyRequests[reqId].token = token;
        blackFundsDestroyRequests[reqId].account = account;
        emit BlackFundsDestructionRequested(
            reqId,
            msg.sender,
            address(token),
            account
        );
    }

    /**
     * @notice Approve request for burning tokens owned by a blacklisted account.
     * @param reqId request id generated by `requestBlackFundsDestruction`
     */
    function approveBlackFundsDestruction(bytes32 reqId) external {
        require(
            address(blackFundsDestroyRequests[reqId].token) != address(0),
            "invalid funds destruction request id"
        );

        if (_approveRequest(reqId)) {
            blackFundsDestroyRequests[reqId].token.destroyBlackFunds(
                blackFundsDestroyRequests[reqId].account
            );
        }
    }
    // endregion

    // region deprecate
    struct DeprecationRequest {
        ManagedToken token;
        address upgradedToken;
    }
    mapping(bytes32 => DeprecationRequest) private deprecationRequests;

    /**
     * @notice Emitted when token contract deprecation is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param upgraded address of upgraded token implementation
     */
    event DeprecationRequested(
        bytes32 reqId,
        address by,
        address token,
        address upgraded
    );

    /**
     * @notice Request deprecation of token contract.
     * @notice Emits `DeprecationRequested` with request id and parameters
     * @param token token contract
     * @param upgraded new implementation contract
     * @return reqId the identifier of the request that can later be used with `approveDeprecation`
     */
    function requestDeprecation(
        ManagedToken token,
        address upgraded
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        require(upgraded != address(0), "cannot upgrade to zero address");

        reqId = _makeRequest();
        deprecationRequests[reqId].token = token;
        deprecationRequests[reqId].upgradedToken = upgraded;
        emit DeprecationRequested(reqId, msg.sender, address(token), upgraded);
    }

    /**
     * @notice Approve request for deprecation of token contract
     * @param reqId request id generated by `requestDeprecation`
     */
    function approveDeprecation(bytes32 reqId) external {
        require(
            address(deprecationRequests[reqId].token) != address(0),
            "invalid deprecation request id"
        );

        if (_approveRequest(reqId)) {
            deprecationRequests[reqId].token.deprecate(
                deprecationRequests[reqId].upgradedToken
            );
        }
    }
    // endregion

    // region issue
    struct TokenIssueRequest {
        ManagedToken token;
        address to;
        uint amount;
    }
    mapping(bytes32 => TokenIssueRequest) private issueRequests;

    /**
     * @notice Emitted when token issue is requested
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param amount amount of tokens to create
     * @param to address to send token to
     */
    event IssueRequested(
        bytes32 reqId,
        address by,
        address token,
        uint amount,
        address to
    );

    /**
     * @notice Request issue (mint, emission) of new tokens.
     * @notice Emits `IssueRequested` with request id and parameters
     * @param token token contract
     * @param amount number of tokens to create
     * @param to address to send tokens to
     * @return reqId the identifier of the request that can later be used with `approveIssue`
     */
    function requestIssue(
        ManagedToken token,
        uint amount,
        address to
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        require(amount > 0, "cannot issue 0 tokens");

        reqId = _makeRequest();
        issueRequests[reqId].token = token;
        issueRequests[reqId].to = to;
        issueRequests[reqId].amount = amount;
        emit IssueRequested(reqId, msg.sender, address(token), amount, to);
    }

    /**
     * @notice Approve request for tokens emission
     * @param reqId request id generated by `requestIssue`
     */
    function approveIssue(bytes32 reqId) external {
        require(
            address(issueRequests[reqId].token) != address(0),
            "invalid issue request id"
        );

        if (_approveRequest(reqId)) {
            issueRequests[reqId].token.issue(
                issueRequests[reqId].amount,
                issueRequests[reqId].to
            );
        }
    }
    // endregion

    // region redeem
    struct RedeemRequest {
        ManagedToken token;
        uint amount;
    }
    mapping(bytes32 => RedeemRequest) private redeemRequests;

    /**
     * @notice Emitted when token destruction
     * @param reqId request id
     * @param by address that sent the request
     * @param token token contract address
     * @param amount amount of tokens to burn
     */
    event RedeemRequested(
        bytes32 reqId,
        address by,
        address token,
        uint amount
    );

    /**
     * @notice Request redeeming (burning) tokens.
     * @notice Tokens should be first transferred to token's owner address - this contract.
     * @notice Emits `RedeemRequested` with request id and parameters
     * @param token token contract
     * @param amount number of tokens to burn
     * @return reqId the identifier of the request that can later be used with `approveRedeem`
     */
    function requestRedeem(
        ManagedToken token,
        uint amount
    ) external whenTokenAddressValid(token) returns (bytes32 reqId) {
        require(amount > 0, "cannot redeem 0 tokens");

        reqId = _makeRequest();
        redeemRequests[reqId].token = token;
        redeemRequests[reqId].amount = amount;
        emit RedeemRequested(reqId, msg.sender, address(token), amount);
    }

    /**
     * @notice Approve request for tokens destruction
     * @param reqId request id generated by `requestRedeem`
     */
    function approveRedeem(bytes32 reqId) external {
        require(
            address(redeemRequests[reqId].token) != address(0),
            "invalid redeem request id"
        );

        if (_approveRequest(reqId)) {
            redeemRequests[reqId].token.redeem(redeemRequests[reqId].amount);
        }
    }
    // endregion
}

File 2 of 2: ManagedToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;

interface ERC165 {
    /**
     * @notice Query if a contract implements an interface
     * @param interfaceID The interface identifier, as specified in ERC-165
     * @dev Interface identification is specified in ERC-165.
     * @return `true` if the contract implements `interfaceID` and
     *  `interfaceID` is not 0xffffffff, `false` otherwise
     */
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/**
 * @title ERC-173 Contract Ownership Standard
 * @dev Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface ERC173 is ERC165 {
    /**
     * @dev This emits when ownership of a contract changes.
     */
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @notice Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * @notice Set the address of the new owner of the contract
     * @dev Set _newOwner to address(0) to renounce any ownership.
     * @param _newOwner The address of the new owner of the contract
     */
    function transferOwnership(address _newOwner) external;
}

/**
 * @title Interface for a contract that may have some of it's operations be paused
 */
interface IPausable {
    /**
     * @notice Pause operations of this contract
     * @dev This method must fail if called by unauthorized user
     */
    function pause() external;

    /**
     * @notice Resume paused operations of this contract
     * @dev This method must fail if called by unauthorized user
     */
    function unpause() external;

    /**
     * @notice Emitted when the contract gets paused
     */
    event Pause();

    /**
     * @notice Emitted when the contract gets unpaused
     */
    event Unpause();
}

/**
 * @title Interface for token contracts with blacklist management functionality
 */
interface IBlackList {
    /**
     * @notice Add given address to blacklist.
     * @param _evilUser the address to add to blacklist
     */
    function addBlackList(address _evilUser) external;

    /**
     * @notice Remove given address from blacklist.
     * @param _clearedUser the address to remove from blacklist
     */
    function removeBlackList(address _clearedUser) external;

    /**
     * @dev Destroy tokens owned by a blacklisted account.
     * @param _blackListedUser the blacklisted address
     */
    function destroyBlackFunds(address _blackListedUser) external;

    /**
     * Emitted when tokens owned by a blacklisted address are destroyed.
     * @param _blackListedUser the blacklisted account
     * @param _balance amount of tokens previously owned by the account
     */
    event DestroyedBlackFunds(address _blackListedUser, uint _balance);

    /**
     * Emitted when an address is added to the blacklist
     * @param _user the address added to the blacklist
     */
    event AddedBlackList(address _user);

    /**
     * Emitted when an address is removed from blacklist
     * @param _user the address removed from the blacklist
     */
    event RemovedBlackList(address _user);
}

interface IDeprecatable {
    /**
     * @notice Mark this contract as deprecated and start delegating some operations to a different contract
     * @param _upgradedAddress address of new contract to delegate calls to
     */
    function deprecate(address _upgradedAddress) external;
}

/**
 * @title Methods for token supply management (token emission and destruction)
 */
interface ISupply {
    /**
     * @notice Create new tokens and send them to given address
     * @param amount Number of tokens to be issued
     * @param to Address to send tokens to
     */
    function issue(uint amount, address to) external;

    /**
     * @notice Redeem (burn) tokens.
     * The tokens are withdrawn from the owner address.
     * The balance must be enough to cover the redeem or the call will fail.
     * @param amount Number of tokens to be redeemed
     */
    function redeem(uint amount) external;

    /** Emitted when new token are issued */
    event Issue(uint amount, address to);

    /** Emitted when tokens are redeemed */
    event Redeem(uint amount);
}

/**
 * @title Interface for token contracts manageable by `MultisigManager` contract.
 */
interface ManagedToken is
    ERC173,
    IPausable,
    IBlackList,
    IDeprecatable,
    ISupply
{}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"votingAccounts","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlackFundsDestructionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"upgraded","type":"address"}],"name":"DeprecationRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"IssueRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChangeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"PauseRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedeemRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"RequestCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UnblacklistRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UnpauseRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"VoterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"reqId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"address[]","name":"add","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"remove","type":"address[]"}],"name":"VotersListChangeRequested","type":"event"},{"inputs":[],"name":"MIN_VOTING_ACCOUNTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_APPROVAL_DEADLINE_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveBlackFundsDestruction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveDeprecation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveIssue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveOwnerChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveTokenPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveTokenUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveUnblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"name":"approveVotersListChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMinApprovals","outputs":[{"internalType":"uint256","name":"approvals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVotingAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestBlackFundsDestruction","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestBlacklist","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"upgraded","type":"address"}],"name":"requestDeprecation","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"requestIssue","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"requestOwnerChange","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestRedeem","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"}],"name":"requestTokenPause","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"}],"name":"requestTokenUnpause","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ManagedToken","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"requestUnblacklist","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addVoters","type":"address[]"},{"internalType":"address[]","name":"removeVoters","type":"address[]"}],"name":"requestVotersListChange","outputs":[{"internalType":"bytes32","name":"reqId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingAccountsNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600060045534801561001557600080fd5b506040516143f83803806143f883398181016040528101906100379190610433565b60005b81518110156100775761006c8282815181106100595761005861047c565b5b60200260200101516100cc60201b60201c565b80600101905061003a565b50600360015410156100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b590610508565b60405180910390fd5b600160028190555050610680565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361013b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101329061059a565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610265577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600154106101bd576101bc6105ba565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546102269190610622565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b88160405161025c9190610665565b60405180910390a15b50565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102ca82610281565b810181811067ffffffffffffffff821117156102e9576102e8610292565b5b80604052505050565b60006102fc610268565b905061030882826102c1565b919050565b600067ffffffffffffffff82111561032857610327610292565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103698261033e565b9050919050565b6103798161035e565b811461038457600080fd5b50565b60008151905061039681610370565b92915050565b60006103af6103aa8461030d565b6102f2565b905080838252602082019050602084028301858111156103d2576103d1610339565b5b835b818110156103fb57806103e78882610387565b8452602084019350506020810190506103d4565b5050509392505050565b600082601f83011261041a5761041961027c565b5b815161042a84826020860161039c565b91505092915050565b60006020828403121561044957610448610272565b5b600082015167ffffffffffffffff81111561046757610466610277565b5b61047384828501610405565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e7473000000000000600082015250565b60006104f2601a836104ab565b91506104fd826104bc565b602082019050919050565b60006020820190508181036000830152610521816104e5565b9050919050565b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000610584602f836104ab565b915061058f82610528565b604082019050919050565b600060208201905081810360008301526105b381610577565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061062d826105e9565b9150610638836105e9565b92508282019050808211156106505761064f6105f3565b5b92915050565b61065f8161035e565b82525050565b600060208201905061067a6000830184610656565b92915050565b613d698061068f6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80635caad4d1116100de578063ad28e8dd11610097578063e4dcc59311610071578063e4dcc59314610480578063ead691121461049c578063f75eafe1146104cc578063faa179e7146104e857610173565b8063ad28e8dd14610416578063c8e52fe214610434578063d5e063e41461045057610173565b80635caad4d11461031e57806365b89f9f1461033a57806375e71b741461036a57806377d69a171461039a57806378e93a8f146103ca5780639587eab5146103fa57610173565b80633c9321d8116101305780633c9321d81461023857806349f6a718146102685780634ba3f988146102985780634d3e2490146102c857806350539aa8146102e6578063538dafa31461030257610173565b80630252ec29146101785780630e7af6611461019457806314106703146101b05780631453921a146101e057806316a3f412146101fe57806330e148471461021a575b600080fd5b610192600480360381019061018d9190612b07565b610518565b005b6101ae60048036038101906101a99190612b07565b6106be565b005b6101ca60048036038101906101c59190612ba4565b61084c565b6040516101d79190612be0565b60405180910390f35b6101e861095b565b6040516101f59190612c14565b60405180910390f35b61021860048036038101906102139190612b07565b610961565b005b610222610aef565b60405161022f9190612c14565b60405180910390f35b610252600480360381019061024d9190612c5b565b610af4565b60405161025f9190612be0565b60405180910390f35b610282600480360381019061027d9190612d00565b610c5e565b60405161028f9190612be0565b60405180910390f35b6102b260048036038101906102ad9190612dad565b610d52565b6040516102bf9190612be0565b60405180910390f35b6102d0610f1d565b6040516102dd9190612c14565b60405180910390f35b61030060048036038101906102fb9190612b07565b610f36565b005b61031c60048036038101906103179190612b07565b6110a4565b005b61033860048036038101906103339190612b07565b61121e565b005b610354600480360381019061034f9190612e00565b6113ac565b6040516103619190612be0565b60405180910390f35b610384600480360381019061037f9190612c5b565b61151f565b6040516103919190612be0565b60405180910390f35b6103b460048036038101906103af9190612c5b565b6116f8565b6040516103c19190612be0565b60405180910390f35b6103e460048036038101906103df9190612e40565b611862565b6040516103f19190612e88565b60405180910390f35b610414600480360381019061040f9190612b07565b611882565b005b61041e611a10565b60405161042b9190612c14565b60405180910390f35b61044e60048036038101906104499190612b07565b611a17565b005b61046a60048036038101906104659190612c5b565b611b5e565b6040516104779190612be0565b60405180910390f35b61049a60048036038101906104959190612b07565b611cc8565b005b6104b660048036038101906104b19190612c5b565b611e0f565b6040516104c39190612be0565b60405180910390f35b6104e660048036038101906104e19190612b07565b611f79565b005b61050260048036038101906104fd9190612ba4565b612107565b60405161050f9190612be0565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490612f00565b60405180910390fd5b6105c681612216565b156106bb57600d600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b696a6ad600d600084815260200190815260200160002060020154600d600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610688929190612f2f565b600060405180830381600087803b1580156106a257600080fd5b505af11580156106b6573d6000803e3d6000fd5b505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a90612fa4565b60405180910390fd5b61076c81612216565b15610849576005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108169190612fc4565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b59061302b565b60405180910390fd5b6108c661254e565b9150826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3b82dbef2f3ed22abde3e986b105d003e3018422e845e144f870ec1e2ab168b182338560405161094d9392919061304b565b60405180910390a150919050565b60015481565b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f4565b60405180910390fd5b610a0f81612216565b15610aec57600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3bdc228600b600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610ab99190612fc4565b600060405180830381600087803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b505050505b50565b600381565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061302b565b60405180910390fd5b610b6e61254e565b915083600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600b600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f60aa1c40755ff9e9c57769818cb4e2db7032740713505c57d1f9e606c87f5b1d82338686604051610c4f9493929190613114565b60405180910390a15092915050565b600080858590501180610c745750600083839050115b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa906131cb565b60405180910390fd5b610cbb61254e565b90508484600660008481526020019081526020016000206000019190610ce2929190612a0a565b508282600660008481526020019081526020016000206001019190610d08929190612a0a565b507f77b5e439ba5737d6518b5fa282a81ec318be946c14026c3f96ed576101482414813387878787604051610d42969594939291906132ae565b60405180910390a1949350505050565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061302b565b60405180910390fd5b60008411610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613351565b60405180910390fd5b610e0f61254e565b915084600d600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600d600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600d6000848152602001908152602001600020600201819055507fbbb3cd25643b48b0f39f5ed23f1b95edc1d3bbafed645cff4c2aa4f8c534592f8233878787604051610f0d959493929190613371565b60405180910390a1509392505050565b6000600180600154901c610f3191906133f3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290613473565b60405180910390fd5b610fe481612216565b156110a157600e600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75600e6000848152602001908152602001600020600101546040518263ffffffff1660e01b815260040161106e9190612c14565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050505b50565b600060066000838152602001908152602001600020600001905060006006600084815260200190815260200160002060010190506000828054905011806110ef575060008180549050115b61112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613505565b60405180910390fd5b61113783612216565b156111ff5760005b828054905081101561119c5761119183828154811061116157611160613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612721565b80600101905061113f565b5060005b81805490508110156111fd576111f28282815481106111c2576111c1613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128bd565b8060010190506111a0565b505b60016002600082825461121291906133f3565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906135a0565b60405180910390fd5b6112cc81612216565b156113a957600c600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630753c30c600c600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016113769190612fc4565b600060405180830381600087803b15801561139057600080fd5b505af11580156113a4573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114159061302b565b60405180910390fd5b60008311611461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114589061360c565b60405180910390fd5b61146961254e565b915083600e600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e6000848152602001908152602001600020600101819055507faa7dc873a7d37b94883eae5b185beafe0223de340014bc7a1690496363d5bb2882338686604051611510949392919061362c565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061302b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906136bd565b60405180910390fd5b61160861254e565b915083600c600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3ae19498c83643a3c3cd3c51fd961cdbc50cad7a99d87ae56f6f56395b84a257823386866040516116e99493929190613114565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061302b565b60405180910390fd5b61177261254e565b915083600a600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f32f105be765c08b0dd3a11fb243a1d1c3187adf79ce4e70077b563774f53313b823386866040516118539493929190613114565b60405180910390a15092915050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613729565b60405180910390fd5b61193081612216565b15611a0d576009600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ecb93c06009600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119da9190612fc4565b600060405180830381600087803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050505b50565b6202a30081565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613795565b60405180910390fd5b611ac281612216565b15611b5b576007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061302b565b60405180910390fd5b611bd861254e565b9150836009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826009600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f45468c34c3195dc2fe142866e4d01c6d8f21410db90ebd9132aef6cee5cc81dd82338686604051611cb99493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190613801565b60405180910390fd5b611d7381612216565b15611e0c576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e789061302b565b60405180910390fd5b611e8961254e565b9150836005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826005600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9ac22cbcacf108dcf9ace6c53af2261f39a349b724ad16201a0f342c93e4046582338686604051611f6a9493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff16600a600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120159061386d565b60405180910390fd5b61202781612216565b1561210457600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4997dc5600a600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120d19190612fc4565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061302b565b60405180910390fd5b61218161254e565b9150826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdd4758c2ebea7c3004ca2af3322f3878f26109bded4f13b532832b871a1f86618233856040516122089392919061304b565b60405180910390a150919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906138d9565b60405180910390fd5b60006003600084815260200190815260200160002090506000816001015411612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890613945565b60405180910390fd5b8060020160009054906101000a900460ff1615612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906139b1565b60405180910390fd5b60025481600301541461239b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239290613a43565b60405180910390fd5b80600401544211156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990613aaf565b60405180910390fd5b8060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890613b1b565b60405180910390fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018160010160008282546124e091906133f3565b925050819055506124ef610f1d565b816001015410612548576001915060018160020160006101000a81548160ff021916908315150217905550827f03442af529c92a1449dcf9997323ccb9f819ab9b1e29ac10b82e45e809ecf11b60405160405180910390a25b50919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906138d9565b60405180910390fd5b600460008154809291906125ee90613b3b565b919050556001436125ff9190613b83565b40604051602001612611929190613bb7565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060010154146126505761264f613be0565b5b60016003600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360008381526020019081526020016000206001018190555060025460036000838152602001908152602001600020600301819055506202a3004261270491906133f3565b600360008381526020019081526020016000206004018190555090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790613c81565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001541061281257612811613be0565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600082825461287b91906133f3565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b8816040516128b19190612fc4565b60405180910390a15b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a075760036001805461291e9190613b83565b101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613d13565b60405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546129c89190613b83565b925050819055507fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644816040516129fe9190612fc4565b60405180910390a15b50565b828054828255906000526020600020908101928215612a99579160200282015b82811115612a9857823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a2a565b5b509050612aa69190612aaa565b5090565b5b80821115612ac3576000816000905550600101612aab565b5090565b600080fd5b600080fd5b6000819050919050565b612ae481612ad1565b8114612aef57600080fd5b50565b600081359050612b0181612adb565b92915050565b600060208284031215612b1d57612b1c612ac7565b5b6000612b2b84828501612af2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5f82612b34565b9050919050565b6000612b7182612b54565b9050919050565b612b8181612b66565b8114612b8c57600080fd5b50565b600081359050612b9e81612b78565b92915050565b600060208284031215612bba57612bb9612ac7565b5b6000612bc884828501612b8f565b91505092915050565b612bda81612ad1565b82525050565b6000602082019050612bf56000830184612bd1565b92915050565b6000819050919050565b612c0e81612bfb565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612b54565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b60008060408385031215612c7257612c71612ac7565b5b6000612c8085828601612b8f565b9250506020612c9185828601612c46565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc057612cbf612c9b565b5b8235905067ffffffffffffffff811115612cdd57612cdc612ca0565b5b602083019150836020820283011115612cf957612cf8612ca5565b5b9250929050565b60008060008060408587031215612d1a57612d19612ac7565b5b600085013567ffffffffffffffff811115612d3857612d37612acc565b5b612d4487828801612caa565b9450945050602085013567ffffffffffffffff811115612d6757612d66612acc565b5b612d7387828801612caa565b925092505092959194509250565b612d8a81612bfb565b8114612d9557600080fd5b50565b600081359050612da781612d81565b92915050565b600080600060608486031215612dc657612dc5612ac7565b5b6000612dd486828701612b8f565b9350506020612de586828701612d98565b9250506040612df686828701612c46565b9150509250925092565b60008060408385031215612e1757612e16612ac7565b5b6000612e2585828601612b8f565b9250506020612e3685828601612d98565b9150509250929050565b600060208284031215612e5657612e55612ac7565b5b6000612e6484828501612c46565b91505092915050565b60008115159050919050565b612e8281612e6d565b82525050565b6000602082019050612e9d6000830184612e79565b92915050565b600082825260208201905092915050565b7f696e76616c696420697373756520726571756573742069640000000000000000600082015250565b6000612eea601883612ea3565b9150612ef582612eb4565b602082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b612f2981612b54565b82525050565b6000604082019050612f446000830185612c05565b612f516020830184612f20565b9392505050565b7f696e76616c6964206f776e6572206368616e6765207265717565737420696400600082015250565b6000612f8e601f83612ea3565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b6000602082019050612fd96000830184612f20565b92915050565b7f746f6b656e20616464726573732063616e6e6f74206265207a65726f00000000600082015250565b6000613015601c83612ea3565b915061302082612fdf565b602082019050919050565b6000602082019050818103600083015261304481613008565b9050919050565b60006060820190506130606000830186612bd1565b61306d6020830185612f20565b61307a6040830184612f20565b949350505050565b7f696e76616c69642066756e6473206465737472756374696f6e2072657175657360008201527f7420696400000000000000000000000000000000000000000000000000000000602082015250565b60006130de602483612ea3565b91506130e982613082565b604082019050919050565b6000602082019050818103600083015261310d816130d1565b9050919050565b60006080820190506131296000830187612bd1565b6131366020830186612f20565b6131436040830185612f20565b6131506060830184612f20565b95945050505050565b7f73686f756c642065697468657220616464206f722072656d6f766520736f6d6560008201527f206163636f756e74730000000000000000000000000000000000000000000000602082015250565b60006131b5602983612ea3565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b600082825260208201905092915050565b6000819050919050565b61320f81612b54565b82525050565b60006132218383613206565b60208301905092915050565b600061323c6020840184612c46565b905092915050565b6000602082019050919050565b600061325d83856131eb565b9350613268826131fc565b8060005b858110156132a15761327e828461322d565b6132888882613215565b975061329383613244565b92505060018101905061326c565b5085925050509392505050565b60006080820190506132c36000830189612bd1565b6132d06020830188612f20565b81810360408301526132e3818688613251565b905081810360608301526132f8818486613251565b9050979650505050505050565b7f63616e6e6f74206973737565203020746f6b656e730000000000000000000000600082015250565b600061333b601583612ea3565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b600060a0820190506133866000830188612bd1565b6133936020830187612f20565b6133a06040830186612f20565b6133ad6060830185612c05565b6133ba6080830184612f20565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133fe82612bfb565b915061340983612bfb565b9250828201905080821115613421576134206133c4565b5b92915050565b7f696e76616c69642072656465656d207265717565737420696400000000000000600082015250565b600061345d601983612ea3565b915061346882613427565b602082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f696e76616c696420766f74657273206c697374206368616e676520726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ef602283612ea3565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696e76616c6964206465707265636174696f6e20726571756573742069640000600082015250565b600061358a601e83612ea3565b915061359582613554565b602082019050919050565b600060208201905081810360008301526135b98161357d565b9050919050565b7f63616e6e6f742072656465656d203020746f6b656e7300000000000000000000600082015250565b60006135f6601683612ea3565b9150613601826135c0565b602082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b60006080820190506136416000830187612bd1565b61364e6020830186612f20565b61365b6040830185612f20565b6136686060830184612c05565b95945050505050565b7f63616e6e6f74207570677261646520746f207a65726f20616464726573730000600082015250565b60006136a7601e83612ea3565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f696e76616c696420626c61636b6c697374207265717565737420696400000000600082015250565b6000613713601c83612ea3565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f696e76616c696420706175736520726571756573742069640000000000000000600082015250565b600061377f601883612ea3565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f696e76616c696420756e70617573652072657175657374206964000000000000600082015250565b60006137eb601a83612ea3565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f696e76616c696420756e626c61636b6c69737420726571756573742069640000600082015250565b6000613857601e83612ea3565b915061386282613821565b602082019050919050565b600060208201905081810360008301526138868161384a565b9050919050565b7f6e6f74206120766f74696e67206163636f756e74000000000000000000000000600082015250565b60006138c3601483612ea3565b91506138ce8261388d565b602082019050919050565b600060208201905081810360008301526138f2816138b6565b9050919050565b7f696e76616c696420726571756573742069640000000000000000000000000000600082015250565b600061392f601283612ea3565b915061393a826138f9565b602082019050919050565b6000602082019050818103600083015261395e81613922565b9050919050565b7f7265717565737420616c726561647920636f6d706c6574656400000000000000600082015250565b600061399b601983612ea3565b91506139a682613965565b602082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f7265717565737420696e76616c69646174656420616674657220766f7465727360008201527f206c697374206368616e67650000000000000000000000000000000000000000602082015250565b6000613a2d602c83612ea3565b9150613a38826139d1565b604082019050919050565b60006020820190508181036000830152613a5c81613a20565b9050919050565b7f72657175657374206973206f7574646174656400000000000000000000000000600082015250565b6000613a99601383612ea3565b9150613aa482613a63565b602082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f616c726561647920617070726f7665642062792074686973206163636f756e74600082015250565b6000613b05602083612ea3565b9150613b1082613acf565b602082019050919050565b60006020820190508181036000830152613b3481613af8565b9050919050565b6000613b4682612bfb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7857613b776133c4565b5b600182019050919050565b6000613b8e82612bfb565b9150613b9983612bfb565b9250828203905081811115613bb157613bb06133c4565b5b92915050565b6000604082019050613bcc6000830185612c05565b613bd96020830184612bd1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000613c6b602f83612ea3565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e74732077696c6c2060008201527f72656d61696e0000000000000000000000000000000000000000000000000000602082015250565b6000613cfd602683612ea3565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b905091905056fea2646970667358221220cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b07064736f6c634300081a0033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000060000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a920000000000000000000000001008554cf8b02ca890fb49540677a402955cb560000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80635caad4d1116100de578063ad28e8dd11610097578063e4dcc59311610071578063e4dcc59314610480578063ead691121461049c578063f75eafe1146104cc578063faa179e7146104e857610173565b8063ad28e8dd14610416578063c8e52fe214610434578063d5e063e41461045057610173565b80635caad4d11461031e57806365b89f9f1461033a57806375e71b741461036a57806377d69a171461039a57806378e93a8f146103ca5780639587eab5146103fa57610173565b80633c9321d8116101305780633c9321d81461023857806349f6a718146102685780634ba3f988146102985780634d3e2490146102c857806350539aa8146102e6578063538dafa31461030257610173565b80630252ec29146101785780630e7af6611461019457806314106703146101b05780631453921a146101e057806316a3f412146101fe57806330e148471461021a575b600080fd5b610192600480360381019061018d9190612b07565b610518565b005b6101ae60048036038101906101a99190612b07565b6106be565b005b6101ca60048036038101906101c59190612ba4565b61084c565b6040516101d79190612be0565b60405180910390f35b6101e861095b565b6040516101f59190612c14565b60405180910390f35b61021860048036038101906102139190612b07565b610961565b005b610222610aef565b60405161022f9190612c14565b60405180910390f35b610252600480360381019061024d9190612c5b565b610af4565b60405161025f9190612be0565b60405180910390f35b610282600480360381019061027d9190612d00565b610c5e565b60405161028f9190612be0565b60405180910390f35b6102b260048036038101906102ad9190612dad565b610d52565b6040516102bf9190612be0565b60405180910390f35b6102d0610f1d565b6040516102dd9190612c14565b60405180910390f35b61030060048036038101906102fb9190612b07565b610f36565b005b61031c60048036038101906103179190612b07565b6110a4565b005b61033860048036038101906103339190612b07565b61121e565b005b610354600480360381019061034f9190612e00565b6113ac565b6040516103619190612be0565b60405180910390f35b610384600480360381019061037f9190612c5b565b61151f565b6040516103919190612be0565b60405180910390f35b6103b460048036038101906103af9190612c5b565b6116f8565b6040516103c19190612be0565b60405180910390f35b6103e460048036038101906103df9190612e40565b611862565b6040516103f19190612e88565b60405180910390f35b610414600480360381019061040f9190612b07565b611882565b005b61041e611a10565b60405161042b9190612c14565b60405180910390f35b61044e60048036038101906104499190612b07565b611a17565b005b61046a60048036038101906104659190612c5b565b611b5e565b6040516104779190612be0565b60405180910390f35b61049a60048036038101906104959190612b07565b611cc8565b005b6104b660048036038101906104b19190612c5b565b611e0f565b6040516104c39190612be0565b60405180910390f35b6104e660048036038101906104e19190612b07565b611f79565b005b61050260048036038101906104fd9190612ba4565b612107565b60405161050f9190612be0565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490612f00565b60405180910390fd5b6105c681612216565b156106bb57600d600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b696a6ad600d600084815260200190815260200160002060020154600d600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610688929190612f2f565b600060405180830381600087803b1580156106a257600080fd5b505af11580156106b6573d6000803e3d6000fd5b505050505b50565b600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075a90612fa4565b60405180910390fd5b61076c81612216565b15610849576005600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6005600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016108169190612fc4565b600060405180830381600087803b15801561083057600080fd5b505af1158015610844573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b59061302b565b60405180910390fd5b6108c661254e565b9150826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3b82dbef2f3ed22abde3e986b105d003e3018422e845e144f870ec1e2ab168b182338560405161094d9392919061304b565b60405180910390a150919050565b60015481565b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fd906130f4565b60405180910390fd5b610a0f81612216565b15610aec57600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f3bdc228600b600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610ab99190612fc4565b600060405180830381600087803b158015610ad357600080fd5b505af1158015610ae7573d6000803e3d6000fd5b505050505b50565b600381565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5d9061302b565b60405180910390fd5b610b6e61254e565b915083600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600b600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f60aa1c40755ff9e9c57769818cb4e2db7032740713505c57d1f9e606c87f5b1d82338686604051610c4f9493929190613114565b60405180910390a15092915050565b600080858590501180610c745750600083839050115b610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa906131cb565b60405180910390fd5b610cbb61254e565b90508484600660008481526020019081526020016000206000019190610ce2929190612a0a565b508282600660008481526020019081526020016000206001019190610d08929190612a0a565b507f77b5e439ba5737d6518b5fa282a81ec318be946c14026c3f96ed576101482414813387878787604051610d42969594939291906132ae565b60405180910390a1949350505050565b600083600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9061302b565b60405180910390fd5b60008411610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613351565b60405180910390fd5b610e0f61254e565b915084600d600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600d600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600d6000848152602001908152602001600020600201819055507fbbb3cd25643b48b0f39f5ed23f1b95edc1d3bbafed645cff4c2aa4f8c534592f8233878787604051610f0d959493929190613371565b60405180910390a1509392505050565b6000600180600154901c610f3191906133f3565b905090565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290613473565b60405180910390fd5b610fe481612216565b156110a157600e600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75600e6000848152602001908152602001600020600101546040518263ffffffff1660e01b815260040161106e9190612c14565b600060405180830381600087803b15801561108857600080fd5b505af115801561109c573d6000803e3d6000fd5b505050505b50565b600060066000838152602001908152602001600020600001905060006006600084815260200190815260200160002060010190506000828054905011806110ef575060008180549050115b61112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590613505565b60405180910390fd5b61113783612216565b156111ff5760005b828054905081101561119c5761119183828154811061116157611160613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612721565b80600101905061113f565b5060005b81805490508110156111fd576111f28282815481106111c2576111c1613525565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166128bd565b8060010190506111a0565b505b60016002600082825461121291906133f3565b92505081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906135a0565b60405180910390fd5b6112cc81612216565b156113a957600c600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630753c30c600c600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016113769190612fc4565b600060405180830381600087803b15801561139057600080fd5b505af11580156113a4573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361141e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114159061302b565b60405180910390fd5b60008311611461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114589061360c565b60405180910390fd5b61146961254e565b915083600e600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e6000848152602001908152602001600020600101819055507faa7dc873a7d37b94883eae5b185beafe0223de340014bc7a1690496363d5bb2882338686604051611510949392919061362c565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115889061302b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906136bd565b60405180910390fd5b61160861254e565b915083600c600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3ae19498c83643a3c3cd3c51fd961cdbc50cad7a99d87ae56f6f56395b84a257823386866040516116e99493929190613114565b60405180910390a15092915050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061302b565b60405180910390fd5b61177261254e565b915083600a600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f32f105be765c08b0dd3a11fb243a1d1c3187adf79ce4e70077b563774f53313b823386866040516118539493929190613114565b60405180910390a15092915050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff166009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613729565b60405180910390fd5b61193081612216565b15611a0d576009600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ecb93c06009600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119da9190612fc4565b600060405180830381600087803b1580156119f457600080fd5b505af1158015611a08573d6000803e3d6000fd5b505050505b50565b6202a30081565b600073ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613795565b60405180910390fd5b611ac281612216565b15611b5b576007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061302b565b60405180910390fd5b611bd861254e565b9150836009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826009600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f45468c34c3195dc2fe142866e4d01c6d8f21410db90ebd9132aef6cee5cc81dd82338686604051611cb99493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190613801565b60405180910390fd5b611d7381612216565b15611e0c576008600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505b50565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e789061302b565b60405180910390fd5b611e8961254e565b9150836005600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826005600084815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9ac22cbcacf108dcf9ace6c53af2261f39a349b724ad16201a0f342c93e4046582338686604051611f6a9493929190613114565b60405180910390a15092915050565b600073ffffffffffffffffffffffffffffffffffffffff16600a600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120159061386d565b60405180910390fd5b61202781612216565b1561210457600a600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4997dc5600a600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016120d19190612fc4565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b505050505b50565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061302b565b60405180910390fd5b61218161254e565b9150826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdd4758c2ebea7c3004ca2af3322f3878f26109bded4f13b532832b871a1f86618233856040516122089392919061304b565b60405180910390a150919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906138d9565b60405180910390fd5b60006003600084815260200190815260200160002090506000816001015411612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890613945565b60405180910390fd5b8060020160009054906101000a900460ff1615612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906139b1565b60405180910390fd5b60025481600301541461239b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239290613a43565b60405180910390fd5b80600401544211156123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990613aaf565b60405180910390fd5b8060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890613b1b565b60405180910390fd5b60018160000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018160010160008282546124e091906133f3565b925050819055506124ef610f1d565b816001015410612548576001915060018160020160006101000a81548160ff021916908315150217905550827f03442af529c92a1449dcf9997323ccb9f819ab9b1e29ac10b82e45e809ecf11b60405160405180910390a25b50919050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d2906138d9565b60405180910390fd5b600460008154809291906125ee90613b3b565b919050556001436125ff9190613b83565b40604051602001612611929190613bb7565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060010154146126505761264f613be0565b5b60016003600083815260200190815260200160002060000160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360008381526020019081526020016000206001018190555060025460036000838152602001908152602001600020600301819055506202a3004261270491906133f3565b600360008381526020019081526020016000206004018190555090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790613c81565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001541061281257612811613be0565b5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600180600082825461287b91906133f3565b925050819055507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b8816040516128b19190612fc4565b60405180910390a15b50565b6000808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a075760036001805461291e9190613b83565b101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690613d13565b60405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060018060008282546129c89190613b83565b925050819055507fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d644816040516129fe9190612fc4565b60405180910390a15b50565b828054828255906000526020600020908101928215612a99579160200282015b82811115612a9857823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612a2a565b5b509050612aa69190612aaa565b5090565b5b80821115612ac3576000816000905550600101612aab565b5090565b600080fd5b600080fd5b6000819050919050565b612ae481612ad1565b8114612aef57600080fd5b50565b600081359050612b0181612adb565b92915050565b600060208284031215612b1d57612b1c612ac7565b5b6000612b2b84828501612af2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5f82612b34565b9050919050565b6000612b7182612b54565b9050919050565b612b8181612b66565b8114612b8c57600080fd5b50565b600081359050612b9e81612b78565b92915050565b600060208284031215612bba57612bb9612ac7565b5b6000612bc884828501612b8f565b91505092915050565b612bda81612ad1565b82525050565b6000602082019050612bf56000830184612bd1565b92915050565b6000819050919050565b612c0e81612bfb565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612b54565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b60008060408385031215612c7257612c71612ac7565b5b6000612c8085828601612b8f565b9250506020612c9185828601612c46565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612cc057612cbf612c9b565b5b8235905067ffffffffffffffff811115612cdd57612cdc612ca0565b5b602083019150836020820283011115612cf957612cf8612ca5565b5b9250929050565b60008060008060408587031215612d1a57612d19612ac7565b5b600085013567ffffffffffffffff811115612d3857612d37612acc565b5b612d4487828801612caa565b9450945050602085013567ffffffffffffffff811115612d6757612d66612acc565b5b612d7387828801612caa565b925092505092959194509250565b612d8a81612bfb565b8114612d9557600080fd5b50565b600081359050612da781612d81565b92915050565b600080600060608486031215612dc657612dc5612ac7565b5b6000612dd486828701612b8f565b9350506020612de586828701612d98565b9250506040612df686828701612c46565b9150509250925092565b60008060408385031215612e1757612e16612ac7565b5b6000612e2585828601612b8f565b9250506020612e3685828601612d98565b9150509250929050565b600060208284031215612e5657612e55612ac7565b5b6000612e6484828501612c46565b91505092915050565b60008115159050919050565b612e8281612e6d565b82525050565b6000602082019050612e9d6000830184612e79565b92915050565b600082825260208201905092915050565b7f696e76616c696420697373756520726571756573742069640000000000000000600082015250565b6000612eea601883612ea3565b9150612ef582612eb4565b602082019050919050565b60006020820190508181036000830152612f1981612edd565b9050919050565b612f2981612b54565b82525050565b6000604082019050612f446000830185612c05565b612f516020830184612f20565b9392505050565b7f696e76616c6964206f776e6572206368616e6765207265717565737420696400600082015250565b6000612f8e601f83612ea3565b9150612f9982612f58565b602082019050919050565b60006020820190508181036000830152612fbd81612f81565b9050919050565b6000602082019050612fd96000830184612f20565b92915050565b7f746f6b656e20616464726573732063616e6e6f74206265207a65726f00000000600082015250565b6000613015601c83612ea3565b915061302082612fdf565b602082019050919050565b6000602082019050818103600083015261304481613008565b9050919050565b60006060820190506130606000830186612bd1565b61306d6020830185612f20565b61307a6040830184612f20565b949350505050565b7f696e76616c69642066756e6473206465737472756374696f6e2072657175657360008201527f7420696400000000000000000000000000000000000000000000000000000000602082015250565b60006130de602483612ea3565b91506130e982613082565b604082019050919050565b6000602082019050818103600083015261310d816130d1565b9050919050565b60006080820190506131296000830187612bd1565b6131366020830186612f20565b6131436040830185612f20565b6131506060830184612f20565b95945050505050565b7f73686f756c642065697468657220616464206f722072656d6f766520736f6d6560008201527f206163636f756e74730000000000000000000000000000000000000000000000602082015250565b60006131b5602983612ea3565b91506131c082613159565b604082019050919050565b600060208201905081810360008301526131e4816131a8565b9050919050565b600082825260208201905092915050565b6000819050919050565b61320f81612b54565b82525050565b60006132218383613206565b60208301905092915050565b600061323c6020840184612c46565b905092915050565b6000602082019050919050565b600061325d83856131eb565b9350613268826131fc565b8060005b858110156132a15761327e828461322d565b6132888882613215565b975061329383613244565b92505060018101905061326c565b5085925050509392505050565b60006080820190506132c36000830189612bd1565b6132d06020830188612f20565b81810360408301526132e3818688613251565b905081810360608301526132f8818486613251565b9050979650505050505050565b7f63616e6e6f74206973737565203020746f6b656e730000000000000000000000600082015250565b600061333b601583612ea3565b915061334682613305565b602082019050919050565b6000602082019050818103600083015261336a8161332e565b9050919050565b600060a0820190506133866000830188612bd1565b6133936020830187612f20565b6133a06040830186612f20565b6133ad6060830185612c05565b6133ba6080830184612f20565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133fe82612bfb565b915061340983612bfb565b9250828201905080821115613421576134206133c4565b5b92915050565b7f696e76616c69642072656465656d207265717565737420696400000000000000600082015250565b600061345d601983612ea3565b915061346882613427565b602082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f696e76616c696420766f74657273206c697374206368616e676520726571756560008201527f7374000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ef602283612ea3565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f696e76616c6964206465707265636174696f6e20726571756573742069640000600082015250565b600061358a601e83612ea3565b915061359582613554565b602082019050919050565b600060208201905081810360008301526135b98161357d565b9050919050565b7f63616e6e6f742072656465656d203020746f6b656e7300000000000000000000600082015250565b60006135f6601683612ea3565b9150613601826135c0565b602082019050919050565b60006020820190508181036000830152613625816135e9565b9050919050565b60006080820190506136416000830187612bd1565b61364e6020830186612f20565b61365b6040830185612f20565b6136686060830184612c05565b95945050505050565b7f63616e6e6f74207570677261646520746f207a65726f20616464726573730000600082015250565b60006136a7601e83612ea3565b91506136b282613671565b602082019050919050565b600060208201905081810360008301526136d68161369a565b9050919050565b7f696e76616c696420626c61636b6c697374207265717565737420696400000000600082015250565b6000613713601c83612ea3565b915061371e826136dd565b602082019050919050565b6000602082019050818103600083015261374281613706565b9050919050565b7f696e76616c696420706175736520726571756573742069640000000000000000600082015250565b600061377f601883612ea3565b915061378a82613749565b602082019050919050565b600060208201905081810360008301526137ae81613772565b9050919050565b7f696e76616c696420756e70617573652072657175657374206964000000000000600082015250565b60006137eb601a83612ea3565b91506137f6826137b5565b602082019050919050565b6000602082019050818103600083015261381a816137de565b9050919050565b7f696e76616c696420756e626c61636b6c69737420726571756573742069640000600082015250565b6000613857601e83612ea3565b915061386282613821565b602082019050919050565b600060208201905081810360008301526138868161384a565b9050919050565b7f6e6f74206120766f74696e67206163636f756e74000000000000000000000000600082015250565b60006138c3601483612ea3565b91506138ce8261388d565b602082019050919050565b600060208201905081810360008301526138f2816138b6565b9050919050565b7f696e76616c696420726571756573742069640000000000000000000000000000600082015250565b600061392f601283612ea3565b915061393a826138f9565b602082019050919050565b6000602082019050818103600083015261395e81613922565b9050919050565b7f7265717565737420616c726561647920636f6d706c6574656400000000000000600082015250565b600061399b601983612ea3565b91506139a682613965565b602082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f7265717565737420696e76616c69646174656420616674657220766f7465727360008201527f206c697374206368616e67650000000000000000000000000000000000000000602082015250565b6000613a2d602c83612ea3565b9150613a38826139d1565b604082019050919050565b60006020820190508181036000830152613a5c81613a20565b9050919050565b7f72657175657374206973206f7574646174656400000000000000000000000000600082015250565b6000613a99601383612ea3565b9150613aa482613a63565b602082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b7f616c726561647920617070726f7665642062792074686973206163636f756e74600082015250565b6000613b05602083612ea3565b9150613b1082613acf565b602082019050919050565b60006020820190508181036000830152613b3481613af8565b9050919050565b6000613b4682612bfb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b7857613b776133c4565b5b600182019050919050565b6000613b8e82612bfb565b9150613b9983612bfb565b9250828203905081811115613bb157613bb06133c4565b5b92915050565b6000604082019050613bcc6000830185612c05565b613bd96020830184612bd1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f63616e6e6f7420616464207a65726f206164647265737320746f20766f74696e60008201527f67206163636f756e7473206c6973740000000000000000000000000000000000602082015250565b6000613c6b602f83612ea3565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f6e6f7420656e6f75676820766f74696e67206163636f756e74732077696c6c2060008201527f72656d61696e0000000000000000000000000000000000000000000000000000602082015250565b6000613cfd602683612ea3565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b905091905056fea2646970667358221220cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b07064736f6c634300081a0033

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

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000060000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a920000000000000000000000001008554cf8b02ca890fb49540677a402955cb560000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11

-----Decoded View---------------
Arg [0] : votingAccounts (address[]): 0x4C2F6ad396FF2d1d105D0f6261743cAec85Aa564,0xAA93B852F5A54ddb130FF5c79f8A838c492Bf46E,0x8798c87519e09a736EFef4793E07D441f1fD7c21,0xc0D19D3984D67E1d7DE09D1D66E9Cbd6Bf2A9A92,0x1008554cf8b02ca890fB49540677a402955CB560,0x334fe515c45851Ff90a5313a6540E81954d91a11

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [2] : 0000000000000000000000004c2f6ad396ff2d1d105d0f6261743caec85aa564
Arg [3] : 000000000000000000000000aa93b852f5a54ddb130ff5c79f8a838c492bf46e
Arg [4] : 0000000000000000000000008798c87519e09a736efef4793e07d441f1fd7c21
Arg [5] : 000000000000000000000000c0d19d3984d67e1d7de09d1d66e9cbd6bf2a9a92
Arg [6] : 0000000000000000000000001008554cf8b02ca890fb49540677a402955cb560
Arg [7] : 000000000000000000000000334fe515c45851ff90a5313a6540e81954d91a11


Deployed Bytecode Sourcemap

1185:25099:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24094:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9287:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13040:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2168:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20156:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1499:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19516:461;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10954:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23505:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6953:124;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25952:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11698:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22126:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25416:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21518:456;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17669:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1872:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16448:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1802:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13433:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15948:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14747:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8778:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18182:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14344:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24094:378;24218:1;24171:49;;24179:13;:20;24193:5;24179:20;;;;;;;;;;;:26;;;;;;;;;;;;24171:49;;;24150:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;24285:22;24301:5;24285:15;:22::i;:::-;24281:185;;;24323:13;:20;24337:5;24323:20;;;;;;;;;;;:26;;;;;;;;;;;;:32;;;24373:13;:20;24387:5;24373:20;;;;;;;;;;;:27;;;24418:13;:20;24432:5;24418:20;;;;;;;;;;;:23;;;;;;;;;;;;24323:132;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24281:185;24094:378;:::o;9287:376::-;9417:1;9370:49;;:19;:26;9390:5;9370:26;;;;;;;;;;;:35;;;;;;;;;;;;:49;;;9349:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;9491:22;9507:5;9491:15;:22::i;:::-;9487:170;;;9529:19;:26;9549:5;9529:26;;;;;;;;;;;:32;;;;;;;;;;;;:50;;;9597:19;:26;9617:5;9597:26;;;;;;;;;;;:35;;;;;;;;;;;;9529:117;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9487:170;9287:376;:::o;13040:264::-;13148:13;13132:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;13181:14:::1;:12;:14::i;:::-;13173:22;;13228:5;13205:13;:20;13219:5;13205:20;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;13248:49;13263:5;13270:10;13290:5;13248:49;;;;;;;;:::i;:::-;;;;;;;;13040:264:::0;;;;:::o;2168:32::-;;;;:::o;20156:414::-;20308:1;20249:61;;20257:25;:32;20283:5;20257:32;;;;;;;;;;;:38;;;;;;;;;;;;20249:61;;;20228:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;20387:22;20403:5;20387:15;:22::i;:::-;20383:181;;;20425:25;:32;20451:5;20425:32;;;;;;;;;;;:38;;;;;;;;;;;;:56;;;20499:25;:32;20525:5;20499:32;;;;;;;;;;;:40;;;;;;;;;;;;20425:128;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20383:181;20156:414;:::o;1499:44::-;1542:1;1499:44;:::o;19516:461::-;19660:13;19644:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;19693:14:::1;:12;:14::i;:::-;19685:22;;19758:5;19717:25;:32;19743:5;19717:32;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;19816:7;19773:25;:32;19799:5;19773:32;;;;;;;;;;;:40;;;:50;;;;;;;;;;;;;;;;;;19838:132;19882:5;19901:10;19933:5;19953:7;19838:132;;;;;;;;;:::i;:::-;;;;;;;;19516:461:::0;;;;;:::o;10954:602::-;11090:13;11155:1;11136:9;;:16;;:20;:47;;;;11182:1;11160:12;;:19;;:23;11136:47;11115:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;11269:14;:12;:14::i;:::-;11261:22;;11333:9;;11293:20;:27;11314:5;11293:27;;;;;;;;;;;:37;;:49;;;;;;;:::i;:::-;;11395:12;;11352:20;:27;11373:5;11352:27;;;;;;;;;;;:40;;:55;;;;;;;:::i;:::-;;11422:127;11461:5;11480:10;11504:9;;11527:12;;11422:127;;;;;;;;;;;:::i;:::-;;;;;;;;10954:602;;;;;;:::o;23505:457::-;23649:13;23633:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23691:1:::1;23682:6;:10;23674:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;23737:14;:12;:14::i;:::-;23729:22;;23790:5;23761:13;:20;23775:5;23761:20;;;;;;;;;;;:26;;;:34;;;;;;;;;;;;;;;;;;23831:2;23805:13;:20;23819:5;23805:20;;;;;;;;;;;:23;;;:28;;;;;;;;;;;;;;;;;;23873:6;23843:13;:20;23857:5;23843:20;;;;;;;;;;;:27;;:36;;;;23894:61;23909:5;23916:10;23936:5;23944:6;23952:2;23894:61;;;;;;;;;;:::i;:::-;;;;;;;;23505:457:::0;;;;;;:::o;6953:124::-;7001:14;7069:1;7064;7040:20;;:25;;7039:31;;;;:::i;:::-;7027:43;;6953:124;:::o;25952:313::-;26078:1;26030:50;;26038:14;:21;26053:5;26038:21;;;;;;;;;;;:27;;;;;;;;;;;;26030:50;;;26009:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;26146:22;26162:5;26146:15;:22::i;:::-;26142:117;;;26184:14;:21;26199:5;26184:21;;;;;;;;;;;:27;;;;;;;;;;;;:34;;;26219:14;:21;26234:5;26219:21;;;;;;;;;;;:28;;;26184:64;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26142:117;25952:313;:::o;11698:720::-;11765:27;11795:20;:27;11816:5;11795:27;;;;;;;;;;;:37;;11765:67;;11842:30;11875:20;:27;11896:5;11875:27;;;;;;;;;;;:53;;11842:86;;11978:1;11959:9;:16;;;;:20;:47;;;;12005:1;11983:12;:19;;;;:23;11959:47;11938:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;12081:22;12097:5;12081:15;:22::i;:::-;12077:291;;;12124:6;12119:108;12140:9;:16;;;;12136:1;:20;12119:108;;;12181:31;12199:9;12209:1;12199:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12181:17;:31::i;:::-;12158:3;;;;;12119:108;;;;12246:6;12241:117;12262:12;:19;;;;12258:1;:23;12241:117;;;12306:37;12327:12;12340:1;12327:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12306:20;:37::i;:::-;12283:3;;;;;12241:117;;;;12077:291;12410:1;12378:28;;:33;;;;;;;:::i;:::-;;;;;;;;11755:663;;11698:720;:::o;22126:378::-;22262:1;22209:55;;22217:19;:26;22237:5;22217:26;;;;;;;;;;;:32;;;;;;;;;;;;22209:55;;;22188:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;22335:22;22351:5;22335:15;:22::i;:::-;22331:167;;;22373:19;:26;22393:5;22373:26;;;;;;;;;;;:32;;;;;;;;;;;;:42;;;22433:19;:26;22453:5;22433:26;;;;;;;;;;;:40;;;;;;;;;;;;22373:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22331:167;22126:378;:::o;25416:400::-;25541:13;25525:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;25583:1:::1;25574:6;:10;25566:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;25630:14;:12;:14::i;:::-;25622:22;;25684:5;25654:14;:21;25669:5;25654:21;;;;;;;;;;;:27;;;:35;;;;;;;;;;;;;;;;;;25730:6;25699:14;:21;25714:5;25699:21;;;;;;;;;;;:28;;:37;;;;25751:58;25767:5;25774:10;25794:5;25802:6;25751:58;;;;;;;;;:::i;:::-;;;;;;;;25416:400:::0;;;;;:::o;21518:456::-;21653:13;21637:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21706:1:::1;21686:22;;:8;:22;;::::0;21678:65:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21762:14;:12;:14::i;:::-;21754:22;;21821:5;21786:19;:26;21806:5;21786:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;21879:8;21836:19;:26;21856:5;21836:26;;;;;;;;;;;:40;;;:51;;;;;;;;;;;;;;;;;;21902:65;21923:5;21930:10;21950:5;21958:8;21902:65;;;;;;;;;:::i;:::-;;;;;;;;21518:456:::0;;;;;:::o;17669:371::-;17803:13;17787:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;17836:14:::1;:12;:14::i;:::-;17828:22;;17895:5;17860:19;:26;17880:5;17860:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;17947:7;17910:19;:26;17930:5;17910:26;;;;;;;;;;;:34;;;:44;;;;;;;;;;;;;;;;;;17969:64;17990:5;17997:10;18017:5;18025:7;17969:64;;;;;;;;;:::i;:::-;;;;;;;;17669:371:::0;;;;;:::o;1872:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;16448:365::-;16580:1;16529:53;;16537:17;:24;16555:5;16537:24;;;;;;;;;;;:30;;;;;;;;;;;;16529:53;;;16508:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;16651:22;16667:5;16651:15;:22::i;:::-;16647:160;;;16689:17;:24;16707:5;16689:24;;;;;;;;;;;:30;;;;;;;;;;;;:43;;;16750:17;:24;16768:5;16750:24;;;;;;;;;;;:32;;;;;;;;;;;;16689:107;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16647:160;16448:365;:::o;1802:63::-;1859:6;1802:63;:::o;13433:273::-;13556:1;13515:43;;13523:13;:20;13537:5;13523:20;;;;;;;;;;;;;;;;;;;;;13515:43;;;13494:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;13623:22;13639:5;13623:15;:22::i;:::-;13619:81;;;13661:13;:20;13675:5;13661:20;;;;;;;;;;;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13619:81;13433:273;:::o;15948:363::-;16080:13;16064:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;16113:14:::1;:12;:14::i;:::-;16105:22;;16170:5;16137:17;:24;16155:5;16137:24;;;;;;;;;;;:30;;;:38;;;;;;;;;;;;;;;;;;16220:7;16185:17;:24;16203:5;16185:24;;;;;;;;;;;:32;;;:42;;;;;;;;;;;;;;;;;;16242:62;16261:5;16268:10;16288:5;16296:7;16242:62;;;;;;;;;:::i;:::-;;;;;;;;15948:363:::0;;;;;:::o;14747:283::-;14874:1;14831:45;;14839:15;:22;14855:5;14839:22;;;;;;;;;;;;;;;;;;;;;14831:45;;;14810:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;14943:22;14959:5;14943:15;:22::i;:::-;14939:85;;;14981:15;:22;14997:5;14981:22;;;;;;;;;;;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14939:85;14747:283;:::o;8778:375::-;8913:13;8897:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;8946:14:::1;:12;:14::i;:::-;8938:22;;9005:5;8970:19;:26;8990:5;8970:26;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;9058:8;9020:19;:26;9040:5;9020:26;;;;;;;;;;;:35;;;:46;;;;;;;;;;;;;;;;;;9081:65;9102:5;9109:10;9129:5;9137:8;9081:65;;;;;;;;;:::i;:::-;;;;;;;;8778:375:::0;;;;;:::o;18182:378::-;18318:1;18265:55;;18273:19;:26;18293:5;18273:26;;;;;;;;;;;:32;;;;;;;;;;;;18265:55;;;18244:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;18391:22;18407:5;18391:15;:22::i;:::-;18387:167;;;18429:19;:26;18449:5;18429:26;;;;;;;;;;;:32;;;;;;;;;;;;:48;;;18495:19;:26;18515:5;18495:26;;;;;;;;;;;:34;;;;;;;;;;;;18429:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18387:167;18182:378;:::o;14344:270::-;14454:13;14438:5;7178:1;7152:28;;7160:5;7152:28;;;7144:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;14487:14:::1;:12;:14::i;:::-;14479:22;;14536:5;14511:15;:22;14527:5;14511:22;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;14556:51;14573:5;14580:10;14600:5;14556:51;;;;;;;;:::i;:::-;;;;;;;;14344:270:::0;;;;:::o;5943:853::-;6032:13;7284:15;:27;7300:10;7284:27;;;;;;;;;;;;;;;;;;;;;;;;;7276:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;6057:19:::1;6079:8;:15;6088:5;6079:15;;;;;;;;;;;6057:37;;6129:1;6113:3;:13;;;:17;6105:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;6172:3;:13;;;;;;;;;;;;6171:14;6163:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6264:28;;6246:3;:14;;;:46;6225:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;6399:3;:12;;;6380:15;:31;;6372:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6467:3;:14;;:26;6482:10;6467:26;;;;;;;;;;;;;;;;;;;;;;;;;6466:27;6445:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;6591:4;6562:3;:14;;:26;6577:10;6562:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;6622:1;6605:3;:13;;;:18;;;;;;;:::i;:::-;;;;;;;;6655:17;:15;:17::i;:::-;6638:3;:13;;;:34;6634:156;;6699:4;6688:15;;6733:4;6717:3;:13;;;:20;;;;;;;;;;;;;;;;;;6773:5;6756:23;;;;;;;;;;6634:156;6047:749;5943:853:::0;;;:::o;5107:542::-;5166:13;7284:15;:27;7300:10;7284:27;;;;;;;;;;;;;;;;;;;;;;;;;7276:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5233:12:::1;;:14;;;;;;;;;:::i;:::-;;;;;5274:1;5259:12;:16;;;;:::i;:::-;5249:27;5222:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5199:88;;;;;;5191:96;;5333:1;5304:8;:15;5313:5;5304:15;;;;;;;;;;;:25;;;:30;5297:38;;;;:::i;:::-;;5420:4;5379:8;:15;5388:5;5379:15;;;;;;;;;;;:26;;:38;5406:10;5379:38;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;5462:1;5434:8;:15;5443:5;5434:15;;;;;;;;;;;:25;;:29;;;;5502:28;;5473:8;:15;5482:5;5473:15;;;;;;;;;;;:26;;:57;;;;1859:6;5579:15;:63;;;;:::i;:::-;5540:8;:15;5549:5;5540:15;;;;;;;;;;;:24;;:102;;;;5107:542:::0;:::o;2970:402::-;3066:1;3050:18;;:4;:18;;;3029:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;3157:15;:21;3173:4;3157:21;;;;;;;;;;;;;;;;;;;;;;;;;3152:214;;3224:14;3201:20;;:37;3194:45;;;;:::i;:::-;;3277:4;3253:15;:21;3269:4;3253:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;3319:1;3295:20;;:25;;;;;;;:::i;:::-;;;;;;;;3339:16;3350:4;3339:16;;;;;;:::i;:::-;;;;;;;;3152:214;2970:402;:::o;3501:383::-;3567:15;:21;3583:4;3567:21;;;;;;;;;;;;;;;;;;;;;;;;;3563:315;;;1542:1;3652;3629:20;;:24;;;;:::i;:::-;:47;;3604:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;3786:5;3762:15;:21;3778:4;3762:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;3829:1;3805:20;;:25;;;;;;;:::i;:::-;;;;;;;;3849:18;3862:4;3849:18;;;;;;:::i;:::-;;;;;;;;3563:315;3501:383;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;88:117:2:-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1062:7;1102:42;1095:5;1091:54;1080:65;;1025:126;;;:::o;1157:96::-;1194:7;1223:24;1241:5;1223:24;:::i;:::-;1212:35;;1157:96;;;:::o;1259:116::-;1316:7;1345:24;1363:5;1345:24;:::i;:::-;1334:35;;1259:116;;;:::o;1381:162::-;1474:44;1512:5;1474:44;:::i;:::-;1467:5;1464:55;1454:83;;1533:1;1530;1523:12;1454:83;1381:162;:::o;1549:179::-;1615:5;1653:6;1640:20;1631:29;;1669:53;1716:5;1669:53;:::i;:::-;1549:179;;;;:::o;1734:369::-;1813:6;1862:2;1850:9;1841:7;1837:23;1833:32;1830:119;;;1868:79;;:::i;:::-;1830:119;1988:1;2013:73;2078:7;2069:6;2058:9;2054:22;2013:73;:::i;:::-;2003:83;;1959:137;1734:369;;;;:::o;2109:118::-;2196:24;2214:5;2196:24;:::i;:::-;2191:3;2184:37;2109:118;;:::o;2233:222::-;2326:4;2364:2;2353:9;2349:18;2341:26;;2377:71;2445:1;2434:9;2430:17;2421:6;2377:71;:::i;:::-;2233:222;;;;:::o;2461:77::-;2498:7;2527:5;2516:16;;2461:77;;;:::o;2544:118::-;2631:24;2649:5;2631:24;:::i;:::-;2626:3;2619:37;2544:118;;:::o;2668:222::-;2761:4;2799:2;2788:9;2784:18;2776:26;;2812:71;2880:1;2869:9;2865:17;2856:6;2812:71;:::i;:::-;2668:222;;;;:::o;2896:122::-;2969:24;2987:5;2969:24;:::i;:::-;2962:5;2959:35;2949:63;;3008:1;3005;2998:12;2949:63;2896:122;:::o;3024:139::-;3070:5;3108:6;3095:20;3086:29;;3124:33;3151:5;3124:33;:::i;:::-;3024:139;;;;:::o;3169:514::-;3257:6;3265;3314:2;3302:9;3293:7;3289:23;3285:32;3282:119;;;3320:79;;:::i;:::-;3282:119;3440:1;3465:73;3530:7;3521:6;3510:9;3506:22;3465:73;:::i;:::-;3455:83;;3411:137;3587:2;3613:53;3658:7;3649:6;3638:9;3634:22;3613:53;:::i;:::-;3603:63;;3558:118;3169:514;;;;;:::o;3689:117::-;3798:1;3795;3788:12;3812:117;3921:1;3918;3911:12;3935:117;4044:1;4041;4034:12;4075:568;4148:8;4158:6;4208:3;4201:4;4193:6;4189:17;4185:27;4175:122;;4216:79;;:::i;:::-;4175:122;4329:6;4316:20;4306:30;;4359:18;4351:6;4348:30;4345:117;;;4381:79;;:::i;:::-;4345:117;4495:4;4487:6;4483:17;4471:29;;4549:3;4541:4;4533:6;4529:17;4519:8;4515:32;4512:41;4509:128;;;4556:79;;:::i;:::-;4509:128;4075:568;;;;;:::o;4649:934::-;4771:6;4779;4787;4795;4844:2;4832:9;4823:7;4819:23;4815:32;4812:119;;;4850:79;;:::i;:::-;4812:119;4998:1;4987:9;4983:17;4970:31;5028:18;5020:6;5017:30;5014:117;;;5050:79;;:::i;:::-;5014:117;5163:80;5235:7;5226:6;5215:9;5211:22;5163:80;:::i;:::-;5145:98;;;;4941:312;5320:2;5309:9;5305:18;5292:32;5351:18;5343:6;5340:30;5337:117;;;5373:79;;:::i;:::-;5337:117;5486:80;5558:7;5549:6;5538:9;5534:22;5486:80;:::i;:::-;5468:98;;;;5263:313;4649:934;;;;;;;:::o;5589:122::-;5662:24;5680:5;5662:24;:::i;:::-;5655:5;5652:35;5642:63;;5701:1;5698;5691:12;5642:63;5589:122;:::o;5717:139::-;5763:5;5801:6;5788:20;5779:29;;5817:33;5844:5;5817:33;:::i;:::-;5717:139;;;;:::o;5862:659::-;5959:6;5967;5975;6024:2;6012:9;6003:7;5999:23;5995:32;5992:119;;;6030:79;;:::i;:::-;5992:119;6150:1;6175:73;6240:7;6231:6;6220:9;6216:22;6175:73;:::i;:::-;6165:83;;6121:137;6297:2;6323:53;6368:7;6359:6;6348:9;6344:22;6323:53;:::i;:::-;6313:63;;6268:118;6425:2;6451:53;6496:7;6487:6;6476:9;6472:22;6451:53;:::i;:::-;6441:63;;6396:118;5862:659;;;;;:::o;6527:514::-;6615:6;6623;6672:2;6660:9;6651:7;6647:23;6643:32;6640:119;;;6678:79;;:::i;:::-;6640:119;6798:1;6823:73;6888:7;6879:6;6868:9;6864:22;6823:73;:::i;:::-;6813:83;;6769:137;6945:2;6971:53;7016:7;7007:6;6996:9;6992:22;6971:53;:::i;:::-;6961:63;;6916:118;6527:514;;;;;:::o;7047:329::-;7106:6;7155:2;7143:9;7134:7;7130:23;7126:32;7123:119;;;7161:79;;:::i;:::-;7123:119;7281:1;7306:53;7351:7;7342:6;7331:9;7327:22;7306:53;:::i;:::-;7296:63;;7252:117;7047:329;;;;:::o;7382:90::-;7416:7;7459:5;7452:13;7445:21;7434:32;;7382:90;;;:::o;7478:109::-;7559:21;7574:5;7559:21;:::i;:::-;7554:3;7547:34;7478:109;;:::o;7593:210::-;7680:4;7718:2;7707:9;7703:18;7695:26;;7731:65;7793:1;7782:9;7778:17;7769:6;7731:65;:::i;:::-;7593:210;;;;:::o;7809:169::-;7893:11;7927:6;7922:3;7915:19;7967:4;7962:3;7958:14;7943:29;;7809:169;;;;:::o;7984:174::-;8124:26;8120:1;8112:6;8108:14;8101:50;7984:174;:::o;8164:366::-;8306:3;8327:67;8391:2;8386:3;8327:67;:::i;:::-;8320:74;;8403:93;8492:3;8403:93;:::i;:::-;8521:2;8516:3;8512:12;8505:19;;8164:366;;;:::o;8536:419::-;8702:4;8740:2;8729:9;8725:18;8717:26;;8789:9;8783:4;8779:20;8775:1;8764:9;8760:17;8753:47;8817:131;8943:4;8817:131;:::i;:::-;8809:139;;8536:419;;;:::o;8961:118::-;9048:24;9066:5;9048:24;:::i;:::-;9043:3;9036:37;8961:118;;:::o;9085:332::-;9206:4;9244:2;9233:9;9229:18;9221:26;;9257:71;9325:1;9314:9;9310:17;9301:6;9257:71;:::i;:::-;9338:72;9406:2;9395:9;9391:18;9382:6;9338:72;:::i;:::-;9085:332;;;;;:::o;9423:181::-;9563:33;9559:1;9551:6;9547:14;9540:57;9423:181;:::o;9610:366::-;9752:3;9773:67;9837:2;9832:3;9773:67;:::i;:::-;9766:74;;9849:93;9938:3;9849:93;:::i;:::-;9967:2;9962:3;9958:12;9951:19;;9610:366;;;:::o;9982:419::-;10148:4;10186:2;10175:9;10171:18;10163:26;;10235:9;10229:4;10225:20;10221:1;10210:9;10206:17;10199:47;10263:131;10389:4;10263:131;:::i;:::-;10255:139;;9982:419;;;:::o;10407:222::-;10500:4;10538:2;10527:9;10523:18;10515:26;;10551:71;10619:1;10608:9;10604:17;10595:6;10551:71;:::i;:::-;10407:222;;;;:::o;10635:178::-;10775:30;10771:1;10763:6;10759:14;10752:54;10635:178;:::o;10819:366::-;10961:3;10982:67;11046:2;11041:3;10982:67;:::i;:::-;10975:74;;11058:93;11147:3;11058:93;:::i;:::-;11176:2;11171:3;11167:12;11160:19;;10819:366;;;:::o;11191:419::-;11357:4;11395:2;11384:9;11380:18;11372:26;;11444:9;11438:4;11434:20;11430:1;11419:9;11415:17;11408:47;11472:131;11598:4;11472:131;:::i;:::-;11464:139;;11191:419;;;:::o;11616:442::-;11765:4;11803:2;11792:9;11788:18;11780:26;;11816:71;11884:1;11873:9;11869:17;11860:6;11816:71;:::i;:::-;11897:72;11965:2;11954:9;11950:18;11941:6;11897:72;:::i;:::-;11979;12047:2;12036:9;12032:18;12023:6;11979:72;:::i;:::-;11616:442;;;;;;:::o;12064:223::-;12204:34;12200:1;12192:6;12188:14;12181:58;12273:6;12268:2;12260:6;12256:15;12249:31;12064:223;:::o;12293:366::-;12435:3;12456:67;12520:2;12515:3;12456:67;:::i;:::-;12449:74;;12532:93;12621:3;12532:93;:::i;:::-;12650:2;12645:3;12641:12;12634:19;;12293:366;;;:::o;12665:419::-;12831:4;12869:2;12858:9;12854:18;12846:26;;12918:9;12912:4;12908:20;12904:1;12893:9;12889:17;12882:47;12946:131;13072:4;12946:131;:::i;:::-;12938:139;;12665:419;;;:::o;13090:553::-;13267:4;13305:3;13294:9;13290:19;13282:27;;13319:71;13387:1;13376:9;13372:17;13363:6;13319:71;:::i;:::-;13400:72;13468:2;13457:9;13453:18;13444:6;13400:72;:::i;:::-;13482;13550:2;13539:9;13535:18;13526:6;13482:72;:::i;:::-;13564;13632:2;13621:9;13617:18;13608:6;13564:72;:::i;:::-;13090:553;;;;;;;:::o;13649:228::-;13789:34;13785:1;13777:6;13773:14;13766:58;13858:11;13853:2;13845:6;13841:15;13834:36;13649:228;:::o;13883:366::-;14025:3;14046:67;14110:2;14105:3;14046:67;:::i;:::-;14039:74;;14122:93;14211:3;14122:93;:::i;:::-;14240:2;14235:3;14231:12;14224:19;;13883:366;;;:::o;14255:419::-;14421:4;14459:2;14448:9;14444:18;14436:26;;14508:9;14502:4;14498:20;14494:1;14483:9;14479:17;14472:47;14536:131;14662:4;14536:131;:::i;:::-;14528:139;;14255:419;;;:::o;14680:184::-;14779:11;14813:6;14808:3;14801:19;14853:4;14848:3;14844:14;14829:29;;14680:184;;;;:::o;14870:102::-;14939:4;14962:3;14954:11;;14870:102;;;:::o;14978:108::-;15055:24;15073:5;15055:24;:::i;:::-;15050:3;15043:37;14978:108;;:::o;15092:179::-;15161:10;15182:46;15224:3;15216:6;15182:46;:::i;:::-;15260:4;15255:3;15251:14;15237:28;;15092:179;;;;:::o;15277:122::-;15329:5;15354:39;15389:2;15384:3;15380:12;15375:3;15354:39;:::i;:::-;15345:48;;15277:122;;;;:::o;15405:115::-;15477:4;15509;15504:3;15500:14;15492:22;;15405:115;;;:::o;15556:699::-;15685:3;15708:86;15787:6;15782:3;15708:86;:::i;:::-;15701:93;;15818:58;15870:5;15818:58;:::i;:::-;15899:7;15930:1;15915:315;15940:6;15937:1;15934:13;15915:315;;;16010:42;16045:6;16036:7;16010:42;:::i;:::-;16072:63;16131:3;16116:13;16072:63;:::i;:::-;16065:70;;16158:62;16213:6;16158:62;:::i;:::-;16148:72;;15975:255;15962:1;15959;15955:9;15950:14;;15915:315;;;15919:14;16246:3;16239:10;;15690:565;;15556:699;;;;;:::o;16261:895::-;16558:4;16596:3;16585:9;16581:19;16573:27;;16610:71;16678:1;16667:9;16663:17;16654:6;16610:71;:::i;:::-;16691:72;16759:2;16748:9;16744:18;16735:6;16691:72;:::i;:::-;16810:9;16804:4;16800:20;16795:2;16784:9;16780:18;16773:48;16838:118;16951:4;16942:6;16934;16838:118;:::i;:::-;16830:126;;17003:9;16997:4;16993:20;16988:2;16977:9;16973:18;16966:48;17031:118;17144:4;17135:6;17127;17031:118;:::i;:::-;17023:126;;16261:895;;;;;;;;;:::o;17162:171::-;17302:23;17298:1;17290:6;17286:14;17279:47;17162:171;:::o;17339:366::-;17481:3;17502:67;17566:2;17561:3;17502:67;:::i;:::-;17495:74;;17578:93;17667:3;17578:93;:::i;:::-;17696:2;17691:3;17687:12;17680:19;;17339:366;;;:::o;17711:419::-;17877:4;17915:2;17904:9;17900:18;17892:26;;17964:9;17958:4;17954:20;17950:1;17939:9;17935:17;17928:47;17992:131;18118:4;17992:131;:::i;:::-;17984:139;;17711:419;;;:::o;18136:664::-;18341:4;18379:3;18368:9;18364:19;18356:27;;18393:71;18461:1;18450:9;18446:17;18437:6;18393:71;:::i;:::-;18474:72;18542:2;18531:9;18527:18;18518:6;18474:72;:::i;:::-;18556;18624:2;18613:9;18609:18;18600:6;18556:72;:::i;:::-;18638;18706:2;18695:9;18691:18;18682:6;18638:72;:::i;:::-;18720:73;18788:3;18777:9;18773:19;18764:6;18720:73;:::i;:::-;18136:664;;;;;;;;:::o;18806:180::-;18854:77;18851:1;18844:88;18951:4;18948:1;18941:15;18975:4;18972:1;18965:15;18992:191;19032:3;19051:20;19069:1;19051:20;:::i;:::-;19046:25;;19085:20;19103:1;19085:20;:::i;:::-;19080:25;;19128:1;19125;19121:9;19114:16;;19149:3;19146:1;19143:10;19140:36;;;19156:18;;:::i;:::-;19140:36;18992:191;;;;:::o;19189:175::-;19329:27;19325:1;19317:6;19313:14;19306:51;19189:175;:::o;19370:366::-;19512:3;19533:67;19597:2;19592:3;19533:67;:::i;:::-;19526:74;;19609:93;19698:3;19609:93;:::i;:::-;19727:2;19722:3;19718:12;19711:19;;19370:366;;;:::o;19742:419::-;19908:4;19946:2;19935:9;19931:18;19923:26;;19995:9;19989:4;19985:20;19981:1;19970:9;19966:17;19959:47;20023:131;20149:4;20023:131;:::i;:::-;20015:139;;19742:419;;;:::o;20167:221::-;20307:34;20303:1;20295:6;20291:14;20284:58;20376:4;20371:2;20363:6;20359:15;20352:29;20167:221;:::o;20394:366::-;20536:3;20557:67;20621:2;20616:3;20557:67;:::i;:::-;20550:74;;20633:93;20722:3;20633:93;:::i;:::-;20751:2;20746:3;20742:12;20735:19;;20394:366;;;:::o;20766:419::-;20932:4;20970:2;20959:9;20955:18;20947:26;;21019:9;21013:4;21009:20;21005:1;20994:9;20990:17;20983:47;21047:131;21173:4;21047:131;:::i;:::-;21039:139;;20766:419;;;:::o;21191:180::-;21239:77;21236:1;21229:88;21336:4;21333:1;21326:15;21360:4;21357:1;21350:15;21377:180;21517:32;21513:1;21505:6;21501:14;21494:56;21377:180;:::o;21563:366::-;21705:3;21726:67;21790:2;21785:3;21726:67;:::i;:::-;21719:74;;21802:93;21891:3;21802:93;:::i;:::-;21920:2;21915:3;21911:12;21904:19;;21563:366;;;:::o;21935:419::-;22101:4;22139:2;22128:9;22124:18;22116:26;;22188:9;22182:4;22178:20;22174:1;22163:9;22159:17;22152:47;22216:131;22342:4;22216:131;:::i;:::-;22208:139;;21935:419;;;:::o;22360:172::-;22500:24;22496:1;22488:6;22484:14;22477:48;22360:172;:::o;22538:366::-;22680:3;22701:67;22765:2;22760:3;22701:67;:::i;:::-;22694:74;;22777:93;22866:3;22777:93;:::i;:::-;22895:2;22890:3;22886:12;22879:19;;22538:366;;;:::o;22910:419::-;23076:4;23114:2;23103:9;23099:18;23091:26;;23163:9;23157:4;23153:20;23149:1;23138:9;23134:17;23127:47;23191:131;23317:4;23191:131;:::i;:::-;23183:139;;22910:419;;;:::o;23335:553::-;23512:4;23550:3;23539:9;23535:19;23527:27;;23564:71;23632:1;23621:9;23617:17;23608:6;23564:71;:::i;:::-;23645:72;23713:2;23702:9;23698:18;23689:6;23645:72;:::i;:::-;23727;23795:2;23784:9;23780:18;23771:6;23727:72;:::i;:::-;23809;23877:2;23866:9;23862:18;23853:6;23809:72;:::i;:::-;23335:553;;;;;;;:::o;23894:180::-;24034:32;24030:1;24022:6;24018:14;24011:56;23894:180;:::o;24080:366::-;24222:3;24243:67;24307:2;24302:3;24243:67;:::i;:::-;24236:74;;24319:93;24408:3;24319:93;:::i;:::-;24437:2;24432:3;24428:12;24421:19;;24080:366;;;:::o;24452:419::-;24618:4;24656:2;24645:9;24641:18;24633:26;;24705:9;24699:4;24695:20;24691:1;24680:9;24676:17;24669:47;24733:131;24859:4;24733:131;:::i;:::-;24725:139;;24452:419;;;:::o;24877:178::-;25017:30;25013:1;25005:6;25001:14;24994:54;24877:178;:::o;25061:366::-;25203:3;25224:67;25288:2;25283:3;25224:67;:::i;:::-;25217:74;;25300:93;25389:3;25300:93;:::i;:::-;25418:2;25413:3;25409:12;25402:19;;25061:366;;;:::o;25433:419::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:174::-;25998:26;25994:1;25986:6;25982:14;25975:50;25858:174;:::o;26038:366::-;26180:3;26201:67;26265:2;26260:3;26201:67;:::i;:::-;26194:74;;26277:93;26366:3;26277:93;:::i;:::-;26395:2;26390:3;26386:12;26379:19;;26038:366;;;:::o;26410:419::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26663:9;26657:4;26653:20;26649:1;26638:9;26634:17;26627:47;26691:131;26817:4;26691:131;:::i;:::-;26683:139;;26410:419;;;:::o;26835:176::-;26975:28;26971:1;26963:6;26959:14;26952:52;26835:176;:::o;27017:366::-;27159:3;27180:67;27244:2;27239:3;27180:67;:::i;:::-;27173:74;;27256:93;27345:3;27256:93;:::i;:::-;27374:2;27369:3;27365:12;27358:19;;27017:366;;;:::o;27389:419::-;27555:4;27593:2;27582:9;27578:18;27570:26;;27642:9;27636:4;27632:20;27628:1;27617:9;27613:17;27606:47;27670:131;27796:4;27670:131;:::i;:::-;27662:139;;27389:419;;;:::o;27814:180::-;27954:32;27950:1;27942:6;27938:14;27931:56;27814:180;:::o;28000:366::-;28142:3;28163:67;28227:2;28222:3;28163:67;:::i;:::-;28156:74;;28239:93;28328:3;28239:93;:::i;:::-;28357:2;28352:3;28348:12;28341:19;;28000:366;;;:::o;28372:419::-;28538:4;28576:2;28565:9;28561:18;28553:26;;28625:9;28619:4;28615:20;28611:1;28600:9;28596:17;28589:47;28653:131;28779:4;28653:131;:::i;:::-;28645:139;;28372:419;;;:::o;28797:170::-;28937:22;28933:1;28925:6;28921:14;28914:46;28797:170;:::o;28973:366::-;29115:3;29136:67;29200:2;29195:3;29136:67;:::i;:::-;29129:74;;29212:93;29301:3;29212:93;:::i;:::-;29330:2;29325:3;29321:12;29314:19;;28973:366;;;:::o;29345:419::-;29511:4;29549:2;29538:9;29534:18;29526:26;;29598:9;29592:4;29588:20;29584:1;29573:9;29569:17;29562:47;29626:131;29752:4;29626:131;:::i;:::-;29618:139;;29345:419;;;:::o;29770:168::-;29910:20;29906:1;29898:6;29894:14;29887:44;29770:168;:::o;29944:366::-;30086:3;30107:67;30171:2;30166:3;30107:67;:::i;:::-;30100:74;;30183:93;30272:3;30183:93;:::i;:::-;30301:2;30296:3;30292:12;30285:19;;29944:366;;;:::o;30316:419::-;30482:4;30520:2;30509:9;30505:18;30497:26;;30569:9;30563:4;30559:20;30555:1;30544:9;30540:17;30533:47;30597:131;30723:4;30597:131;:::i;:::-;30589:139;;30316:419;;;:::o;30741:175::-;30881:27;30877:1;30869:6;30865:14;30858:51;30741:175;:::o;30922:366::-;31064:3;31085:67;31149:2;31144:3;31085:67;:::i;:::-;31078:74;;31161:93;31250:3;31161:93;:::i;:::-;31279:2;31274:3;31270:12;31263:19;;30922:366;;;:::o;31294:419::-;31460:4;31498:2;31487:9;31483:18;31475:26;;31547:9;31541:4;31537:20;31533:1;31522:9;31518:17;31511:47;31575:131;31701:4;31575:131;:::i;:::-;31567:139;;31294:419;;;:::o;31719:231::-;31859:34;31855:1;31847:6;31843:14;31836:58;31928:14;31923:2;31915:6;31911:15;31904:39;31719:231;:::o;31956:366::-;32098:3;32119:67;32183:2;32178:3;32119:67;:::i;:::-;32112:74;;32195:93;32284:3;32195:93;:::i;:::-;32313:2;32308:3;32304:12;32297:19;;31956:366;;;:::o;32328:419::-;32494:4;32532:2;32521:9;32517:18;32509:26;;32581:9;32575:4;32571:20;32567:1;32556:9;32552:17;32545:47;32609:131;32735:4;32609:131;:::i;:::-;32601:139;;32328:419;;;:::o;32753:169::-;32893:21;32889:1;32881:6;32877:14;32870:45;32753:169;:::o;32928:366::-;33070:3;33091:67;33155:2;33150:3;33091:67;:::i;:::-;33084:74;;33167:93;33256:3;33167:93;:::i;:::-;33285:2;33280:3;33276:12;33269:19;;32928:366;;;:::o;33300:419::-;33466:4;33504:2;33493:9;33489:18;33481:26;;33553:9;33547:4;33543:20;33539:1;33528:9;33524:17;33517:47;33581:131;33707:4;33581:131;:::i;:::-;33573:139;;33300:419;;;:::o;33725:182::-;33865:34;33861:1;33853:6;33849:14;33842:58;33725:182;:::o;33913:366::-;34055:3;34076:67;34140:2;34135:3;34076:67;:::i;:::-;34069:74;;34152:93;34241:3;34152:93;:::i;:::-;34270:2;34265:3;34261:12;34254:19;;33913:366;;;:::o;34285:419::-;34451:4;34489:2;34478:9;34474:18;34466:26;;34538:9;34532:4;34528:20;34524:1;34513:9;34509:17;34502:47;34566:131;34692:4;34566:131;:::i;:::-;34558:139;;34285:419;;;:::o;34710:233::-;34749:3;34772:24;34790:5;34772:24;:::i;:::-;34763:33;;34818:66;34811:5;34808:77;34805:103;;34888:18;;:::i;:::-;34805:103;34935:1;34928:5;34924:13;34917:20;;34710:233;;;:::o;34949:194::-;34989:4;35009:20;35027:1;35009:20;:::i;:::-;35004:25;;35043:20;35061:1;35043:20;:::i;:::-;35038:25;;35087:1;35084;35080:9;35072:17;;35111:1;35105:4;35102:11;35099:37;;;35116:18;;:::i;:::-;35099:37;34949:194;;;;:::o;35149:332::-;35270:4;35308:2;35297:9;35293:18;35285:26;;35321:71;35389:1;35378:9;35374:17;35365:6;35321:71;:::i;:::-;35402:72;35470:2;35459:9;35455:18;35446:6;35402:72;:::i;:::-;35149:332;;;;;:::o;35487:180::-;35535:77;35532:1;35525:88;35632:4;35629:1;35622:15;35656:4;35653:1;35646:15;35673:234;35813:34;35809:1;35801:6;35797:14;35790:58;35882:17;35877:2;35869:6;35865:15;35858:42;35673:234;:::o;35913:366::-;36055:3;36076:67;36140:2;36135:3;36076:67;:::i;:::-;36069:74;;36152:93;36241:3;36152:93;:::i;:::-;36270:2;36265:3;36261:12;36254:19;;35913:366;;;:::o;36285:419::-;36451:4;36489:2;36478:9;36474:18;36466:26;;36538:9;36532:4;36528:20;36524:1;36513:9;36509:17;36502:47;36566:131;36692:4;36566:131;:::i;:::-;36558:139;;36285:419;;;:::o;36710:225::-;36850:34;36846:1;36838:6;36834:14;36827:58;36919:8;36914:2;36906:6;36902:15;36895:33;36710:225;:::o;36941:366::-;37083:3;37104:67;37168:2;37163:3;37104:67;:::i;:::-;37097:74;;37180:93;37269:3;37180:93;:::i;:::-;37298:2;37293:3;37289:12;37282:19;;36941:366;;;:::o;37313:419::-;37479:4;37517:2;37506:9;37502:18;37494:26;;37566:9;37560:4;37556:20;37552:1;37541:9;37537:17;37530:47;37594:131;37720:4;37594:131;:::i;:::-;37586:139;;37313:419;;;:::o

Swarm Source

ipfs://cc52973225e45397eeaaef16354125b0e5bea0b336c2a67508be38094068b070

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.