ETH Price: $2,287.04 (+0.45%)

Token

GLICPIXXXVER001 - PROGRAMMABLE CANVAS (GLICPIXXXVER001)
 

Overview

Max Total Supply

15 GLICPIXXXVER001

Holders

10

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 GLICPIXXXVER001
0x63009AE2Bad374C3aDACa32c220F704581363aF4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

GLICPIXXX IS LOVE, GLICPIXXX IS LIFE. THIS COLLECTION CONSISTS OF 36 GLIC ENCODED IMAGES, AND A PROGRAMMABLE CANVAS WHICH CAN BE CHANGED BY LAYER HOLDERS.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GLICPIXXXVER001

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-10
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}



// File: @openzeppelin/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File: @openzeppelin/contracts/utils/Address.sol


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}




// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */


pragma solidity ^0.8.0;
/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

}

// File: GLICPIXXXVER001.sol

pragma solidity ^0.8.0;

interface openseaBullshit {
    function balanceOf(address account, uint256 id) external returns (uint256); 
    function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes memory _data) external;
}


/**

 GGG  L    III  CCC PPPP  III X   X X   X X   X V     V EEEE RRRR   000   000   11  
G     L     I  C    P   P  I   X X   X X   X X  V     V E    R   R 0  00 0  00 111  
G  GG L     I  C    PPPP   I    X     X     X    V   V  EEE  RRRR  0 0 0 0 0 0  11  
G   G L     I  C    P      I   X X   X X   X X    V V   E    R R   00  0 00  0  11  
 GGG  LLLL III  CCC P     III X   X X   X X   X    V    EEEE R  RR  000   000  11l1 

*/

 // made by Berk - berkozdemir.com - @berkozdemir

 // help with programmable art / technical stuff by - @memorycollect0r

 // this contract migrates GLICPIXXXVER001 NFTs from OPENSEA STOREFRONT, and also works as a programmable art piece. All 36 tokens have parameters which holders can modify the change the state of programmable canvas.
 
 

contract GLICPIXXXVER001 is ERC721Enumerable, Ownable, IERC1155Receiver {
    
	string public _baseTokenURI;
	string public amazingCanvasCode;
	
	string public constant glicpixFolderIPFS = "QmYumvDNGyiN2MyPQcNBaU7hnesmwJitvqipyN2H3fF2tk";
	string public constant glicpixImagesBase64IPFS = "QmZz3VUi72zpEinivczPPUWVpaWYeSKoz8oKcAupw9PUUG";
		
	// TO MIGRATE FROM OPENSEA STOREFRONT	
    address public constant openseaStorefrontContract = 0x495f947276749Ce646f68AC8c248420045cb7b5e;

	mapping (uint => uint) public idToOpenseaId;

		// ROTATE YOUR GLICPIX IN CANVAS
	
	enum Rotation {
	DEG0,
	DEG90,
	DEG180,
	DEG270
    }
    
    // FLIP YOUR GLICPIX IN CANVAS
    
    enum Flip {
	NOFLIP,
	FLIPX,
	FLIPY,
	FLIPXY
    }
    
    // LOCATION SWAP OFFERS mapping
    
    mapping (uint8 => mapping(uint8 => SwapOffer) ) public SwapOffers;
    
    // PROGRAMMABLE ART PARAMETERS
    
    mapping (uint8 => Rotation) public RotationList;
    mapping (uint8 => Flip) public FlipList;
    mapping (uint8 => uint8) public idToLocationOnCanvas;
    
    // REQUESTER IS HOLD IN CASE SOMEONE TRANSFERS THEIR GLICPIX AND FORGETS TO DEACTIVATE THEIR SWAP OFFER
    
    struct SwapOffer {
    	address requester;
    	bool isActive;
    }

    struct swapOfferShowcase {
    	address requester; 
    	uint8 id;
    }
    
    struct LayerStatus {
        Flip flip;
        Rotation rotation;
        uint8 location;
    }

    // COOLIO EVENTS
    
    event RotationChange(uint8 _id, Rotation _rotation);
    event FlipChange(uint8 _id, Flip _flip);
    event CanvasOrderChange(uint8 tokenA, uint8 aNewLoc, uint8 tokenB, uint8 bNewLoc);
    
    event SwapOfferMade(uint8 tokenA, uint8 tokenB);
    event SwapOfferCanceled(uint8 tokenA, uint8 tokenB);
    event SwapOfferAccepted(uint8 tokenA, uint8 tokenB);

    constructor() ERC721("GLICPIXXXVER001 - PROGRAMMABLE CANVAS", "GLICPIXXXVER001")  {
        
        for (uint8 i = 1; i < 37; i++) {
            idToLocationOnCanvas[i] = i;
        } 
        
        _safeMint(owner(), 0);
        
        idToOpenseaId[1] =	89502295366922500116793596804463892406027145793870087151951406456662956965889;
        idToOpenseaId[2] =	89502295366922500116793596804463892406027145793870087151951406457762468593665;
        idToOpenseaId[3] =	89502295366922500116793596804463892406027145793870087151951406458861980221441;
        idToOpenseaId[4] =	89502295366922500116793596804463892406027145793870087151951406461061003476993;
        idToOpenseaId[5] =	89502295366922500116793596804463892406027145793870087151951406459961491849217;
        idToOpenseaId[6] =	89502295366922500116793596804463892406027145793870087151951406462160515104769;
        idToOpenseaId[7] =	89502295366922500116793596804463892406027145793870087151951406463260026732545;
        idToOpenseaId[8] =	89502295366922500116793596804463892406027145793870087151951406464359538360321;
        idToOpenseaId[9] =	89502295366922500116793596804463892406027145793870087151951406465459049988097;
        idToOpenseaId[10] =	89502295366922500116793596804463892406027145793870087151951406466558561615873;
        idToOpenseaId[11] =	89502295366922500116793596804463892406027145793870087151951406467658073243649;
        idToOpenseaId[12] =	89502295366922500116793596804463892406027145793870087151951406468757584871425;
        idToOpenseaId[13] =	89502295366922500116793596804463892406027145793870087151951406469857096499201;
        idToOpenseaId[14] =	89502295366922500116793596804463892406027145793870087151951406470956608126977;
        idToOpenseaId[15] =	89502295366922500116793596804463892406027145793870087151951406472056119754753;
        idToOpenseaId[16] =	89502295366922500116793596804463892406027145793870087151951406473155631382529;
        idToOpenseaId[17] =	89502295366922500116793596804463892406027145793870087151951406474255143010305;
        idToOpenseaId[18] =	89502295366922500116793596804463892406027145793870087151951406475354654638081;
        idToOpenseaId[19] =	89502295366922500116793596804463892406027145793870087151951406476454166265857;
        idToOpenseaId[20] =	89502295366922500116793596804463892406027145793870087151951406477553677893633;
        idToOpenseaId[21] =	89502295366922500116793596804463892406027145793870087151951406495145863938049;
        idToOpenseaId[22] =	89502295366922500116793596804463892406027145793870087151951406478653189521409;
        idToOpenseaId[23] =	89502295366922500116793596804463892406027145793870087151951406479752701149185;
        idToOpenseaId[24] =	89502295366922500116793596804463892406027145793870087151951406480852212776961;
        idToOpenseaId[25] =	89502295366922500116793596804463892406027145793870087151951406481951724404737;
        idToOpenseaId[26] =	89502295366922500116793596804463892406027145793870087151951406483051236032513;
        idToOpenseaId[27] =	89502295366922500116793596804463892406027145793870087151951406484150747660289;
        idToOpenseaId[28] =	89502295366922500116793596804463892406027145793870087151951406485250259288065;
        idToOpenseaId[29] =	89502295366922500116793596804463892406027145793870087151951406486349770915841;
        idToOpenseaId[30] =	89502295366922500116793596804463892406027145793870087151951406487449282543617;
        idToOpenseaId[31] =	89502295366922500116793596804463892406027145793870087151951406488548794171393;
        idToOpenseaId[32] =	89502295366922500116793596804463892406027145793870087151951406489648305799169;
        idToOpenseaId[33] =	89502295366922500116793596804463892406027145793870087151951406490747817426945;
        idToOpenseaId[34] =	89502295366922500116793596804463892406027145793870087151951406491847329054721;
        idToOpenseaId[35] =	89502295366922500116793596804463892406027145793870087151951406492946840682497;
        idToOpenseaId[36] =	89502295366922500116793596804463892406027145793870087151951406494046352310273;
        
    }
   
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }
    
    function migrateGLICPIXV1(uint _id) public {
        require(_id > 0 && _id < 37, "WRONG GLICPIX NUMBER");
        require( openseaBullshit(openseaStorefrontContract).balanceOf(msg.sender, idToOpenseaId[_id]) == 1, "YOU DON'T OWN THIS GLICPIX");
        openseaBullshit(openseaStorefrontContract).safeTransferFrom(msg.sender, address(this), idToOpenseaId[_id], 1, "");
        _safeMint(msg.sender, _id);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }
 
    function modifyCode(string memory _code) public onlyOwner {    
       amazingCanvasCode = _code;   
    }   
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    
    // PROGRAMMABLE ART, RESULT RENDERS ON #0
    
    
    function showIdToCanvasLocationList() external view returns (uint8[36] memory) {
        
        uint8[36] memory tempcanvasOrder;
        
        for (uint8 i = 1; i < 37; i++) {
            tempcanvasOrder[i - 1] = idToLocationOnCanvas[i];
        }
        
        return tempcanvasOrder;
    }
    
    function showRotationList() external view returns (Rotation[36] memory) {
        
        Rotation[36] memory tempRotationList;
        
        for (uint8 i = 1; i < 37; i++) {
            tempRotationList[i - 1] = RotationList[i];
        }
        
        return tempRotationList;
    }
    
    function showFlipList() external view returns (Flip[36] memory) {
        
        Flip[36] memory tempFlipList;
        
        for (uint8 i = 1; i < 37; i++) {
            tempFlipList[i - 1] = FlipList[i];
        }
        
        return tempFlipList;
    }
    
    function showLayerStatus(uint8 _id) external view returns (LayerStatus memory) {
        
        require(_id > 0 && _id <37 , "PLS ENTER ID BETWEEN 1-36");
        LayerStatus memory layerstatus;
        layerstatus.flip = FlipList[_id];
        layerstatus.rotation = RotationList[_id];
        layerstatus.location = idToLocationOnCanvas[_id];
     
        return(
            layerstatus
        );
        
    }

    function showLayerStatusAll() external view returns(LayerStatus[36] memory) {
        LayerStatus[36] memory tempLayers;      
        for (uint8 i = 1; i < 37; i++) {
            LayerStatus memory layerstatus;
            layerstatus.flip = FlipList[i];
            layerstatus.rotation = RotationList[i];
            layerstatus.location = idToLocationOnCanvas[i];

            tempLayers[i-1] = layerstatus;
        }
        return tempLayers;
    }

    function showOffersOnAToken(uint8 _tokenId) external view returns(swapOfferShowcase[36] memory) {
        require (_tokenId > 0 && _tokenId < 37);
        swapOfferShowcase[36] memory tempOffers;      
        for (uint8 i = 1; i < 37; i++) {
            swapOfferShowcase memory swapoffer;
            SwapOffer memory offer = SwapOffers[_tokenId][i];

            if (offer.isActive && offer.requester == ownerOf(i)) {
                swapoffer.id = i;
                swapoffer.requester = offer.requester;
            } else {
                swapoffer.id = 0;
                swapoffer.requester = address(0);
            }
            
            tempOffers[i - 1] = swapoffer;
            
        }
        return tempOffers;
    }
    
    // YOU CAN OFFER TO SWAP LOCATION OF YOUR GLICPIX WITH ANOTHER
    
    function offerLocationSwap (uint8 yourGPX, uint8 theirGPX) public {
    	require (yourGPX > 0 && yourGPX < 37 && theirGPX > 0 && theirGPX < 37, "PLS ENTER IDS BETWEEN 1-36");
    	require (ownerOf(yourGPX) == msg.sender,"YOU ARE NOT THE OWNER OF THIS GLICPIX GODDAMNIT!");

    	SwapOffers[theirGPX][yourGPX].requester = msg.sender;
    	SwapOffers[theirGPX][yourGPX].isActive = true;
    	
    	emit SwapOfferMade(yourGPX, theirGPX);
    }
    
    
    function cancelOfferLocationSwap (uint8 yourGPX, uint8 theirGPX) public {
    	require (ownerOf(yourGPX) == msg.sender, "U R NOT THE OWNER OF THIS GLICPIX GODDAMNIT!");
    	SwapOffer storage offer = SwapOffers[theirGPX][yourGPX];
        require (offer.requester == msg.sender && offer.isActive);
        offer.isActive = false;
        
        emit SwapOfferCanceled(yourGPX, theirGPX);
    }
    
    
    function acceptLocationSwap (uint8 yourGPX, uint8 theirGPX) public {
    	require (ownerOf(yourGPX) == msg.sender, "U R NOT THE OWNER OF THIS GLICPIX GODDAMNIT!");
    	
    	SwapOffer storage offer = SwapOffers[yourGPX][theirGPX];
    	
    	require(offer.isActive && offer.requester == ownerOf(theirGPX));
        offer.isActive = false;
        
	    uint8 locA = idToLocationOnCanvas[yourGPX];
	    uint8 locB = idToLocationOnCanvas[theirGPX];
	    idToLocationOnCanvas[yourGPX] = locB;
	    idToLocationOnCanvas[theirGPX] = locA;
	    
        emit CanvasOrderChange(yourGPX, locB, theirGPX, locA);
        emit SwapOfferAccepted(yourGPX, theirGPX);
    	
    }
    
    // IF YOU HOLD TWO GLICPIXV1, YOU CAN SWAP THEIR PLACE ANYTIME YOU WANT
    function iOwnTwoGLICPIXYO (uint8 tokenA, uint8 tokenB) public {
    	require (tokenA > 0 && tokenA < 37 && tokenB > 0 && tokenB < 37);    	
    	require (ownerOf(tokenA) == msg.sender && ownerOf(tokenB) == msg.sender);

	    uint8 locA = idToLocationOnCanvas[tokenA];
	    uint8 locB = idToLocationOnCanvas[tokenB];
	    idToLocationOnCanvas[tokenA] = locB;
	    idToLocationOnCanvas[tokenB] = locA;
    	
        emit CanvasOrderChange(tokenA, locB, tokenB, locA);
    }
    
    function rotateGLICPIXinCanvas (uint8 _id, Rotation _rotation) public {
        require (_id > 0 && _id < 37);
     	require(ownerOf(_id) == msg.sender);
    	RotationList[_id] = _rotation;
    	emit RotationChange(_id, _rotation);
    }
    
    function flipGLICPIXinCanvas (uint8 _id, Flip _flip) public {
        require (_id > 0 && _id < 37);
     	require(ownerOf(_id) == msg.sender);
    	FlipList[_id] = _flip;
    	emit FlipChange(_id, _flip);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"tokenA","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"aNewLoc","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"tokenB","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"bNewLoc","type":"uint8"}],"name":"CanvasOrderChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_id","type":"uint8"},{"indexed":false,"internalType":"enum GLICPIXXXVER001.Flip","name":"_flip","type":"uint8"}],"name":"FlipChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_id","type":"uint8"},{"indexed":false,"internalType":"enum GLICPIXXXVER001.Rotation","name":"_rotation","type":"uint8"}],"name":"RotationChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"tokenA","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"tokenB","type":"uint8"}],"name":"SwapOfferAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"tokenA","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"tokenB","type":"uint8"}],"name":"SwapOfferCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"tokenA","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"tokenB","type":"uint8"}],"name":"SwapOfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"FlipList","outputs":[{"internalType":"enum GLICPIXXXVER001.Flip","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"RotationList","outputs":[{"internalType":"enum GLICPIXXXVER001.Rotation","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"SwapOffers","outputs":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"yourGPX","type":"uint8"},{"internalType":"uint8","name":"theirGPX","type":"uint8"}],"name":"acceptLocationSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amazingCanvasCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"yourGPX","type":"uint8"},{"internalType":"uint8","name":"theirGPX","type":"uint8"}],"name":"cancelOfferLocationSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_id","type":"uint8"},{"internalType":"enum GLICPIXXXVER001.Flip","name":"_flip","type":"uint8"}],"name":"flipGLICPIXinCanvas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glicpixFolderIPFS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glicpixImagesBase64IPFS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tokenA","type":"uint8"},{"internalType":"uint8","name":"tokenB","type":"uint8"}],"name":"iOwnTwoGLICPIXYO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"idToLocationOnCanvas","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToOpenseaId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"migrateGLICPIXV1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_code","type":"string"}],"name":"modifyCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"yourGPX","type":"uint8"},{"internalType":"uint8","name":"theirGPX","type":"uint8"}],"name":"offerLocationSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openseaStorefrontContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_id","type":"uint8"},{"internalType":"enum GLICPIXXXVER001.Rotation","name":"_rotation","type":"uint8"}],"name":"rotateGLICPIXinCanvas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showFlipList","outputs":[{"internalType":"enum GLICPIXXXVER001.Flip[36]","name":"","type":"uint8[36]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showIdToCanvasLocationList","outputs":[{"internalType":"uint8[36]","name":"","type":"uint8[36]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_id","type":"uint8"}],"name":"showLayerStatus","outputs":[{"components":[{"internalType":"enum GLICPIXXXVER001.Flip","name":"flip","type":"uint8"},{"internalType":"enum GLICPIXXXVER001.Rotation","name":"rotation","type":"uint8"},{"internalType":"uint8","name":"location","type":"uint8"}],"internalType":"struct GLICPIXXXVER001.LayerStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showLayerStatusAll","outputs":[{"components":[{"internalType":"enum GLICPIXXXVER001.Flip","name":"flip","type":"uint8"},{"internalType":"enum GLICPIXXXVER001.Rotation","name":"rotation","type":"uint8"},{"internalType":"uint8","name":"location","type":"uint8"}],"internalType":"struct GLICPIXXXVER001.LayerStatus[36]","name":"","type":"tuple[36]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tokenId","type":"uint8"}],"name":"showOffersOnAToken","outputs":[{"components":[{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint8","name":"id","type":"uint8"}],"internalType":"struct GLICPIXXXVER001.swapOfferShowcase[36]","name":"","type":"tuple[36]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showRotationList","outputs":[{"internalType":"enum GLICPIXXXVER001.Rotation[36]","name":"","type":"uint8[36]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405180606001604052806025815260200162007a93602591396040518060400160405280600f81526020017f474c49435049585858564552303031000000000000000000000000000000000081525081600090805190602001906200007a9291906200141f565b508060019080519060200190620000939291906200141f565b505050620000b6620000aa6200093f60201b60201c565b6200094760201b60201c565b6000600190505b60258160ff161015620001125780601160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808062000109906200189b565b915050620000bd565b50620001356200012762000a0d60201b60201c565b600062000a3760201b60201c565b7fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000000000000001600d600060018152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000010000000001600d600060028152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000020000000001600d600060038152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000040000000001600d600060048152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000030000000001600d600060058152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000050000000001600d600060068152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000060000000001600d600060078152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000070000000001600d600060088152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000080000000001600d600060098152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000090000000001600d6000600a8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000a0000000001600d6000600b8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000b0000000001600d6000600c8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000c0000000001600d6000600d8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000d0000000001600d6000600e8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000e0000000001600d6000600f8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000000f0000000001600d600060108152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000100000000001600d600060118152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000110000000001600d600060128152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000120000000001600d600060138152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000130000000001600d600060148152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000230000000001600d600060158152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000140000000001600d600060168152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000150000000001600d600060178152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000160000000001600d600060188152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000170000000001600d600060198152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000180000000001600d6000601a8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000190000000001600d6000601b8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001a0000000001600d6000601c8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001b0000000001600d6000601d8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001c0000000001600d6000601e8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001d0000000001600d6000601f8152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001e0000000001600d600060208152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe50000000000001f0000000001600d600060218152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000200000000001600d600060228152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000210000000001600d600060238152602001908152602001600020819055507fc5e08104c19dafd00fe40737490da9552db5bfe5000000000000220000000001600d6000602481526020019081526020016000208190555062001aa6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000a5982826040518060200160405280600081525062000a5d60201b60201c565b5050565b62000a6f838362000acb60201b60201c565b62000a84600084848462000cb160201b60201c565b62000ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000abd906200166b565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b3590620016d1565b60405180910390fd5b62000b4f8162000e6b60201b60201c565b1562000b92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b89906200168d565b60405180910390fd5b62000ba66000838362000ed760201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000bf8919062001720565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600062000cdf8473ffffffffffffffffffffffffffffffffffffffff166200101e60201b62002ac11760201c565b1562000e5e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000d116200093f60201b60201c565b8786866040518563ffffffff1660e01b815260040162000d35949392919062001617565b602060405180830381600087803b15801562000d5057600080fd5b505af192505050801562000d8457506040513d601f19601f8201168201806040525081019062000d819190620014e6565b60015b62000e0d573d806000811462000db7576040519150601f19603f3d011682016040523d82523d6000602084013e62000dbc565b606091505b5060008151141562000e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dfc906200166b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000e63565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000eef8383836200103160201b62002ad41760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000f3c5762000f36816200103660201b60201c565b62000f84565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000f835762000f8283826200107f60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000fd15762000fcb81620011fc60201b60201c565b62001019565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200101857620010178282620012d860201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162001099846200136460201b6200175f1760201c565b620010a591906200177d565b90506000600760008481526020019081526020016000205490508181146200118b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506200121291906200177d565b905060006009600084815260200190815260200160002054905060006008838154811062001245576200124462001957565b5b9060005260206000200154905080600883815481106200126a576200126962001957565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480620012bc57620012bb62001928565b5b6001900381819060005260206000200160009055905550505050565b6000620012f0836200136460201b6200175f1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620013d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013cf90620016af565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8280546200142d9062001865565b90600052602060002090601f0160209004810192826200145157600085556200149d565b82601f106200146c57805160ff19168380011785556200149d565b828001600101855582156200149d579182015b828111156200149c5782518255916020019190600101906200147f565b5b509050620014ac9190620014b0565b5090565b5b80821115620014cb576000816000905550600101620014b1565b5090565b600081519050620014e08162001a8c565b92915050565b600060208284031215620014ff57620014fe62001986565b5b60006200150f84828501620014cf565b91505092915050565b6200152381620017b8565b82525050565b60006200153682620016f3565b620015428185620016fe565b9350620015548185602086016200182f565b6200155f816200198b565b840191505092915050565b6000620015796032836200170f565b915062001586826200199c565b604082019050919050565b6000620015a0601c836200170f565b9150620015ad82620019eb565b602082019050919050565b6000620015c7602a836200170f565b9150620015d48262001a14565b604082019050919050565b6000620015ee6020836200170f565b9150620015fb8262001a63565b602082019050919050565b620016118162001818565b82525050565b60006080820190506200162e600083018762001518565b6200163d602083018662001518565b6200164c604083018562001606565b818103606083015262001660818462001529565b905095945050505050565b6000602082019050818103600083015262001686816200156a565b9050919050565b60006020820190508181036000830152620016a88162001591565b9050919050565b60006020820190508181036000830152620016ca81620015b8565b9050919050565b60006020820190508181036000830152620016ec81620015df565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200172d8262001818565b91506200173a8362001818565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620017725762001771620018ca565b5b828201905092915050565b60006200178a8262001818565b9150620017978362001818565b925082821015620017ad57620017ac620018ca565b5b828203905092915050565b6000620017c582620017f8565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200184f57808201518184015260208101905062001832565b838111156200185f576000848401525b50505050565b600060028204905060018216806200187e57607f821691505b60208210811415620018955762001894620018f9565b5b50919050565b6000620018a88262001822565b915060ff821415620018bf57620018be620018ca565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b62001a9781620017cc565b811462001aa357600080fd5b50565b615fdd8062001ab66000396000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806373a03ee71161015c578063c39596c4116100ce578063e95ae08d11610087578063e95ae08d1461080e578063e985e9c51461082c578063eb3294e81461085c578063f23a6e6114610878578063f2fde38b146108a8578063ffaec402146108c45761028a565b8063c39596c414610736578063c87b56dd14610766578063ccdc415614610796578063cfc86f7b146107b4578063e8454b86146107d2578063e9100884146107f05761028a565b806394d887881161012057806394d887881461068a57806395d89b41146106a6578063a22cb465146106c4578063b103a0a1146106e0578063b88d4fde146106fe578063bdda71021461071a5761028a565b806373a03ee7146105e657806376be49e3146106025780638462151c1461061e5780638da5cb5b1461064e5780638eaa18561461066c5761028a565b80633d861404116102005780635e3b0c17116101b95780635e3b0c17146104ff57806362ee81391461052f5780636352211e1461054b57806370a082311461057b578063715018a6146105ab578063735413ab146105b55761028a565b80633d8614041461042f578063420fe7c31461044b57806342842e0e1461047b5780634f469395146104975780634f6ccce7146104b357806355f804b3146104e35761028a565b806318160ddd1161025257806318160ddd1461035957806323b872dd146103775780632f745c59146103935780633103040d146103c357806333ce7a4d146103f357806334e1bc19146104115761028a565b806301ffc9a71461028f57806306fdde03146102bf578063081812fc146102dd578063095ea7b31461030d578063142d226014610329575b600080fd5b6102a960048036038101906102a49190614173565b6108f4565b6040516102b69190614d65565b60405180910390f35b6102c761096e565b6040516102d49190614dd1565b60405180910390f35b6102f760048036038101906102f29190614216565b610a00565b6040516103049190614ba6565b60405180910390f35b61032760048036038101906103229190614133565b610a85565b005b610343600480360381019061033e9190614270565b610b9d565b6040516103509190614d0b565b60405180910390f35b610361610dd1565b60405161036e919061510e565b60405180910390f35b610391600480360381019061038c9190613f86565b610dde565b005b6103ad60048036038101906103a89190614133565b610e3e565b6040516103ba919061510e565b60405180910390f35b6103dd60048036038101906103d89190614270565b610ee3565b6040516103ea91906150f3565b60405180910390f35b6103fb611035565b6040516104089190614dd1565b60405180910390f35b6104196110c3565b6040516104269190614cef565b60405180910390f35b6104496004803603810190610444919061431d565b611219565b005b61046560048036038101906104609190614270565b6113d8565b6040516104729190614d9b565b60405180910390f35b61049560048036038101906104909190613f86565b6113f8565b005b6104b160048036038101906104ac91906142dd565b611418565b005b6104cd60048036038101906104c89190614216565b6114f8565b6040516104da919061510e565b60405180910390f35b6104fd60048036038101906104f891906141cd565b611569565b005b61051960048036038101906105149190614216565b6115ff565b604051610526919061510e565b60405180910390f35b610549600480360381019061054491906141cd565b611617565b005b61056560048036038101906105609190614216565b6116ad565b6040516105729190614ba6565b60405180910390f35b61059560048036038101906105909190613f19565b61175f565b6040516105a2919061510e565b60405180910390f35b6105b3611817565b005b6105cf60048036038101906105ca919061431d565b61189f565b6040516105dd929190614c65565b60405180910390f35b61060060048036038101906105fb919061429d565b6118fd565b005b61061c6004803603810190610617919061431d565b6119dd565b005b61063860048036038101906106339190613f19565b611c5f565b6040516106459190614d27565b60405180910390f35b610656611d69565b6040516106639190614ba6565b60405180910390f35b610674611d93565b6040516106819190614dd1565b60405180910390f35b6106a4600480360381019061069f9190614216565b611daf565b005b6106ae611f99565b6040516106bb9190614dd1565b60405180910390f35b6106de60048036038101906106d991906140f3565b61202b565b005b6106e86121ac565b6040516106f59190614ba6565b60405180910390f35b61071860048036038101906107139190613fd9565b6121c4565b005b610734600480360381019061072f919061431d565b612226565b005b610750600480360381019061074b9190614270565b61240d565b60405161075d9190614db6565b60405180910390f35b610780600480360381019061077b9190614216565b61242d565b60405161078d9190614dd1565b60405180910390f35b61079e6124d4565b6040516107ab9190614cb7565b60405180910390f35b6107bc61258a565b6040516107c99190614dd1565b60405180910390f35b6107da612618565b6040516107e79190614d49565b60405180910390f35b6107f86126b0565b6040516108059190614dd1565b60405180910390f35b6108166126cc565b6040516108239190614cd3565b60405180910390f35b61084660048036038101906108419190613f46565b612782565b6040516108539190614d65565b60405180910390f35b6108766004803603810190610871919061431d565b612816565b005b610892600480360381019061088d919061405c565b612994565b60405161089f9190614d80565b60405180910390f35b6108c260048036038101906108bd9190613f19565b6129a9565b005b6108de60048036038101906108d99190614270565b612aa1565b6040516108eb9190615129565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610967575061096682612ad9565b5b9050919050565b60606000805461097d906155e0565b80601f01602080910402602001604051908101604052809291908181526020018280546109a9906155e0565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b82612bbb565b610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190614fd3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a90826116ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890615073565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b20612c27565b73ffffffffffffffffffffffffffffffffffffffff161480610b4f5750610b4e81610b49612c27565b612782565b5b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590614f53565b60405180910390fd5b610b988383612c2f565b505050565b610ba5613b99565b60008260ff16118015610bbb575060258260ff16105b610bc457600080fd5b610bcc613b99565b6000600190505b60258160ff161015610dc757610be7613bc7565b6000600e60008760ff1660ff16815260200190815260200160002060008460ff1660ff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581525050905080602001518015610ce25750610caf8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16145b15610d3a5782826020019060ff16908160ff16815250508060000151826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610d87565b6000826020019060ff16908160ff16815250506000826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8184600185610d96919061548d565b60ff1660248110610daa57610da96157d2565b5b602002018190525050508080610dbf9061568c565b915050610bd3565b5080915050919050565b6000600880549050905090565b610def610de9612c27565b82612ce8565b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590615093565b60405180910390fd5b610e39838383612dc6565b505050565b6000610e498361175f565b8210610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614df3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eeb613bfa565b60008260ff16118015610f01575060258260ff16105b610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790614e73565b60405180910390fd5b610f48613bfa565b601060008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1681600001906003811115610f8657610f85615745565b5b90816003811115610f9a57610f99615745565b5b81525050600f60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1681602001906003811115610fdc57610fdb615745565b5b90816003811115610ff057610fef615745565b5b81525050601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff16816040019060ff16908160ff168152505080915050919050565b600c8054611042906155e0565b80601f016020809104026020016040519081016040528092919081815260200182805461106e906155e0565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b505050505081565b6110cb613c42565b6110d3613c42565b6000600190505b60258160ff161015611211576110ee613bfa565b601060008360ff1660ff16815260200190815260200160002060009054906101000a900460ff168160000190600381111561112c5761112b615745565b5b908160038111156111405761113f615745565b5b81525050600f60008360ff1660ff16815260200190815260200160002060009054906101000a900460ff168160200190600381111561118257611181615745565b5b9081600381111561119657611195615745565b5b81525050601160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16816040019060ff16908160ff168152505080836001846111e1919061548d565b60ff16602481106111f5576111f46157d2565b5b60200201819052505080806112099061568c565b9150506110da565b508091505090565b60008260ff1611801561122f575060258260ff16105b801561123e575060008160ff16115b801561124d575060258160ff16105b61125657600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166112798360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161480156112d257503373ffffffffffffffffffffffffffffffffffffffff166112ba8260ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff16145b6112db57600080fd5b6000601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1690506000601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff16905080601160008660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555081601160008560ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055507f55779635bd0b5c92481d0feae14204956de560acfa54077e429082a1a16a04c4848285856040516113ca94939291906151bf565b60405180910390a150505050565b60106020528060005260406000206000915054906101000a900460ff1681565b611413838383604051806020016040528060008152506121c4565b505050565b60008260ff1611801561142e575060258260ff16105b61143757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661145a8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461147a57600080fd5b80600f60008460ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360038111156114b6576114b5615745565b5b02179055507f9054118d410d3f44466d3ce647f2c5191068fb7da169e328c65920b193f38d5682826040516114ec92919061516d565b60405180910390a15050565b6000611502610dd1565b8210611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906150b3565b60405180910390fd5b60088281548110611557576115566157d2565b5b90600052602060002001549050919050565b611571612c27565b73ffffffffffffffffffffffffffffffffffffffff1661158f611d69565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614ff3565b60405180910390fd5b80600b90805190602001906115fb929190613c70565b5050565b600d6020528060005260406000206000915090505481565b61161f612c27565b73ffffffffffffffffffffffffffffffffffffffff1661163d611d69565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90614ff3565b60405180910390fd5b80600c90805190602001906116a9929190613c70565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614f93565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614f73565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61181f612c27565b73ffffffffffffffffffffffffffffffffffffffff1661183d611d69565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a90614ff3565b60405180910390fd5b61189d6000613022565b565b600e602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b60008260ff16118015611913575060258260ff16105b61191c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661193f8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461195f57600080fd5b80601060008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083600381111561199b5761199a615745565b5b02179055507ff803d3fdbbecc3a75bb2df9ca2a1d1cf7148a12fbbfa0e74ce0c741a3c1acef082826040516119d1929190615144565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff16611a008360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614ed3565b60405180910390fd5b6000600e60008460ff1660ff16815260200190815260200160002060008360ff1660ff16815260200190815260200160002090508060000160149054906101000a900460ff168015611b025750611aaf8260ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b0b57600080fd5b60008160000160146101000a81548160ff0219169083151502179055506000601160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff1690506000601160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16905080601160008760ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555081601160008660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055507f55779635bd0b5c92481d0feae14204956de560acfa54077e429082a1a16a04c485828685604051611c1794939291906151bf565b60405180910390a17f27067ef2e6ace61d99e49c2e838917a4a2c190d01206cbbc82b8b78bd634378e8585604051611c50929190615196565b60405180910390a15050505050565b60606000611c6c8361175f565b90506000811415611cc957600067ffffffffffffffff811115611c9257611c91615801565b5b604051908082528060200260200182016040528015611cc05781602001602082028036833780820191505090505b50915050611d64565b60008167ffffffffffffffff811115611ce557611ce4615801565b5b604051908082528060200260200182016040528015611d135781602001602082028036833780820191505090505b50905060005b82811015611d5d57611d2b8582610e3e565b828281518110611d3e57611d3d6157d2565b5b6020026020010181815250508080611d5590615643565b915050611d19565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060600160405280602e8152602001615f7a602e913981565b600081118015611dbf5750602581105b611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df5906150d3565b60405180910390fd5b600173495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1662fdd58e33600d6000868152602001908152602001600020546040518363ffffffff1660e01b8152600401611e61929190614c8e565b602060405180830381600087803b158015611e7b57600080fd5b505af1158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb39190614243565b14611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90614f33565b60405180910390fd5b73495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a3330600d60008681526020019081526020016000205460016040518563ffffffff1660e01b8152600401611f5a9493929190614c0d565b600060405180830381600087803b158015611f7457600080fd5b505af1158015611f88573d6000803e3d6000fd5b50505050611f9633826130e8565b50565b606060018054611fa8906155e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd4906155e0565b80156120215780601f10611ff657610100808354040283529160200191612021565b820191906000526020600020905b81548152906001019060200180831161200457829003601f168201915b5050505050905090565b612033612c27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890614eb3565b60405180910390fd5b80600560006120ae612c27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661215b612c27565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121a09190614d65565b60405180910390a35050565b73495f947276749ce646f68ac8c248420045cb7b5e81565b6121d56121cf612c27565b83612ce8565b612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90615093565b60405180910390fd5b61222084848484613106565b50505050565b60008260ff1611801561223c575060258260ff16105b801561224b575060008160ff16115b801561225a575060258160ff16105b612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229090615053565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166122bc8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff1614612312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230990614ef3565b60405180910390fd5b33600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055507fcd0e3541e7a54b1811ee71a0d42433648144e617752e879402e6289e85dc947b8282604051612401929190615196565b60405180910390a15050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061243882612bbb565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90615033565b60405180910390fd5b6000612481613162565b905060008151116124a157604051806020016040528060008152506124cc565b806124ab846131f4565b6040516020016124bc929190614b82565b6040516020818303038152906040525b915050919050565b6124dc613cf6565b6124e4613cf6565b6000600190505b60258160ff16101561258257601060008260ff1660ff16815260200190815260200160002060009054906101000a900460ff168260018361252c919061548d565b60ff16602481106125405761253f6157d2565b5b6020020190600381111561255757612556615745565b5b9081600381111561256b5761256a615745565b5b81525050808061257a9061568c565b9150506124eb565b508091505090565b600b8054612597906155e0565b80601f01602080910402602001604051908101604052809291908181526020018280546125c3906155e0565b80156126105780601f106125e557610100808354040283529160200191612610565b820191906000526020600020905b8154815290600101906020018083116125f357829003601f168201915b505050505081565b612620613d19565b612628613d19565b6000600190505b60258160ff1610156126a857601160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1682600183612670919061548d565b60ff1660248110612684576126836157d2565b5b602002019060ff16908160ff168152505080806126a09061568c565b91505061262f565b508091505090565b6040518060600160405280602e8152602001615f4c602e913981565b6126d4613d3c565b6126dc613d3c565b6000600190505b60258160ff16101561277a57600f60008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1682600183612724919061548d565b60ff1660248110612738576127376157d2565b5b6020020190600381111561274f5761274e615745565b5b9081600381111561276357612762615745565b5b8152505080806127729061568c565b9150506126e3565b508091505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166128398360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461288f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288690614ed3565b60405180910390fd5b6000600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561293057508060000160149054906101000a900460ff165b61293957600080fd5b60008160000160146101000a81548160ff0219169083151502179055507f6d5593320be880f886f018380a7eef74fe09894e2f5b0ed9c24b9d0bf1ac45958383604051612987929190615196565b60405180910390a1505050565b600063f23a6e6160e01b905095945050505050565b6129b1612c27565b73ffffffffffffffffffffffffffffffffffffffff166129cf611d69565b73ffffffffffffffffffffffffffffffffffffffff1614612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90614ff3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90614e33565b60405180910390fd5b612a9e81613022565b50565b60116020528060005260406000206000915054906101000a900460ff1681565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ba457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bb45750612bb382613355565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ca2836116ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cf382612bbb565b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614f13565b60405180910390fd5b6000612d3d836116ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dac57508373ffffffffffffffffffffffffffffffffffffffff16612d9484610a00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dbd5750612dbc8185612782565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612de6826116ad565b73ffffffffffffffffffffffffffffffffffffffff1614612e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3390615013565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea390614e93565b60405180910390fd5b612eb78383836133bf565b612ec2600082612c2f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f129190615459565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6991906153d2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131028282604051806020016040528060008152506134d3565b5050565b613111848484612dc6565b61311d8484848461352e565b61315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614e13565b60405180910390fd5b50505050565b6060600b8054613171906155e0565b80601f016020809104026020016040519081016040528092919081815260200182805461319d906155e0565b80156131ea5780601f106131bf576101008083540402835291602001916131ea565b820191906000526020600020905b8154815290600101906020018083116131cd57829003601f168201915b5050505050905090565b6060600082141561323c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613350565b600082905060005b6000821461326e57808061325790615643565b915050600a826132679190615428565b9150613244565b60008167ffffffffffffffff81111561328a57613289615801565b5b6040519080825280601f01601f1916602001820160405280156132bc5781602001600182028036833780820191505090505b5090505b60008514613349576001826132d59190615459565b9150600a856132e491906156b6565b60306132f091906153d2565b60f81b818381518110613306576133056157d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133429190615428565b94506132c0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6133ca838383612ad4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561340d57613408816136c5565b61344c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461344b5761344a838261370e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561348f5761348a8161387b565b6134ce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146134cd576134cc828261394c565b5b5b505050565b6134dd83836139cb565b6134ea600084848461352e565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614e13565b60405180910390fd5b505050565b600061354f8473ffffffffffffffffffffffffffffffffffffffff16612ac1565b156136b8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613578612c27565b8786866040518563ffffffff1660e01b815260040161359a9493929190614bc1565b602060405180830381600087803b1580156135b457600080fd5b505af19250505080156135e557506040513d601f19601f820116820180604052508101906135e291906141a0565b60015b613668573d8060008114613615576040519150601f19603f3d011682016040523d82523d6000602084013e61361a565b606091505b50600081511415613660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365790614e13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136bd565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161371b8461175f565b6137259190615459565b905060006007600084815260200190815260200160002054905081811461380a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061388f9190615459565b90506000600960008481526020019081526020016000205490506000600883815481106138bf576138be6157d2565b5b9060005260206000200154905080600883815481106138e1576138e06157d2565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139305761392f6157a3565b5b6001900381819060005260206000200160009055905550505050565b60006139578361175f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3290614fb3565b60405180910390fd5b613a4481612bbb565b15613a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7b90614e53565b60405180910390fd5b613a90600083836133bf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae091906153d2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6040518061048001604052806024905b613bb1613bc7565b815260200190600190039081613ba95790505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681525090565b604051806060016040528060006003811115613c1957613c18615745565b5b815260200160006003811115613c3257613c31615745565b5b8152602001600060ff1681525090565b6040518061048001604052806024905b613c5a613bfa565b815260200190600190039081613c525790505090565b828054613c7c906155e0565b90600052602060002090601f016020900481019282613c9e5760008555613ce5565b82601f10613cb757805160ff1916838001178555613ce5565b82800160010185558215613ce5579182015b82811115613ce4578251825591602001919060010190613cc9565b5b509050613cf29190613d5f565b5090565b604051806104800160405280602490602082028036833780820191505090505090565b604051806104800160405280602490602082028036833780820191505090505090565b604051806104800160405280602490602082028036833780820191505090505090565b5b80821115613d78576000816000905550600101613d60565b5090565b6000613d8f613d8a84615229565b615204565b905082815260208101848484011115613dab57613daa615835565b5b613db684828561559e565b509392505050565b6000613dd1613dcc8461525a565b615204565b905082815260208101848484011115613ded57613dec615835565b5b613df884828561559e565b509392505050565b600081359050613e0f81615eb8565b92915050565b600081359050613e2481615ecf565b92915050565b600081359050613e3981615ee6565b92915050565b600081519050613e4e81615ee6565b92915050565b600082601f830112613e6957613e68615830565b5b8135613e79848260208601613d7c565b91505092915050565b600081359050613e9181615efd565b92915050565b600081359050613ea681615f0d565b92915050565b600082601f830112613ec157613ec0615830565b5b8135613ed1848260208601613dbe565b91505092915050565b600081359050613ee981615f1d565b92915050565b600081519050613efe81615f1d565b92915050565b600081359050613f1381615f34565b92915050565b600060208284031215613f2f57613f2e61583f565b5b6000613f3d84828501613e00565b91505092915050565b60008060408385031215613f5d57613f5c61583f565b5b6000613f6b85828601613e00565b9250506020613f7c85828601613e00565b9150509250929050565b600080600060608486031215613f9f57613f9e61583f565b5b6000613fad86828701613e00565b9350506020613fbe86828701613e00565b9250506040613fcf86828701613eda565b9150509250925092565b60008060008060808587031215613ff357613ff261583f565b5b600061400187828801613e00565b945050602061401287828801613e00565b935050604061402387828801613eda565b925050606085013567ffffffffffffffff8111156140445761404361583a565b5b61405087828801613e54565b91505092959194509250565b600080600080600060a086880312156140785761407761583f565b5b600061408688828901613e00565b955050602061409788828901613e00565b94505060406140a888828901613eda565b93505060606140b988828901613eda565b925050608086013567ffffffffffffffff8111156140da576140d961583a565b5b6140e688828901613e54565b9150509295509295909350565b6000806040838503121561410a5761410961583f565b5b600061411885828601613e00565b925050602061412985828601613e15565b9150509250929050565b6000806040838503121561414a5761414961583f565b5b600061415885828601613e00565b925050602061416985828601613eda565b9150509250929050565b6000602082840312156141895761418861583f565b5b600061419784828501613e2a565b91505092915050565b6000602082840312156141b6576141b561583f565b5b60006141c484828501613e3f565b91505092915050565b6000602082840312156141e3576141e261583f565b5b600082013567ffffffffffffffff8111156142015761420061583a565b5b61420d84828501613eac565b91505092915050565b60006020828403121561422c5761422b61583f565b5b600061423a84828501613eda565b91505092915050565b6000602082840312156142595761425861583f565b5b600061426784828501613eef565b91505092915050565b6000602082840312156142865761428561583f565b5b600061429484828501613f04565b91505092915050565b600080604083850312156142b4576142b361583f565b5b60006142c285828601613f04565b92505060206142d385828601613e82565b9150509250929050565b600080604083850312156142f4576142f361583f565b5b600061430285828601613f04565b925050602061431385828601613e97565b9150509250929050565b600080604083850312156143345761433361583f565b5b600061434285828601613f04565b925050602061435385828601613f04565b9150509250929050565b60006143698383614673565b60208301905092915050565b60006143818383614691565b60208301905092915050565b60006143998383614a93565b60608301905092915050565b60006143b18383614b17565b60408301905092915050565b60006143c98383614b46565b60208301905092915050565b60006143e18383614b64565b60208301905092915050565b6143f6816154c1565b82525050565b614405816154c1565b82525050565b614414816152cd565b61441e818461539a565b92506144298261528b565b8060005b8381101561445a578151614441878261435d565b965061444c83615325565b92505060018101905061442d565b505050505050565b61446b816152d8565b614475818461539a565b925061448082615295565b8060005b838110156144b15781516144988782614375565b96506144a383615332565b925050600181019050614484565b505050505050565b6144c2816152e3565b6144cc8184615373565b92506144d78261529f565b8060005b838110156145085781516144ef878261438d565b96506144fa8361533f565b9250506001810190506144db565b505050505050565b614519816152ee565b614523818461537e565b925061452e826152a9565b8060005b8381101561455f57815161454687826143a5565b96506145518361534c565b925050600181019050614532565b505050505050565b6000614572826152f9565b61457c8185615389565b9350614587836152b3565b8060005b838110156145b857815161459f88826143bd565b97506145aa83615359565b92505060018101905061458b565b5085935050505092915050565b6145ce81615304565b6145d8818461539a565b92506145e3826152c3565b8060005b838110156146145781516145fb87826143d5565b965061460683615366565b9250506001810190506145e7565b505050505050565b614625816154d3565b82525050565b614634816154df565b82525050565b60006146458261530f565b61464f81856153a5565b935061465f8185602086016155ad565b61466881615844565b840191505092915050565b61467c81615568565b82525050565b61468b81615568565b82525050565b61469a8161557a565b82525050565b6146a98161557a565b82525050565b6146b88161558c565b82525050565b60006146c98261531a565b6146d381856153b6565b93506146e38185602086016155ad565b6146ec81615844565b840191505092915050565b60006147028261531a565b61470c81856153c7565b935061471c8185602086016155ad565b80840191505092915050565b6000614735602b836153b6565b915061474082615855565b604082019050919050565b60006147586032836153b6565b9150614763826158a4565b604082019050919050565b600061477b6026836153b6565b9150614786826158f3565b604082019050919050565b600061479e601c836153b6565b91506147a982615942565b602082019050919050565b60006147c16019836153b6565b91506147cc8261596b565b602082019050919050565b60006147e46024836153b6565b91506147ef82615994565b604082019050919050565b60006148076019836153b6565b9150614812826159e3565b602082019050919050565b600061482a602c836153b6565b915061483582615a0c565b604082019050919050565b600061484d6030836153b6565b915061485882615a5b565b604082019050919050565b6000614870602c836153b6565b915061487b82615aaa565b604082019050919050565b6000614893601a836153b6565b915061489e82615af9565b602082019050919050565b60006148b66038836153b6565b91506148c182615b22565b604082019050919050565b60006148d9602a836153b6565b91506148e482615b71565b604082019050919050565b60006148fc6029836153b6565b915061490782615bc0565b604082019050919050565b600061491f6020836153b6565b915061492a82615c0f565b602082019050919050565b6000614942602c836153b6565b915061494d82615c38565b604082019050919050565b60006149656020836153b6565b915061497082615c87565b602082019050919050565b60006149886029836153b6565b915061499382615cb0565b604082019050919050565b60006149ab602f836153b6565b91506149b682615cff565b604082019050919050565b60006149ce601a836153b6565b91506149d982615d4e565b602082019050919050565b60006149f16021836153b6565b91506149fc82615d77565b604082019050919050565b6000614a146000836153a5565b9150614a1f82615dc6565b600082019050919050565b6000614a376031836153b6565b9150614a4282615dc9565b604082019050919050565b6000614a5a602c836153b6565b9150614a6582615e18565b604082019050919050565b6000614a7d6014836153b6565b9150614a8882615e67565b602082019050919050565b606082016000820151614aa96000850182614673565b506020820151614abc6020850182614691565b506040820151614acf6040850182614b64565b50505050565b606082016000820151614aeb6000850182614673565b506020820151614afe6020850182614691565b506040820151614b116040850182614b64565b50505050565b604082016000820151614b2d60008501826143ed565b506020820151614b406020850182614b64565b50505050565b614b4f81615551565b82525050565b614b5e81615551565b82525050565b614b6d8161555b565b82525050565b614b7c8161555b565b82525050565b6000614b8e82856146f7565b9150614b9a82846146f7565b91508190509392505050565b6000602082019050614bbb60008301846143fc565b92915050565b6000608082019050614bd660008301876143fc565b614be360208301866143fc565b614bf06040830185614b55565b8181036060830152614c02818461463a565b905095945050505050565b600060a082019050614c2260008301876143fc565b614c2f60208301866143fc565b614c3c6040830185614b55565b614c4960608301846146af565b8181036080830152614c5a81614a07565b905095945050505050565b6000604082019050614c7a60008301856143fc565b614c87602083018461461c565b9392505050565b6000604082019050614ca360008301856143fc565b614cb06020830184614b55565b9392505050565b600061048082019050614ccd600083018461440b565b92915050565b600061048082019050614ce96000830184614462565b92915050565b6000610d8082019050614d0560008301846144b9565b92915050565b600061090082019050614d216000830184614510565b92915050565b60006020820190508181036000830152614d418184614567565b905092915050565b600061048082019050614d5f60008301846145c5565b92915050565b6000602082019050614d7a600083018461461c565b92915050565b6000602082019050614d95600083018461462b565b92915050565b6000602082019050614db06000830184614682565b92915050565b6000602082019050614dcb60008301846146a0565b92915050565b60006020820190508181036000830152614deb81846146be565b905092915050565b60006020820190508181036000830152614e0c81614728565b9050919050565b60006020820190508181036000830152614e2c8161474b565b9050919050565b60006020820190508181036000830152614e4c8161476e565b9050919050565b60006020820190508181036000830152614e6c81614791565b9050919050565b60006020820190508181036000830152614e8c816147b4565b9050919050565b60006020820190508181036000830152614eac816147d7565b9050919050565b60006020820190508181036000830152614ecc816147fa565b9050919050565b60006020820190508181036000830152614eec8161481d565b9050919050565b60006020820190508181036000830152614f0c81614840565b9050919050565b60006020820190508181036000830152614f2c81614863565b9050919050565b60006020820190508181036000830152614f4c81614886565b9050919050565b60006020820190508181036000830152614f6c816148a9565b9050919050565b60006020820190508181036000830152614f8c816148cc565b9050919050565b60006020820190508181036000830152614fac816148ef565b9050919050565b60006020820190508181036000830152614fcc81614912565b9050919050565b60006020820190508181036000830152614fec81614935565b9050919050565b6000602082019050818103600083015261500c81614958565b9050919050565b6000602082019050818103600083015261502c8161497b565b9050919050565b6000602082019050818103600083015261504c8161499e565b9050919050565b6000602082019050818103600083015261506c816149c1565b9050919050565b6000602082019050818103600083015261508c816149e4565b9050919050565b600060208201905081810360008301526150ac81614a2a565b9050919050565b600060208201905081810360008301526150cc81614a4d565b9050919050565b600060208201905081810360008301526150ec81614a70565b9050919050565b60006060820190506151086000830184614ad5565b92915050565b60006020820190506151236000830184614b55565b92915050565b600060208201905061513e6000830184614b73565b92915050565b60006040820190506151596000830185614b73565b6151666020830184614682565b9392505050565b60006040820190506151826000830185614b73565b61518f60208301846146a0565b9392505050565b60006040820190506151ab6000830185614b73565b6151b86020830184614b73565b9392505050565b60006080820190506151d46000830187614b73565b6151e16020830186614b73565b6151ee6040830185614b73565b6151fb6060830184614b73565b95945050505050565b600061520e61521f565b905061521a8282615612565b919050565b6000604051905090565b600067ffffffffffffffff82111561524457615243615801565b5b61524d82615844565b9050602081019050919050565b600067ffffffffffffffff82111561527557615274615801565b5b61527e82615844565b9050602081019050919050565b6000819050919050565b6000819050919050565b6000819050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b600060249050919050565b600060249050919050565b600060249050919050565b600060249050919050565b600081519050919050565b600060249050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153dd82615551565b91506153e883615551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561541d5761541c6156e7565b5b828201905092915050565b600061543382615551565b915061543e83615551565b92508261544e5761544d615716565b5b828204905092915050565b600061546482615551565b915061546f83615551565b925082821015615482576154816156e7565b5b828203905092915050565b60006154988261555b565b91506154a38361555b565b9250828210156154b6576154b56156e7565b5b828203905092915050565b60006154cc82615531565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061551982615e90565b919050565b600081905061552c82615ea4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155738261550b565b9050919050565b60006155858261551e565b9050919050565b600061559782615551565b9050919050565b82818337600083830152505050565b60005b838110156155cb5780820151818401526020810190506155b0565b838111156155da576000848401525b50505050565b600060028204905060018216806155f857607f821691505b6020821081141561560c5761560b615774565b5b50919050565b61561b82615844565b810181811067ffffffffffffffff8211171561563a57615639615801565b5b80604052505050565b600061564e82615551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615681576156806156e7565b5b600182019050919050565b60006156978261555b565b915060ff8214156156ab576156aa6156e7565b5b600182019050919050565b60006156c182615551565b91506156cc83615551565b9250826156dc576156db615716565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f504c5320454e544552204944204245545745454e20312d333600000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f552052204e4f5420544845204f574e4552204f46205448495320474c4943504960008201527f5820474f4444414d4e4954210000000000000000000000000000000000000000602082015250565b7f594f5520415245204e4f5420544845204f574e4552204f46205448495320474c60008201527f494350495820474f4444414d4e49542100000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f594f5520444f4e2754204f574e205448495320474c4943504958000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f504c5320454e54455220494453204245545745454e20312d3336000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f57524f4e4720474c4943504958204e554d424552000000000000000000000000600082015250565b60048110615ea157615ea0615745565b5b50565b60048110615eb557615eb4615745565b5b50565b615ec1816154c1565b8114615ecc57600080fd5b50565b615ed8816154d3565b8114615ee357600080fd5b50565b615eef816154df565b8114615efa57600080fd5b50565b60048110615f0a57600080fd5b50565b60048110615f1a57600080fd5b50565b615f2681615551565b8114615f3157600080fd5b50565b615f3d8161555b565b8114615f4857600080fd5b5056fe516d5a7a3356556937327a7045696e6976637a50505557567061575965534b6f7a386f4b63417570773950555547516d59756d76444e4779694e324d795051634e42615537686e65736d774a697476716970794e324833664632746ba2646970667358221220f308ee1b3fac094d06d514df0a3c09f1c5322c96435360e2aeb853d40501fcc964736f6c63430008060033474c49435049585858564552303031202d2050524f4752414d4d41424c452043414e564153

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c806373a03ee71161015c578063c39596c4116100ce578063e95ae08d11610087578063e95ae08d1461080e578063e985e9c51461082c578063eb3294e81461085c578063f23a6e6114610878578063f2fde38b146108a8578063ffaec402146108c45761028a565b8063c39596c414610736578063c87b56dd14610766578063ccdc415614610796578063cfc86f7b146107b4578063e8454b86146107d2578063e9100884146107f05761028a565b806394d887881161012057806394d887881461068a57806395d89b41146106a6578063a22cb465146106c4578063b103a0a1146106e0578063b88d4fde146106fe578063bdda71021461071a5761028a565b806373a03ee7146105e657806376be49e3146106025780638462151c1461061e5780638da5cb5b1461064e5780638eaa18561461066c5761028a565b80633d861404116102005780635e3b0c17116101b95780635e3b0c17146104ff57806362ee81391461052f5780636352211e1461054b57806370a082311461057b578063715018a6146105ab578063735413ab146105b55761028a565b80633d8614041461042f578063420fe7c31461044b57806342842e0e1461047b5780634f469395146104975780634f6ccce7146104b357806355f804b3146104e35761028a565b806318160ddd1161025257806318160ddd1461035957806323b872dd146103775780632f745c59146103935780633103040d146103c357806333ce7a4d146103f357806334e1bc19146104115761028a565b806301ffc9a71461028f57806306fdde03146102bf578063081812fc146102dd578063095ea7b31461030d578063142d226014610329575b600080fd5b6102a960048036038101906102a49190614173565b6108f4565b6040516102b69190614d65565b60405180910390f35b6102c761096e565b6040516102d49190614dd1565b60405180910390f35b6102f760048036038101906102f29190614216565b610a00565b6040516103049190614ba6565b60405180910390f35b61032760048036038101906103229190614133565b610a85565b005b610343600480360381019061033e9190614270565b610b9d565b6040516103509190614d0b565b60405180910390f35b610361610dd1565b60405161036e919061510e565b60405180910390f35b610391600480360381019061038c9190613f86565b610dde565b005b6103ad60048036038101906103a89190614133565b610e3e565b6040516103ba919061510e565b60405180910390f35b6103dd60048036038101906103d89190614270565b610ee3565b6040516103ea91906150f3565b60405180910390f35b6103fb611035565b6040516104089190614dd1565b60405180910390f35b6104196110c3565b6040516104269190614cef565b60405180910390f35b6104496004803603810190610444919061431d565b611219565b005b61046560048036038101906104609190614270565b6113d8565b6040516104729190614d9b565b60405180910390f35b61049560048036038101906104909190613f86565b6113f8565b005b6104b160048036038101906104ac91906142dd565b611418565b005b6104cd60048036038101906104c89190614216565b6114f8565b6040516104da919061510e565b60405180910390f35b6104fd60048036038101906104f891906141cd565b611569565b005b61051960048036038101906105149190614216565b6115ff565b604051610526919061510e565b60405180910390f35b610549600480360381019061054491906141cd565b611617565b005b61056560048036038101906105609190614216565b6116ad565b6040516105729190614ba6565b60405180910390f35b61059560048036038101906105909190613f19565b61175f565b6040516105a2919061510e565b60405180910390f35b6105b3611817565b005b6105cf60048036038101906105ca919061431d565b61189f565b6040516105dd929190614c65565b60405180910390f35b61060060048036038101906105fb919061429d565b6118fd565b005b61061c6004803603810190610617919061431d565b6119dd565b005b61063860048036038101906106339190613f19565b611c5f565b6040516106459190614d27565b60405180910390f35b610656611d69565b6040516106639190614ba6565b60405180910390f35b610674611d93565b6040516106819190614dd1565b60405180910390f35b6106a4600480360381019061069f9190614216565b611daf565b005b6106ae611f99565b6040516106bb9190614dd1565b60405180910390f35b6106de60048036038101906106d991906140f3565b61202b565b005b6106e86121ac565b6040516106f59190614ba6565b60405180910390f35b61071860048036038101906107139190613fd9565b6121c4565b005b610734600480360381019061072f919061431d565b612226565b005b610750600480360381019061074b9190614270565b61240d565b60405161075d9190614db6565b60405180910390f35b610780600480360381019061077b9190614216565b61242d565b60405161078d9190614dd1565b60405180910390f35b61079e6124d4565b6040516107ab9190614cb7565b60405180910390f35b6107bc61258a565b6040516107c99190614dd1565b60405180910390f35b6107da612618565b6040516107e79190614d49565b60405180910390f35b6107f86126b0565b6040516108059190614dd1565b60405180910390f35b6108166126cc565b6040516108239190614cd3565b60405180910390f35b61084660048036038101906108419190613f46565b612782565b6040516108539190614d65565b60405180910390f35b6108766004803603810190610871919061431d565b612816565b005b610892600480360381019061088d919061405c565b612994565b60405161089f9190614d80565b60405180910390f35b6108c260048036038101906108bd9190613f19565b6129a9565b005b6108de60048036038101906108d99190614270565b612aa1565b6040516108eb9190615129565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610967575061096682612ad9565b5b9050919050565b60606000805461097d906155e0565b80601f01602080910402602001604051908101604052809291908181526020018280546109a9906155e0565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b82612bbb565b610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4190614fd3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a90826116ad565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890615073565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b20612c27565b73ffffffffffffffffffffffffffffffffffffffff161480610b4f5750610b4e81610b49612c27565b612782565b5b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590614f53565b60405180910390fd5b610b988383612c2f565b505050565b610ba5613b99565b60008260ff16118015610bbb575060258260ff16105b610bc457600080fd5b610bcc613b99565b6000600190505b60258160ff161015610dc757610be7613bc7565b6000600e60008760ff1660ff16815260200190815260200160002060008460ff1660ff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff161515151581525050905080602001518015610ce25750610caf8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16145b15610d3a5782826020019060ff16908160ff16815250508060000151826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610d87565b6000826020019060ff16908160ff16815250506000826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8184600185610d96919061548d565b60ff1660248110610daa57610da96157d2565b5b602002018190525050508080610dbf9061568c565b915050610bd3565b5080915050919050565b6000600880549050905090565b610def610de9612c27565b82612ce8565b610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590615093565b60405180910390fd5b610e39838383612dc6565b505050565b6000610e498361175f565b8210610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190614df3565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eeb613bfa565b60008260ff16118015610f01575060258260ff16105b610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790614e73565b60405180910390fd5b610f48613bfa565b601060008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1681600001906003811115610f8657610f85615745565b5b90816003811115610f9a57610f99615745565b5b81525050600f60008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1681602001906003811115610fdc57610fdb615745565b5b90816003811115610ff057610fef615745565b5b81525050601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff16816040019060ff16908160ff168152505080915050919050565b600c8054611042906155e0565b80601f016020809104026020016040519081016040528092919081815260200182805461106e906155e0565b80156110bb5780601f10611090576101008083540402835291602001916110bb565b820191906000526020600020905b81548152906001019060200180831161109e57829003601f168201915b505050505081565b6110cb613c42565b6110d3613c42565b6000600190505b60258160ff161015611211576110ee613bfa565b601060008360ff1660ff16815260200190815260200160002060009054906101000a900460ff168160000190600381111561112c5761112b615745565b5b908160038111156111405761113f615745565b5b81525050600f60008360ff1660ff16815260200190815260200160002060009054906101000a900460ff168160200190600381111561118257611181615745565b5b9081600381111561119657611195615745565b5b81525050601160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16816040019060ff16908160ff168152505080836001846111e1919061548d565b60ff16602481106111f5576111f46157d2565b5b60200201819052505080806112099061568c565b9150506110da565b508091505090565b60008260ff1611801561122f575060258260ff16105b801561123e575060008160ff16115b801561124d575060258160ff16105b61125657600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166112798360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161480156112d257503373ffffffffffffffffffffffffffffffffffffffff166112ba8260ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff16145b6112db57600080fd5b6000601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff1690506000601160008460ff1660ff16815260200190815260200160002060009054906101000a900460ff16905080601160008660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555081601160008560ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055507f55779635bd0b5c92481d0feae14204956de560acfa54077e429082a1a16a04c4848285856040516113ca94939291906151bf565b60405180910390a150505050565b60106020528060005260406000206000915054906101000a900460ff1681565b611413838383604051806020016040528060008152506121c4565b505050565b60008260ff1611801561142e575060258260ff16105b61143757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661145a8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461147a57600080fd5b80600f60008460ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360038111156114b6576114b5615745565b5b02179055507f9054118d410d3f44466d3ce647f2c5191068fb7da169e328c65920b193f38d5682826040516114ec92919061516d565b60405180910390a15050565b6000611502610dd1565b8210611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906150b3565b60405180910390fd5b60088281548110611557576115566157d2565b5b90600052602060002001549050919050565b611571612c27565b73ffffffffffffffffffffffffffffffffffffffff1661158f611d69565b73ffffffffffffffffffffffffffffffffffffffff16146115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614ff3565b60405180910390fd5b80600b90805190602001906115fb929190613c70565b5050565b600d6020528060005260406000206000915090505481565b61161f612c27565b73ffffffffffffffffffffffffffffffffffffffff1661163d611d69565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90614ff3565b60405180910390fd5b80600c90805190602001906116a9929190613c70565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90614f93565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614f73565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61181f612c27565b73ffffffffffffffffffffffffffffffffffffffff1661183d611d69565b73ffffffffffffffffffffffffffffffffffffffff1614611893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188a90614ff3565b60405180910390fd5b61189d6000613022565b565b600e602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16905082565b60008260ff16118015611913575060258260ff16105b61191c57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661193f8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461195f57600080fd5b80601060008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083600381111561199b5761199a615745565b5b02179055507ff803d3fdbbecc3a75bb2df9ca2a1d1cf7148a12fbbfa0e74ce0c741a3c1acef082826040516119d1929190615144565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff16611a008360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d90614ed3565b60405180910390fd5b6000600e60008460ff1660ff16815260200190815260200160002060008360ff1660ff16815260200190815260200160002090508060000160149054906101000a900460ff168015611b025750611aaf8260ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611b0b57600080fd5b60008160000160146101000a81548160ff0219169083151502179055506000601160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff1690506000601160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16905080601160008760ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555081601160008660ff1660ff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055507f55779635bd0b5c92481d0feae14204956de560acfa54077e429082a1a16a04c485828685604051611c1794939291906151bf565b60405180910390a17f27067ef2e6ace61d99e49c2e838917a4a2c190d01206cbbc82b8b78bd634378e8585604051611c50929190615196565b60405180910390a15050505050565b60606000611c6c8361175f565b90506000811415611cc957600067ffffffffffffffff811115611c9257611c91615801565b5b604051908082528060200260200182016040528015611cc05781602001602082028036833780820191505090505b50915050611d64565b60008167ffffffffffffffff811115611ce557611ce4615801565b5b604051908082528060200260200182016040528015611d135781602001602082028036833780820191505090505b50905060005b82811015611d5d57611d2b8582610e3e565b828281518110611d3e57611d3d6157d2565b5b6020026020010181815250508080611d5590615643565b915050611d19565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060600160405280602e8152602001615f7a602e913981565b600081118015611dbf5750602581105b611dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df5906150d3565b60405180910390fd5b600173495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1662fdd58e33600d6000868152602001908152602001600020546040518363ffffffff1660e01b8152600401611e61929190614c8e565b602060405180830381600087803b158015611e7b57600080fd5b505af1158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb39190614243565b14611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90614f33565b60405180910390fd5b73495f947276749ce646f68ac8c248420045cb7b5e73ffffffffffffffffffffffffffffffffffffffff1663f242432a3330600d60008681526020019081526020016000205460016040518563ffffffff1660e01b8152600401611f5a9493929190614c0d565b600060405180830381600087803b158015611f7457600080fd5b505af1158015611f88573d6000803e3d6000fd5b50505050611f9633826130e8565b50565b606060018054611fa8906155e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd4906155e0565b80156120215780601f10611ff657610100808354040283529160200191612021565b820191906000526020600020905b81548152906001019060200180831161200457829003601f168201915b5050505050905090565b612033612c27565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890614eb3565b60405180910390fd5b80600560006120ae612c27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661215b612c27565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121a09190614d65565b60405180910390a35050565b73495f947276749ce646f68ac8c248420045cb7b5e81565b6121d56121cf612c27565b83612ce8565b612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90615093565b60405180910390fd5b61222084848484613106565b50505050565b60008260ff1611801561223c575060258260ff16105b801561224b575060008160ff16115b801561225a575060258160ff16105b612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229090615053565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166122bc8360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff1614612312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230990614ef3565b60405180910390fd5b33600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055507fcd0e3541e7a54b1811ee71a0d42433648144e617752e879402e6289e85dc947b8282604051612401929190615196565b60405180910390a15050565b600f6020528060005260406000206000915054906101000a900460ff1681565b606061243882612bbb565b612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246e90615033565b60405180910390fd5b6000612481613162565b905060008151116124a157604051806020016040528060008152506124cc565b806124ab846131f4565b6040516020016124bc929190614b82565b6040516020818303038152906040525b915050919050565b6124dc613cf6565b6124e4613cf6565b6000600190505b60258160ff16101561258257601060008260ff1660ff16815260200190815260200160002060009054906101000a900460ff168260018361252c919061548d565b60ff16602481106125405761253f6157d2565b5b6020020190600381111561255757612556615745565b5b9081600381111561256b5761256a615745565b5b81525050808061257a9061568c565b9150506124eb565b508091505090565b600b8054612597906155e0565b80601f01602080910402602001604051908101604052809291908181526020018280546125c3906155e0565b80156126105780601f106125e557610100808354040283529160200191612610565b820191906000526020600020905b8154815290600101906020018083116125f357829003601f168201915b505050505081565b612620613d19565b612628613d19565b6000600190505b60258160ff1610156126a857601160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1682600183612670919061548d565b60ff1660248110612684576126836157d2565b5b602002019060ff16908160ff168152505080806126a09061568c565b91505061262f565b508091505090565b6040518060600160405280602e8152602001615f4c602e913981565b6126d4613d3c565b6126dc613d3c565b6000600190505b60258160ff16101561277a57600f60008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1682600183612724919061548d565b60ff1660248110612738576127376157d2565b5b6020020190600381111561274f5761274e615745565b5b9081600381111561276357612762615745565b5b8152505080806127729061568c565b9150506126e3565b508091505090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166128398360ff166116ad565b73ffffffffffffffffffffffffffffffffffffffff161461288f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288690614ed3565b60405180910390fd5b6000600e60008360ff1660ff16815260200190815260200160002060008460ff1660ff16815260200190815260200160002090503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561293057508060000160149054906101000a900460ff165b61293957600080fd5b60008160000160146101000a81548160ff0219169083151502179055507f6d5593320be880f886f018380a7eef74fe09894e2f5b0ed9c24b9d0bf1ac45958383604051612987929190615196565b60405180910390a1505050565b600063f23a6e6160e01b905095945050505050565b6129b1612c27565b73ffffffffffffffffffffffffffffffffffffffff166129cf611d69565b73ffffffffffffffffffffffffffffffffffffffff1614612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90614ff3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8c90614e33565b60405180910390fd5b612a9e81613022565b50565b60116020528060005260406000206000915054906101000a900460ff1681565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ba457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bb45750612bb382613355565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ca2836116ad565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cf382612bbb565b612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614f13565b60405180910390fd5b6000612d3d836116ad565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612dac57508373ffffffffffffffffffffffffffffffffffffffff16612d9484610a00565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dbd5750612dbc8185612782565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612de6826116ad565b73ffffffffffffffffffffffffffffffffffffffff1614612e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3390615013565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea390614e93565b60405180910390fd5b612eb78383836133bf565b612ec2600082612c2f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f129190615459565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6991906153d2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131028282604051806020016040528060008152506134d3565b5050565b613111848484612dc6565b61311d8484848461352e565b61315c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315390614e13565b60405180910390fd5b50505050565b6060600b8054613171906155e0565b80601f016020809104026020016040519081016040528092919081815260200182805461319d906155e0565b80156131ea5780601f106131bf576101008083540402835291602001916131ea565b820191906000526020600020905b8154815290600101906020018083116131cd57829003601f168201915b5050505050905090565b6060600082141561323c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613350565b600082905060005b6000821461326e57808061325790615643565b915050600a826132679190615428565b9150613244565b60008167ffffffffffffffff81111561328a57613289615801565b5b6040519080825280601f01601f1916602001820160405280156132bc5781602001600182028036833780820191505090505b5090505b60008514613349576001826132d59190615459565b9150600a856132e491906156b6565b60306132f091906153d2565b60f81b818381518110613306576133056157d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133429190615428565b94506132c0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6133ca838383612ad4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561340d57613408816136c5565b61344c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461344b5761344a838261370e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561348f5761348a8161387b565b6134ce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146134cd576134cc828261394c565b5b5b505050565b6134dd83836139cb565b6134ea600084848461352e565b613529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352090614e13565b60405180910390fd5b505050565b600061354f8473ffffffffffffffffffffffffffffffffffffffff16612ac1565b156136b8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613578612c27565b8786866040518563ffffffff1660e01b815260040161359a9493929190614bc1565b602060405180830381600087803b1580156135b457600080fd5b505af19250505080156135e557506040513d601f19601f820116820180604052508101906135e291906141a0565b60015b613668573d8060008114613615576040519150601f19603f3d011682016040523d82523d6000602084013e61361a565b606091505b50600081511415613660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365790614e13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136bd565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161371b8461175f565b6137259190615459565b905060006007600084815260200190815260200160002054905081811461380a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061388f9190615459565b90506000600960008481526020019081526020016000205490506000600883815481106138bf576138be6157d2565b5b9060005260206000200154905080600883815481106138e1576138e06157d2565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139305761392f6157a3565b5b6001900381819060005260206000200160009055905550505050565b60006139578361175f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3290614fb3565b60405180910390fd5b613a4481612bbb565b15613a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7b90614e53565b60405180910390fd5b613a90600083836133bf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae091906153d2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6040518061048001604052806024905b613bb1613bc7565b815260200190600190039081613ba95790505090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681525090565b604051806060016040528060006003811115613c1957613c18615745565b5b815260200160006003811115613c3257613c31615745565b5b8152602001600060ff1681525090565b6040518061048001604052806024905b613c5a613bfa565b815260200190600190039081613c525790505090565b828054613c7c906155e0565b90600052602060002090601f016020900481019282613c9e5760008555613ce5565b82601f10613cb757805160ff1916838001178555613ce5565b82800160010185558215613ce5579182015b82811115613ce4578251825591602001919060010190613cc9565b5b509050613cf29190613d5f565b5090565b604051806104800160405280602490602082028036833780820191505090505090565b604051806104800160405280602490602082028036833780820191505090505090565b604051806104800160405280602490602082028036833780820191505090505090565b5b80821115613d78576000816000905550600101613d60565b5090565b6000613d8f613d8a84615229565b615204565b905082815260208101848484011115613dab57613daa615835565b5b613db684828561559e565b509392505050565b6000613dd1613dcc8461525a565b615204565b905082815260208101848484011115613ded57613dec615835565b5b613df884828561559e565b509392505050565b600081359050613e0f81615eb8565b92915050565b600081359050613e2481615ecf565b92915050565b600081359050613e3981615ee6565b92915050565b600081519050613e4e81615ee6565b92915050565b600082601f830112613e6957613e68615830565b5b8135613e79848260208601613d7c565b91505092915050565b600081359050613e9181615efd565b92915050565b600081359050613ea681615f0d565b92915050565b600082601f830112613ec157613ec0615830565b5b8135613ed1848260208601613dbe565b91505092915050565b600081359050613ee981615f1d565b92915050565b600081519050613efe81615f1d565b92915050565b600081359050613f1381615f34565b92915050565b600060208284031215613f2f57613f2e61583f565b5b6000613f3d84828501613e00565b91505092915050565b60008060408385031215613f5d57613f5c61583f565b5b6000613f6b85828601613e00565b9250506020613f7c85828601613e00565b9150509250929050565b600080600060608486031215613f9f57613f9e61583f565b5b6000613fad86828701613e00565b9350506020613fbe86828701613e00565b9250506040613fcf86828701613eda565b9150509250925092565b60008060008060808587031215613ff357613ff261583f565b5b600061400187828801613e00565b945050602061401287828801613e00565b935050604061402387828801613eda565b925050606085013567ffffffffffffffff8111156140445761404361583a565b5b61405087828801613e54565b91505092959194509250565b600080600080600060a086880312156140785761407761583f565b5b600061408688828901613e00565b955050602061409788828901613e00565b94505060406140a888828901613eda565b93505060606140b988828901613eda565b925050608086013567ffffffffffffffff8111156140da576140d961583a565b5b6140e688828901613e54565b9150509295509295909350565b6000806040838503121561410a5761410961583f565b5b600061411885828601613e00565b925050602061412985828601613e15565b9150509250929050565b6000806040838503121561414a5761414961583f565b5b600061415885828601613e00565b925050602061416985828601613eda565b9150509250929050565b6000602082840312156141895761418861583f565b5b600061419784828501613e2a565b91505092915050565b6000602082840312156141b6576141b561583f565b5b60006141c484828501613e3f565b91505092915050565b6000602082840312156141e3576141e261583f565b5b600082013567ffffffffffffffff8111156142015761420061583a565b5b61420d84828501613eac565b91505092915050565b60006020828403121561422c5761422b61583f565b5b600061423a84828501613eda565b91505092915050565b6000602082840312156142595761425861583f565b5b600061426784828501613eef565b91505092915050565b6000602082840312156142865761428561583f565b5b600061429484828501613f04565b91505092915050565b600080604083850312156142b4576142b361583f565b5b60006142c285828601613f04565b92505060206142d385828601613e82565b9150509250929050565b600080604083850312156142f4576142f361583f565b5b600061430285828601613f04565b925050602061431385828601613e97565b9150509250929050565b600080604083850312156143345761433361583f565b5b600061434285828601613f04565b925050602061435385828601613f04565b9150509250929050565b60006143698383614673565b60208301905092915050565b60006143818383614691565b60208301905092915050565b60006143998383614a93565b60608301905092915050565b60006143b18383614b17565b60408301905092915050565b60006143c98383614b46565b60208301905092915050565b60006143e18383614b64565b60208301905092915050565b6143f6816154c1565b82525050565b614405816154c1565b82525050565b614414816152cd565b61441e818461539a565b92506144298261528b565b8060005b8381101561445a578151614441878261435d565b965061444c83615325565b92505060018101905061442d565b505050505050565b61446b816152d8565b614475818461539a565b925061448082615295565b8060005b838110156144b15781516144988782614375565b96506144a383615332565b925050600181019050614484565b505050505050565b6144c2816152e3565b6144cc8184615373565b92506144d78261529f565b8060005b838110156145085781516144ef878261438d565b96506144fa8361533f565b9250506001810190506144db565b505050505050565b614519816152ee565b614523818461537e565b925061452e826152a9565b8060005b8381101561455f57815161454687826143a5565b96506145518361534c565b925050600181019050614532565b505050505050565b6000614572826152f9565b61457c8185615389565b9350614587836152b3565b8060005b838110156145b857815161459f88826143bd565b97506145aa83615359565b92505060018101905061458b565b5085935050505092915050565b6145ce81615304565b6145d8818461539a565b92506145e3826152c3565b8060005b838110156146145781516145fb87826143d5565b965061460683615366565b9250506001810190506145e7565b505050505050565b614625816154d3565b82525050565b614634816154df565b82525050565b60006146458261530f565b61464f81856153a5565b935061465f8185602086016155ad565b61466881615844565b840191505092915050565b61467c81615568565b82525050565b61468b81615568565b82525050565b61469a8161557a565b82525050565b6146a98161557a565b82525050565b6146b88161558c565b82525050565b60006146c98261531a565b6146d381856153b6565b93506146e38185602086016155ad565b6146ec81615844565b840191505092915050565b60006147028261531a565b61470c81856153c7565b935061471c8185602086016155ad565b80840191505092915050565b6000614735602b836153b6565b915061474082615855565b604082019050919050565b60006147586032836153b6565b9150614763826158a4565b604082019050919050565b600061477b6026836153b6565b9150614786826158f3565b604082019050919050565b600061479e601c836153b6565b91506147a982615942565b602082019050919050565b60006147c16019836153b6565b91506147cc8261596b565b602082019050919050565b60006147e46024836153b6565b91506147ef82615994565b604082019050919050565b60006148076019836153b6565b9150614812826159e3565b602082019050919050565b600061482a602c836153b6565b915061483582615a0c565b604082019050919050565b600061484d6030836153b6565b915061485882615a5b565b604082019050919050565b6000614870602c836153b6565b915061487b82615aaa565b604082019050919050565b6000614893601a836153b6565b915061489e82615af9565b602082019050919050565b60006148b66038836153b6565b91506148c182615b22565b604082019050919050565b60006148d9602a836153b6565b91506148e482615b71565b604082019050919050565b60006148fc6029836153b6565b915061490782615bc0565b604082019050919050565b600061491f6020836153b6565b915061492a82615c0f565b602082019050919050565b6000614942602c836153b6565b915061494d82615c38565b604082019050919050565b60006149656020836153b6565b915061497082615c87565b602082019050919050565b60006149886029836153b6565b915061499382615cb0565b604082019050919050565b60006149ab602f836153b6565b91506149b682615cff565b604082019050919050565b60006149ce601a836153b6565b91506149d982615d4e565b602082019050919050565b60006149f16021836153b6565b91506149fc82615d77565b604082019050919050565b6000614a146000836153a5565b9150614a1f82615dc6565b600082019050919050565b6000614a376031836153b6565b9150614a4282615dc9565b604082019050919050565b6000614a5a602c836153b6565b9150614a6582615e18565b604082019050919050565b6000614a7d6014836153b6565b9150614a8882615e67565b602082019050919050565b606082016000820151614aa96000850182614673565b506020820151614abc6020850182614691565b506040820151614acf6040850182614b64565b50505050565b606082016000820151614aeb6000850182614673565b506020820151614afe6020850182614691565b506040820151614b116040850182614b64565b50505050565b604082016000820151614b2d60008501826143ed565b506020820151614b406020850182614b64565b50505050565b614b4f81615551565b82525050565b614b5e81615551565b82525050565b614b6d8161555b565b82525050565b614b7c8161555b565b82525050565b6000614b8e82856146f7565b9150614b9a82846146f7565b91508190509392505050565b6000602082019050614bbb60008301846143fc565b92915050565b6000608082019050614bd660008301876143fc565b614be360208301866143fc565b614bf06040830185614b55565b8181036060830152614c02818461463a565b905095945050505050565b600060a082019050614c2260008301876143fc565b614c2f60208301866143fc565b614c3c6040830185614b55565b614c4960608301846146af565b8181036080830152614c5a81614a07565b905095945050505050565b6000604082019050614c7a60008301856143fc565b614c87602083018461461c565b9392505050565b6000604082019050614ca360008301856143fc565b614cb06020830184614b55565b9392505050565b600061048082019050614ccd600083018461440b565b92915050565b600061048082019050614ce96000830184614462565b92915050565b6000610d8082019050614d0560008301846144b9565b92915050565b600061090082019050614d216000830184614510565b92915050565b60006020820190508181036000830152614d418184614567565b905092915050565b600061048082019050614d5f60008301846145c5565b92915050565b6000602082019050614d7a600083018461461c565b92915050565b6000602082019050614d95600083018461462b565b92915050565b6000602082019050614db06000830184614682565b92915050565b6000602082019050614dcb60008301846146a0565b92915050565b60006020820190508181036000830152614deb81846146be565b905092915050565b60006020820190508181036000830152614e0c81614728565b9050919050565b60006020820190508181036000830152614e2c8161474b565b9050919050565b60006020820190508181036000830152614e4c8161476e565b9050919050565b60006020820190508181036000830152614e6c81614791565b9050919050565b60006020820190508181036000830152614e8c816147b4565b9050919050565b60006020820190508181036000830152614eac816147d7565b9050919050565b60006020820190508181036000830152614ecc816147fa565b9050919050565b60006020820190508181036000830152614eec8161481d565b9050919050565b60006020820190508181036000830152614f0c81614840565b9050919050565b60006020820190508181036000830152614f2c81614863565b9050919050565b60006020820190508181036000830152614f4c81614886565b9050919050565b60006020820190508181036000830152614f6c816148a9565b9050919050565b60006020820190508181036000830152614f8c816148cc565b9050919050565b60006020820190508181036000830152614fac816148ef565b9050919050565b60006020820190508181036000830152614fcc81614912565b9050919050565b60006020820190508181036000830152614fec81614935565b9050919050565b6000602082019050818103600083015261500c81614958565b9050919050565b6000602082019050818103600083015261502c8161497b565b9050919050565b6000602082019050818103600083015261504c8161499e565b9050919050565b6000602082019050818103600083015261506c816149c1565b9050919050565b6000602082019050818103600083015261508c816149e4565b9050919050565b600060208201905081810360008301526150ac81614a2a565b9050919050565b600060208201905081810360008301526150cc81614a4d565b9050919050565b600060208201905081810360008301526150ec81614a70565b9050919050565b60006060820190506151086000830184614ad5565b92915050565b60006020820190506151236000830184614b55565b92915050565b600060208201905061513e6000830184614b73565b92915050565b60006040820190506151596000830185614b73565b6151666020830184614682565b9392505050565b60006040820190506151826000830185614b73565b61518f60208301846146a0565b9392505050565b60006040820190506151ab6000830185614b73565b6151b86020830184614b73565b9392505050565b60006080820190506151d46000830187614b73565b6151e16020830186614b73565b6151ee6040830185614b73565b6151fb6060830184614b73565b95945050505050565b600061520e61521f565b905061521a8282615612565b919050565b6000604051905090565b600067ffffffffffffffff82111561524457615243615801565b5b61524d82615844565b9050602081019050919050565b600067ffffffffffffffff82111561527557615274615801565b5b61527e82615844565b9050602081019050919050565b6000819050919050565b6000819050919050565b6000819050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b600060249050919050565b600060249050919050565b600060249050919050565b600060249050919050565b600081519050919050565b600060249050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153dd82615551565b91506153e883615551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561541d5761541c6156e7565b5b828201905092915050565b600061543382615551565b915061543e83615551565b92508261544e5761544d615716565b5b828204905092915050565b600061546482615551565b915061546f83615551565b925082821015615482576154816156e7565b5b828203905092915050565b60006154988261555b565b91506154a38361555b565b9250828210156154b6576154b56156e7565b5b828203905092915050565b60006154cc82615531565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061551982615e90565b919050565b600081905061552c82615ea4565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006155738261550b565b9050919050565b60006155858261551e565b9050919050565b600061559782615551565b9050919050565b82818337600083830152505050565b60005b838110156155cb5780820151818401526020810190506155b0565b838111156155da576000848401525b50505050565b600060028204905060018216806155f857607f821691505b6020821081141561560c5761560b615774565b5b50919050565b61561b82615844565b810181811067ffffffffffffffff8211171561563a57615639615801565b5b80604052505050565b600061564e82615551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615681576156806156e7565b5b600182019050919050565b60006156978261555b565b915060ff8214156156ab576156aa6156e7565b5b600182019050919050565b60006156c182615551565b91506156cc83615551565b9250826156dc576156db615716565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f504c5320454e544552204944204245545745454e20312d333600000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f552052204e4f5420544845204f574e4552204f46205448495320474c4943504960008201527f5820474f4444414d4e4954210000000000000000000000000000000000000000602082015250565b7f594f5520415245204e4f5420544845204f574e4552204f46205448495320474c60008201527f494350495820474f4444414d4e49542100000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f594f5520444f4e2754204f574e205448495320474c4943504958000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f504c5320454e54455220494453204245545745454e20312d3336000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f57524f4e4720474c4943504958204e554d424552000000000000000000000000600082015250565b60048110615ea157615ea0615745565b5b50565b60048110615eb557615eb4615745565b5b50565b615ec1816154c1565b8114615ecc57600080fd5b50565b615ed8816154d3565b8114615ee357600080fd5b50565b615eef816154df565b8114615efa57600080fd5b50565b60048110615f0a57600080fd5b50565b60048110615f1a57600080fd5b50565b615f2681615551565b8114615f3157600080fd5b50565b615f3d8161555b565b8114615f4857600080fd5b5056fe516d5a7a3356556937327a7045696e6976637a50505557567061575965534b6f7a386f4b63417570773950555547516d59756d76444e4779694e324d795051634e42615537686e65736d774a697476716970794e324833664632746ba2646970667358221220f308ee1b3fac094d06d514df0a3c09f1c5322c96435360e2aeb853d40501fcc964736f6c63430008060033

Deployed Bytecode Sourcemap

45468:12966:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36766:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24656:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26215:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25738:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54960:759;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37406:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27105:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37074:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54049:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45581:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54487:465;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57462:481;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46447:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27515:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57955:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37596:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52281:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45963:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52392:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24350:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24080:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2518:94;;;:::i;:::-;;46273:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;58209:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56691:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52515:540;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1867:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45619:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51732:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24825:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26508:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45863:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27771:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55805:448;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46393:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25000:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53765:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45550:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53132:309;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45714:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53453:300;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26874:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56271:402;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51493:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2767:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46493:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36766:224;36868:4;36907:35;36892:50;;;:11;:50;;;;:90;;;;36946:36;36970:11;36946:23;:36::i;:::-;36892:90;36885:97;;36766:224;;;:::o;24656:100::-;24710:13;24743:5;24736:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24656:100;:::o;26215:221::-;26291:7;26319:16;26327:7;26319;:16::i;:::-;26311:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26404:15;:24;26420:7;26404:24;;;;;;;;;;;;;;;;;;;;;26397:31;;26215:221;;;:::o;25738:411::-;25819:13;25835:23;25850:7;25835:14;:23::i;:::-;25819:39;;25883:5;25877:11;;:2;:11;;;;25869:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25977:5;25961:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25986:37;26003:5;26010:12;:10;:12::i;:::-;25986:16;:37::i;:::-;25961:62;25939:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26120:21;26129:2;26133:7;26120:8;:21::i;:::-;25808:341;25738:411;;:::o;54960:759::-;55026:28;;:::i;:::-;55087:1;55076:8;:12;;;:29;;;;;55103:2;55092:8;:13;;;55076:29;55067:39;;;;;;55117;;:::i;:::-;55178:7;55188:1;55178:11;;55173:511;55195:2;55191:1;:6;;;55173:511;;;55219:34;;:::i;:::-;55268:22;55293:10;:20;55304:8;55293:20;;;;;;;;;;;;;;;:23;55314:1;55293:23;;;;;;;;;;;;;;;55268:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55337:5;:14;;;:47;;;;;55374:10;55382:1;55374:10;;:7;:10::i;:::-;55355:29;;:5;:15;;;:29;;;55337:47;55333:268;;;55420:1;55405:9;:12;;:16;;;;;;;;;;;55462:5;:15;;;55440:9;:19;;:37;;;;;;;;;;;55333:268;;;55533:1;55518:9;:12;;:16;;;;;;;;;;;55583:1;55553:9;:19;;:32;;;;;;;;;;;55333:268;55649:9;55629:10;55644:1;55640;:5;;;;:::i;:::-;55629:17;;;;;;;;;:::i;:::-;;;;;:29;;;;55204:480;;55199:3;;;;;:::i;:::-;;;;55173:511;;;;55701:10;55694:17;;;54960:759;;;:::o;37406:113::-;37467:7;37494:10;:17;;;;37487:24;;37406:113;:::o;27105:339::-;27300:41;27319:12;:10;:12::i;:::-;27333:7;27300:18;:41::i;:::-;27292:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27408:28;27418:4;27424:2;27428:7;27408:9;:28::i;:::-;27105:339;;;:::o;37074:256::-;37171:7;37207:23;37224:5;37207:16;:23::i;:::-;37199:5;:31;37191:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37296:12;:19;37309:5;37296:19;;;;;;;;;;;;;;;:26;37316:5;37296:26;;;;;;;;;;;;37289:33;;37074:256;;;;:::o;54049:430::-;54108:18;;:::i;:::-;54163:1;54157:3;:7;;;:18;;;;;54173:2;54168:3;:7;;;54157:18;54149:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54217:30;;:::i;:::-;54277:8;:13;54286:3;54277:13;;;;;;;;;;;;;;;;;;;;;;;;;54258:11;:16;;:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;54324:12;:17;54337:3;54324:17;;;;;;;;;;;;;;;;;;;;;;;;;54301:11;:20;;:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;54375:20;:25;54396:3;54375:25;;;;;;;;;;;;;;;;;;;;;;;;;54352:11;:20;;:48;;;;;;;;;;;54439:11;54418:43;;;54049:430;;;:::o;45581:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54487:465::-;54539:22;;:::i;:::-;54574:33;;:::i;:::-;54629:7;54639:1;54629:11;;54624:293;54646:2;54642:1;:6;;;54624:293;;;54670:30;;:::i;:::-;54734:8;:11;54743:1;54734:11;;;;;;;;;;;;;;;;;;;;;;;;;54715;:16;;:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;54783:12;:15;54796:1;54783:15;;;;;;;;;;;;;;;;;;;;;;;;;54760:11;:20;;:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;54836:20;:23;54857:1;54836:23;;;;;;;;;;;;;;;;;;;;;;;;;54813:11;:20;;:46;;;;;;;;;;;54894:11;54876:10;54889:1;54887;:3;;;;:::i;:::-;54876:15;;;;;;;;;:::i;:::-;;;;;:29;;;;54655:262;54650:3;;;;;:::i;:::-;;;;54624:293;;;;54934:10;54927:17;;;54487:465;:::o;57462:481::-;57550:1;57541:6;:10;;;:25;;;;;57564:2;57555:6;:11;;;57541:25;:39;;;;;57579:1;57570:6;:10;;;57541:39;:54;;;;;57593:2;57584:6;:11;;;57541:54;57532:64;;;;;;57637:10;57618:29;;:15;57626:6;57618:15;;:7;:15::i;:::-;:29;;;:62;;;;;57670:10;57651:29;;:15;57659:6;57651:15;;:7;:15::i;:::-;:29;;;57618:62;57609:72;;;;;;57691:10;57704:20;:28;57725:6;57704:28;;;;;;;;;;;;;;;;;;;;;;;;;57691:41;;57740:10;57753:20;:28;57774:6;57753:28;;;;;;;;;;;;;;;;;;;;;;;;;57740:41;;57820:4;57789:20;:28;57810:6;57789:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;57863:4;57832:20;:28;57853:6;57832:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;57890:45;57908:6;57916:4;57922:6;57930:4;57890:45;;;;;;;;;:::i;:::-;;;;;;;;57524:419;;57462:481;;:::o;46447:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;27515:185::-;27653:39;27670:4;27676:2;27680:7;27653:39;;;;;;;;;;;;:16;:39::i;:::-;27515:185;;;:::o;57955:242::-;58051:1;58045:3;:7;;;:19;;;;;58062:2;58056:3;:8;;;58045:19;58036:29;;;;;;58098:10;58082:26;;:12;58090:3;58082:12;;:7;:12::i;:::-;:26;;;58074:35;;;;;;58137:9;58117:12;:17;58130:3;58117:17;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;58159:30;58174:3;58179:9;58159:30;;;;;;;:::i;:::-;;;;;;;;57955:242;;:::o;37596:233::-;37671:7;37707:30;:28;:30::i;:::-;37699:5;:38;37691:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37804:10;37815:5;37804:17;;;;;;;;:::i;:::-;;;;;;;;;;37797:24;;37596:233;;;:::o;52281:102::-;2098:12;:10;:12::i;:::-;2087:23;;:7;:5;:7::i;:::-;:23;;;2079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52368:7:::1;52352:13;:23;;;;;;;;;;;;:::i;:::-;;52281:102:::0;:::o;45963:43::-;;;;;;;;;;;;;;;;;:::o;52392:108::-;2098:12;:10;:12::i;:::-;2087:23;;:7;:5;:7::i;:::-;:23;;;2079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:5:::1;52464:17;:25;;;;;;;;;;;;:::i;:::-;;52392:108:::0;:::o;24350:239::-;24422:7;24442:13;24458:7;:16;24466:7;24458:16;;;;;;;;;;;;;;;;;;;;;24442:32;;24510:1;24493:19;;:5;:19;;;;24485:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24576:5;24569:12;;;24350:239;;;:::o;24080:208::-;24152:7;24197:1;24180:19;;:5;:19;;;;24172:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24264:9;:16;24274:5;24264:16;;;;;;;;;;;;;;;;24257:23;;24080:208;;;:::o;2518:94::-;2098:12;:10;:12::i;:::-;2087:23;;:7;:5;:7::i;:::-;:23;;;2079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2583:21:::1;2601:1;2583:9;:21::i;:::-;2518:94::o:0;46273:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58209:216::-;58295:1;58289:3;:7;;;:19;;;;;58306:2;58300:3;:8;;;58289:19;58280:29;;;;;;58342:10;58326:26;;:12;58334:3;58326:12;;:7;:12::i;:::-;:26;;;58318:35;;;;;;58377:5;58361:8;:13;58370:3;58361:13;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;58395:22;58406:3;58411:5;58395:22;;;;;;;:::i;:::-;;;;;;;;58209:216;;:::o;56691:682::-;56795:10;56775:30;;:16;56783:7;56775:16;;:7;:16::i;:::-;:30;;;56766:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56869:23;56895:10;:19;56906:7;56895:19;;;;;;;;;;;;;;;:29;56915:8;56895:29;;;;;;;;;;;;;;;56869:55;;56947:5;:14;;;;;;;;;;;;:54;;;;;56984:17;56992:8;56984:17;;:7;:17::i;:::-;56965:36;;:5;:15;;;;;;;;;;;;:36;;;56947:54;56939:63;;;;;;57030:5;57013;:14;;;:22;;;;;;;;;;;;;;;;;;57053:10;57066:20;:29;57087:7;57066:29;;;;;;;;;;;;;;;;;;;;;;;;;57053:42;;57103:10;57116:20;:30;57137:8;57116:30;;;;;;;;;;;;;;;;;;;;;;;;;57103:43;;57186:4;57154:20;:29;57175:7;57154:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57231:4;57198:20;:30;57219:8;57198:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57258:48;57276:7;57285:4;57291:8;57301:4;57258:48;;;;;;;;;:::i;:::-;;;;;;;;57322:36;57340:7;57349:8;57322:36;;;;;;;:::i;:::-;;;;;;;;56758:615;;;56691:682;;:::o;52515:540::-;52576:16;52606:18;52627:17;52637:6;52627:9;:17::i;:::-;52606:38;;52673:1;52659:10;:15;52655:393;;;52750:1;52736:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52729:23;;;;;52655:393;52785:23;52825:10;52811:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52785:51;;52851:13;52879:130;52903:10;52895:5;:18;52879:130;;;52959:34;52979:6;52987:5;52959:19;:34::i;:::-;52943:6;52950:5;52943:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;52915:7;;;;;:::i;:::-;;;;52879:130;;;53030:6;53023:13;;;;;52515:540;;;;:::o;1867:87::-;1913:7;1940:6;;;;;;;;;;;1933:13;;1867:87;:::o;45619:91::-;;;;;;;;;;;;;;;;;;;:::o;51732:415::-;51800:1;51794:3;:7;:19;;;;;51811:2;51805:3;:8;51794:19;51786:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;51946:1;45915:42;51858:52;;;51911:10;51923:13;:18;51937:3;51923:18;;;;;;;;;;;;51858:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;51849:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;45915:42;51989:59;;;52049:10;52069:4;52076:13;:18;52090:3;52076:18;;;;;;;;;;;;52096:1;51989:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52113:26;52123:10;52135:3;52113:9;:26::i;:::-;51732:415;:::o;24825:104::-;24881:13;24914:7;24907:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24825:104;:::o;26508:295::-;26623:12;:10;:12::i;:::-;26611:24;;:8;:24;;;;26603:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26723:8;26678:18;:32;26697:12;:10;:12::i;:::-;26678:32;;;;;;;;;;;;;;;:42;26711:8;26678:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26776:8;26747:48;;26762:12;:10;:12::i;:::-;26747:48;;;26786:8;26747:48;;;;;;:::i;:::-;;;;;;;;26508:295;;:::o;45863:94::-;45915:42;45863:94;:::o;27771:328::-;27946:41;27965:12;:10;:12::i;:::-;27979:7;27946:18;:41::i;:::-;27938:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28052:39;28066:4;28072:2;28076:7;28085:5;28052:13;:39::i;:::-;27771:328;;;;:::o;55805:448::-;55898:1;55888:7;:11;;;:27;;;;;55913:2;55903:7;:12;;;55888:27;:43;;;;;55930:1;55919:8;:12;;;55888:43;:60;;;;;55946:2;55935:8;:13;;;55888:60;55879:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;56016:10;55996:30;;:16;56004:7;55996:16;;:7;:16::i;:::-;:30;;;55987:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;56130:10;56088;:20;56099:8;56088:20;;;;;;;;;;;;;;;:29;56109:7;56088:29;;;;;;;;;;;;;;;:39;;;:52;;;;;;;;;;;;;;;;;;56189:4;56148:10;:20;56159:8;56148:20;;;;;;;;;;;;;;;:29;56169:7;56148:29;;;;;;;;;;;;;;;:38;;;:45;;;;;;;;;;;;;;;;;;56213:32;56227:7;56236:8;56213:32;;;;;;;:::i;:::-;;;;;;;;55805:448;;:::o;46393:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;25000:334::-;25073:13;25107:16;25115:7;25107;:16::i;:::-;25099:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25188:21;25212:10;:8;:10::i;:::-;25188:34;;25264:1;25246:7;25240:21;:25;:86;;;;;;;;;;;;;;;;;25292:7;25301:18;:7;:16;:18::i;:::-;25275:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25240:86;25233:93;;;25000:334;;;:::o;53765:272::-;53812:15;;:::i;:::-;53850:28;;:::i;:::-;53904:7;53914:1;53904:11;;53899:91;53921:2;53917:1;:6;;;53899:91;;;53967:8;:11;53976:1;53967:11;;;;;;;;;;;;;;;;;;;;;;;;;53945:12;53962:1;53958;:5;;;;:::i;:::-;53945:19;;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;53925:3;;;;;:::i;:::-;;;;53899:91;;;;54017:12;54010:19;;;53765:272;:::o;45550:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53132:309::-;53193:16;;:::i;:::-;53232:32;;:::i;:::-;53290:7;53300:1;53290:11;;53285:106;53307:2;53303:1;:6;;;53285:106;;;53356:20;:23;53377:1;53356:23;;;;;;;;;;;;;;;;;;;;;;;;;53331:15;53351:1;53347;:5;;;;:::i;:::-;53331:22;;;;;;;;;:::i;:::-;;;;;:48;;;;;;;;;;;53311:3;;;;;:::i;:::-;;;;53285:106;;;;53418:15;53411:22;;;53132:309;:::o;45714:97::-;;;;;;;;;;;;;;;;;;;:::o;53453:300::-;53504:19;;:::i;:::-;53546:36;;:::i;:::-;53608:7;53618:1;53608:11;;53603:99;53625:2;53621:1;:6;;;53603:99;;;53675:12;:15;53688:1;53675:15;;;;;;;;;;;;;;;;;;;;;;;;;53649:16;53670:1;53666;:5;;;;:::i;:::-;53649:23;;;;;;;;;:::i;:::-;;;;;:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;53629:3;;;;;:::i;:::-;;;;53603:99;;;;53729:16;53722:23;;;53453:300;:::o;26874:164::-;26971:4;26995:18;:25;27014:5;26995:25;;;;;;;;;;;;;;;:35;27021:8;26995:35;;;;;;;;;;;;;;;;;;;;;;;;;26988:42;;26874:164;;;;:::o;56271:402::-;56380:10;56360:30;;:16;56368:7;56360:16;;:7;:16::i;:::-;:30;;;56351:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56447:23;56473:10;:20;56484:8;56473:20;;;;;;;;;;;;;;;:29;56494:7;56473:29;;;;;;;;;;;;;;;56447:55;;56541:10;56522:29;;:5;:15;;;;;;;;;;;;:29;;;:47;;;;;56555:5;:14;;;;;;;;;;;;56522:47;56513:57;;;;;;56598:5;56581;:14;;;:22;;;;;;;;;;;;;;;;;;56629:36;56647:7;56656:8;56629:36;;;;;;;:::i;:::-;;;;;;;;56343:330;56271:402;;:::o;51493:227::-;51655:6;51681:31;;;51674:38;;51493:227;;;;;;;:::o;2767:192::-;2098:12;:10;:12::i;:::-;2087:23;;:7;:5;:7::i;:::-;:23;;;2079:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2876:1:::1;2856:22;;:8;:22;;;;2848:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2932:19;2942:8;2932:9;:19::i;:::-;2767:192:::0;:::o;46493:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;13582:387::-;13642:4;13850:12;13917:7;13905:20;13897:28;;13960:1;13953:4;:8;13946:15;;;13582:387;;;:::o;35705:126::-;;;;:::o;23711:305::-;23813:4;23865:25;23850:40;;;:11;:40;;;;:105;;;;23922:33;23907:48;;;:11;:48;;;;23850:105;:158;;;;23972:36;23996:11;23972:23;:36::i;:::-;23850:158;23830:178;;23711:305;;;:::o;29609:127::-;29674:4;29726:1;29698:30;;:7;:16;29706:7;29698:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29691:37;;29609:127;;;:::o;655:98::-;708:7;735:10;728:17;;655:98;:::o;33591:174::-;33693:2;33666:15;:24;33682:7;33666:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33749:7;33745:2;33711:46;;33720:23;33735:7;33720:14;:23::i;:::-;33711:46;;;;;;;;;;;;33591:174;;:::o;29903:348::-;29996:4;30021:16;30029:7;30021;:16::i;:::-;30013:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30097:13;30113:23;30128:7;30113:14;:23::i;:::-;30097:39;;30166:5;30155:16;;:7;:16;;;:51;;;;30199:7;30175:31;;:20;30187:7;30175:11;:20::i;:::-;:31;;;30155:51;:87;;;;30210:32;30227:5;30234:7;30210:16;:32::i;:::-;30155:87;30147:96;;;29903:348;;;;:::o;32895:578::-;33054:4;33027:31;;:23;33042:7;33027:14;:23::i;:::-;:31;;;33019:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33137:1;33123:16;;:2;:16;;;;33115:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33193:39;33214:4;33220:2;33224:7;33193:20;:39::i;:::-;33297:29;33314:1;33318:7;33297:8;:29::i;:::-;33358:1;33339:9;:15;33349:4;33339:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33387:1;33370:9;:13;33380:2;33370:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33418:2;33399:7;:16;33407:7;33399:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33457:7;33453:2;33438:27;;33447:4;33438:27;;;;;;;;;;;;32895:578;;;:::o;2967:173::-;3023:16;3042:6;;;;;;;;;;;3023:25;;3068:8;3059:6;;:17;;;;;;;;;;;;;;;;;;3123:8;3092:40;;3113:8;3092:40;;;;;;;;;;;;3012:128;2967:173;:::o;30593:110::-;30669:26;30679:2;30683:7;30669:26;;;;;;;;;;;;:9;:26::i;:::-;30593:110;;:::o;28981:315::-;29138:28;29148:4;29154:2;29158:7;29138:9;:28::i;:::-;29185:48;29208:4;29214:2;29218:7;29227:5;29185:22;:48::i;:::-;29177:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28981:315;;;;:::o;52155:114::-;52215:13;52248;52241:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52155:114;:::o;11057:723::-;11113:13;11343:1;11334:5;:10;11330:53;;;11361:10;;;;;;;;;;;;;;;;;;;;;11330:53;11393:12;11408:5;11393:20;;11424:14;11449:78;11464:1;11456:4;:9;11449:78;;11482:8;;;;;:::i;:::-;;;;11513:2;11505:10;;;;;:::i;:::-;;;11449:78;;;11537:19;11569:6;11559:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11537:39;;11587:154;11603:1;11594:5;:10;11587:154;;11631:1;11621:11;;;;;:::i;:::-;;;11698:2;11690:5;:10;;;;:::i;:::-;11677:2;:24;;;;:::i;:::-;11664:39;;11647:6;11654;11647:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11727:2;11718:11;;;;;:::i;:::-;;;11587:154;;;11765:6;11751:21;;;;;11057:723;;;;:::o;4792:157::-;4877:4;4916:25;4901:40;;;:11;:40;;;;4894:47;;4792:157;;;:::o;38442:589::-;38586:45;38613:4;38619:2;38623:7;38586:26;:45::i;:::-;38664:1;38648:18;;:4;:18;;;38644:187;;;38683:40;38715:7;38683:31;:40::i;:::-;38644:187;;;38753:2;38745:10;;:4;:10;;;38741:90;;38772:47;38805:4;38811:7;38772:32;:47::i;:::-;38741:90;38644:187;38859:1;38845:16;;:2;:16;;;38841:183;;;38878:45;38915:7;38878:36;:45::i;:::-;38841:183;;;38951:4;38945:10;;:2;:10;;;38941:83;;38972:40;39000:2;39004:7;38972:27;:40::i;:::-;38941:83;38841:183;38442:589;;;:::o;30930:321::-;31060:18;31066:2;31070:7;31060:5;:18::i;:::-;31111:54;31142:1;31146:2;31150:7;31159:5;31111:22;:54::i;:::-;31089:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30930:321;;;:::o;34330:803::-;34485:4;34506:15;:2;:13;;;:15::i;:::-;34502:624;;;34558:2;34542:36;;;34579:12;:10;:12::i;:::-;34593:4;34599:7;34608:5;34542:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34538:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34805:1;34788:6;:13;:18;34784:272;;;34831:60;;;;;;;;;;:::i;:::-;;;;;;;;34784:272;35006:6;35000:13;34991:6;34987:2;34983:15;34976:38;34538:533;34675:45;;;34665:55;;;:6;:55;;;;34658:62;;;;;34502:624;35110:4;35103:11;;34330:803;;;;;;;:::o;39754:164::-;39858:10;:17;;;;39831:15;:24;39847:7;39831:24;;;;;;;;;;;:44;;;;39886:10;39902:7;39886:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39754:164;:::o;40545:988::-;40811:22;40861:1;40836:22;40853:4;40836:16;:22::i;:::-;:26;;;;:::i;:::-;40811:51;;40873:18;40894:17;:26;40912:7;40894:26;;;;;;;;;;;;40873:47;;41041:14;41027:10;:28;41023:328;;41072:19;41094:12;:18;41107:4;41094:18;;;;;;;;;;;;;;;:34;41113:14;41094:34;;;;;;;;;;;;41072:56;;41178:11;41145:12;:18;41158:4;41145:18;;;;;;;;;;;;;;;:30;41164:10;41145:30;;;;;;;;;;;:44;;;;41295:10;41262:17;:30;41280:11;41262:30;;;;;;;;;;;:43;;;;41057:294;41023:328;41447:17;:26;41465:7;41447:26;;;;;;;;;;;41440:33;;;41491:12;:18;41504:4;41491:18;;;;;;;;;;;;;;;:34;41510:14;41491:34;;;;;;;;;;;41484:41;;;40626:907;;40545:988;;:::o;41828:1079::-;42081:22;42126:1;42106:10;:17;;;;:21;;;;:::i;:::-;42081:46;;42138:18;42159:15;:24;42175:7;42159:24;;;;;;;;;;;;42138:45;;42510:19;42532:10;42543:14;42532:26;;;;;;;;:::i;:::-;;;;;;;;;;42510:48;;42596:11;42571:10;42582;42571:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42707:10;42676:15;:28;42692:11;42676:28;;;;;;;;;;;:41;;;;42848:15;:24;42864:7;42848:24;;;;;;;;;;;42841:31;;;42883:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41899:1008;;;41828:1079;:::o;39332:221::-;39417:14;39434:20;39451:2;39434:16;:20::i;:::-;39417:37;;39492:7;39465:12;:16;39478:2;39465:16;;;;;;;;;;;;;;;:24;39482:6;39465:24;;;;;;;;;;;:34;;;;39539:6;39510:17;:26;39528:7;39510:26;;;;;;;;;;;:35;;;;39406:147;39332:221;;:::o;31587:382::-;31681:1;31667:16;;:2;:16;;;;31659:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31740:16;31748:7;31740;:16::i;:::-;31739:17;31731:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31802:45;31831:1;31835:2;31839:7;31802:20;:45::i;:::-;31877:1;31860:9;:13;31870:2;31860:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31908:2;31889:7;:16;31897:7;31889:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31953:7;31949:2;31928:33;;31945:1;31928:33;;;;;;;;;;;;31587:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;1035:84;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1176:86;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1330:79;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1540:79;;:::i;:::-;1499:2;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;;;;;:::o;1772:157::-;1827:5;1865:6;1852:20;1843:29;;1881:42;1917:5;1881:42;:::i;:::-;1833:96;;;;:::o;1935:165::-;1994:5;2032:6;2019:20;2010:29;;2048:46;2088:5;2048:46;:::i;:::-;2000:100;;;;:::o;2120:340::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2233:79;;:::i;:::-;2192:2;2350:6;2337:20;2375:79;2450:3;2442:6;2435:4;2427:6;2423:17;2375:79;:::i;:::-;2366:88;;2182:278;;;;;:::o;2466:139::-;2512:5;2550:6;2537:20;2528:29;;2566:33;2593:5;2566:33;:::i;:::-;2518:87;;;;:::o;2611:143::-;2668:5;2699:6;2693:13;2684:22;;2715:33;2742:5;2715:33;:::i;:::-;2674:80;;;;:::o;2760:135::-;2804:5;2842:6;2829:20;2820:29;;2858:31;2883:5;2858:31;:::i;:::-;2810:85;;;;:::o;2901:329::-;2960:6;3009:2;2997:9;2988:7;2984:23;2980:32;2977:2;;;3015:79;;:::i;:::-;2977:2;3135:1;3160:53;3205:7;3196:6;3185:9;3181:22;3160:53;:::i;:::-;3150:63;;3106:117;2967:263;;;;:::o;3236:474::-;3304:6;3312;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3367:79;;:::i;:::-;3329:2;3487:1;3512:53;3557:7;3548:6;3537:9;3533:22;3512:53;:::i;:::-;3502:63;;3458:117;3614:2;3640:53;3685:7;3676:6;3665:9;3661:22;3640:53;:::i;:::-;3630:63;;3585:118;3319:391;;;;;:::o;3716:619::-;3793:6;3801;3809;3858:2;3846:9;3837:7;3833:23;3829:32;3826:2;;;3864:79;;:::i;:::-;3826:2;3984:1;4009:53;4054:7;4045:6;4034:9;4030:22;4009:53;:::i;:::-;3999:63;;3955:117;4111:2;4137:53;4182:7;4173:6;4162:9;4158:22;4137:53;:::i;:::-;4127:63;;4082:118;4239:2;4265:53;4310:7;4301:6;4290:9;4286:22;4265:53;:::i;:::-;4255:63;;4210:118;3816:519;;;;;:::o;4341:943::-;4436:6;4444;4452;4460;4509:3;4497:9;4488:7;4484:23;4480:33;4477:2;;;4516:79;;:::i;:::-;4477:2;4636:1;4661:53;4706:7;4697:6;4686:9;4682:22;4661:53;:::i;:::-;4651:63;;4607:117;4763:2;4789:53;4834:7;4825:6;4814:9;4810:22;4789:53;:::i;:::-;4779:63;;4734:118;4891:2;4917:53;4962:7;4953:6;4942:9;4938:22;4917:53;:::i;:::-;4907:63;;4862:118;5047:2;5036:9;5032:18;5019:32;5078:18;5070:6;5067:30;5064:2;;;5100:79;;:::i;:::-;5064:2;5205:62;5259:7;5250:6;5239:9;5235:22;5205:62;:::i;:::-;5195:72;;4990:287;4467:817;;;;;;;:::o;5290:1089::-;5394:6;5402;5410;5418;5426;5475:3;5463:9;5454:7;5450:23;5446:33;5443:2;;;5482:79;;:::i;:::-;5443:2;5602:1;5627:53;5672:7;5663:6;5652:9;5648:22;5627:53;:::i;:::-;5617:63;;5573:117;5729:2;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5700:118;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;5985:2;6011:53;6056:7;6047:6;6036:9;6032:22;6011:53;:::i;:::-;6001:63;;5956:118;6141:3;6130:9;6126:19;6113:33;6173:18;6165:6;6162:30;6159:2;;;6195:79;;:::i;:::-;6159:2;6300:62;6354:7;6345:6;6334:9;6330:22;6300:62;:::i;:::-;6290:72;;6084:288;5433:946;;;;;;;;:::o;6385:468::-;6450:6;6458;6507:2;6495:9;6486:7;6482:23;6478:32;6475:2;;;6513:79;;:::i;:::-;6475:2;6633:1;6658:53;6703:7;6694:6;6683:9;6679:22;6658:53;:::i;:::-;6648:63;;6604:117;6760:2;6786:50;6828:7;6819:6;6808:9;6804:22;6786:50;:::i;:::-;6776:60;;6731:115;6465:388;;;;;:::o;6859:474::-;6927:6;6935;6984:2;6972:9;6963:7;6959:23;6955:32;6952:2;;;6990:79;;:::i;:::-;6952:2;7110:1;7135:53;7180:7;7171:6;7160:9;7156:22;7135:53;:::i;:::-;7125:63;;7081:117;7237:2;7263:53;7308:7;7299:6;7288:9;7284:22;7263:53;:::i;:::-;7253:63;;7208:118;6942:391;;;;;:::o;7339:327::-;7397:6;7446:2;7434:9;7425:7;7421:23;7417:32;7414:2;;;7452:79;;:::i;:::-;7414:2;7572:1;7597:52;7641:7;7632:6;7621:9;7617:22;7597:52;:::i;:::-;7587:62;;7543:116;7404:262;;;;:::o;7672:349::-;7741:6;7790:2;7778:9;7769:7;7765:23;7761:32;7758:2;;;7796:79;;:::i;:::-;7758:2;7916:1;7941:63;7996:7;7987:6;7976:9;7972:22;7941:63;:::i;:::-;7931:73;;7887:127;7748:273;;;;:::o;8027:509::-;8096:6;8145:2;8133:9;8124:7;8120:23;8116:32;8113:2;;;8151:79;;:::i;:::-;8113:2;8299:1;8288:9;8284:17;8271:31;8329:18;8321:6;8318:30;8315:2;;;8351:79;;:::i;:::-;8315:2;8456:63;8511:7;8502:6;8491:9;8487:22;8456:63;:::i;:::-;8446:73;;8242:287;8103:433;;;;:::o;8542:329::-;8601:6;8650:2;8638:9;8629:7;8625:23;8621:32;8618:2;;;8656:79;;:::i;:::-;8618:2;8776:1;8801:53;8846:7;8837:6;8826:9;8822:22;8801:53;:::i;:::-;8791:63;;8747:117;8608:263;;;;:::o;8877:351::-;8947:6;8996:2;8984:9;8975:7;8971:23;8967:32;8964:2;;;9002:79;;:::i;:::-;8964:2;9122:1;9147:64;9203:7;9194:6;9183:9;9179:22;9147:64;:::i;:::-;9137:74;;9093:128;8954:274;;;;:::o;9234:325::-;9291:6;9340:2;9328:9;9319:7;9315:23;9311:32;9308:2;;;9346:79;;:::i;:::-;9308:2;9466:1;9491:51;9534:7;9525:6;9514:9;9510:22;9491:51;:::i;:::-;9481:61;;9437:115;9298:261;;;;:::o;9565:488::-;9640:6;9648;9697:2;9685:9;9676:7;9672:23;9668:32;9665:2;;;9703:79;;:::i;:::-;9665:2;9823:1;9848:51;9891:7;9882:6;9871:9;9867:22;9848:51;:::i;:::-;9838:61;;9794:115;9948:2;9974:62;10028:7;10019:6;10008:9;10004:22;9974:62;:::i;:::-;9964:72;;9919:127;9655:398;;;;;:::o;10059:496::-;10138:6;10146;10195:2;10183:9;10174:7;10170:23;10166:32;10163:2;;;10201:79;;:::i;:::-;10163:2;10321:1;10346:51;10389:7;10380:6;10369:9;10365:22;10346:51;:::i;:::-;10336:61;;10292:115;10446:2;10472:66;10530:7;10521:6;10510:9;10506:22;10472:66;:::i;:::-;10462:76;;10417:131;10153:402;;;;;:::o;10561:466::-;10625:6;10633;10682:2;10670:9;10661:7;10657:23;10653:32;10650:2;;;10688:79;;:::i;:::-;10650:2;10808:1;10833:51;10876:7;10867:6;10856:9;10852:22;10833:51;:::i;:::-;10823:61;;10779:115;10933:2;10959:51;11002:7;10993:6;10982:9;10978:22;10959:51;:::i;:::-;10949:61;;10904:116;10640:387;;;;;:::o;11033:193::-;11109:10;11130:53;11179:3;11171:6;11130:53;:::i;:::-;11215:4;11210:3;11206:14;11192:28;;11120:106;;;;:::o;11232:201::-;11312:10;11333:57;11386:3;11378:6;11333:57;:::i;:::-;11422:4;11417:3;11413:14;11399:28;;11323:110;;;;:::o;11439:295::-;11566:10;11587:104;11687:3;11679:6;11587:104;:::i;:::-;11723:4;11718:3;11714:14;11700:28;;11577:157;;;;:::o;11740:319::-;11879:10;11900:116;12012:3;12004:6;11900:116;:::i;:::-;12048:4;12043:3;12039:14;12025:28;;11890:169;;;;:::o;12065:179::-;12134:10;12155:46;12197:3;12189:6;12155:46;:::i;:::-;12233:4;12228:3;12224:14;12210:28;;12145:99;;;;:::o;12250:171::-;12315:10;12336:42;12374:3;12366:6;12336:42;:::i;:::-;12410:4;12405:3;12401:14;12387:28;;12326:95;;;;:::o;12427:108::-;12504:24;12522:5;12504:24;:::i;:::-;12499:3;12492:37;12482:53;;:::o;12541:118::-;12628:24;12646:5;12628:24;:::i;:::-;12623:3;12616:37;12606:53;;:::o;12715:739::-;12860:62;12916:5;12860:62;:::i;:::-;12938:83;13014:6;13009:3;12938:83;:::i;:::-;12931:90;;13045:64;13103:5;13045:64;:::i;:::-;13132:7;13163:1;13148:299;13173:6;13170:1;13167:13;13148:299;;;13249:6;13243:13;13276:70;13342:3;13327:13;13276:70;:::i;:::-;13269:77;;13369:68;13430:6;13369:68;:::i;:::-;13359:78;;13208:239;13195:1;13192;13188:9;13183:14;;13148:299;;;13152:14;12836:618;;;;;:::o;13514:759::-;13663:66;13723:5;13663:66;:::i;:::-;13745:83;13821:6;13816:3;13745:83;:::i;:::-;13738:90;;13852:68;13914:5;13852:68;:::i;:::-;13943:7;13974:1;13959:307;13984:6;13981:1;13978:13;13959:307;;;14060:6;14054:13;14087:74;14157:3;14142:13;14087:74;:::i;:::-;14080:81;;14184:72;14249:6;14184:72;:::i;:::-;14174:82;;14019:247;14006:1;14003;13999:9;13994:14;;13959:307;;;13963:14;13639:634;;;;;:::o;14367:932::-;14563:82;14639:5;14563:82;:::i;:::-;14661:114;14768:6;14763:3;14661:114;:::i;:::-;14654:121;;14799:84;14877:5;14799:84;:::i;:::-;14906:7;14937:1;14922:370;14947:6;14944:1;14941:13;14922:370;;;15023:6;15017:13;15050:121;15167:3;15152:13;15050:121;:::i;:::-;15043:128;;15194:88;15275:6;15194:88;:::i;:::-;15184:98;;14982:310;14969:1;14966;14962:9;14957:14;;14922:370;;;14926:14;14539:760;;;;;:::o;15405:980::-;15613:88;15695:5;15613:88;:::i;:::-;15717:120;15830:6;15825:3;15717:120;:::i;:::-;15710:127;;15861:90;15945:5;15861:90;:::i;:::-;15974:7;16005:1;15990:388;16015:6;16012:1;16009:13;15990:388;;;16091:6;16085:13;16118:133;16247:3;16232:13;16118:133;:::i;:::-;16111:140;;16274:94;16361:6;16274:94;:::i;:::-;16264:104;;16050:328;16037:1;16034;16030:9;16025:14;;15990:388;;;15994:14;15589:796;;;;;:::o;16421:732::-;16540:3;16569:54;16617:5;16569:54;:::i;:::-;16639:86;16718:6;16713:3;16639:86;:::i;:::-;16632:93;;16749:56;16799:5;16749:56;:::i;:::-;16828:7;16859:1;16844:284;16869:6;16866:1;16863:13;16844:284;;;16945:6;16939:13;16972:63;17031:3;17016:13;16972:63;:::i;:::-;16965:70;;17058:60;17111:6;17058:60;:::i;:::-;17048:70;;16904:224;16891:1;16888;16884:9;16879:14;;16844:284;;;16848:14;17144:3;17137:10;;16545:608;;;;;;;:::o;17189:684::-;17323:51;17368:5;17323:51;:::i;:::-;17390:83;17466:6;17461:3;17390:83;:::i;:::-;17383:90;;17497:53;17544:5;17497:53;:::i;:::-;17573:7;17604:1;17589:277;17614:6;17611:1;17608:13;17589:277;;;17690:6;17684:13;17717:59;17772:3;17757:13;17717:59;:::i;:::-;17710:66;;17799:57;17849:6;17799:57;:::i;:::-;17789:67;;17649:217;17636:1;17633;17629:9;17624:14;;17589:277;;;17593:14;17299:574;;;;;:::o;17879:109::-;17960:21;17975:5;17960:21;:::i;:::-;17955:3;17948:34;17938:50;;:::o;17994:115::-;18079:23;18096:5;18079:23;:::i;:::-;18074:3;18067:36;18057:52;;:::o;18115:360::-;18201:3;18229:38;18261:5;18229:38;:::i;:::-;18283:70;18346:6;18341:3;18283:70;:::i;:::-;18276:77;;18362:52;18407:6;18402:3;18395:4;18388:5;18384:16;18362:52;:::i;:::-;18439:29;18461:6;18439:29;:::i;:::-;18434:3;18430:39;18423:46;;18205:270;;;;;:::o;18481:135::-;18565:44;18603:5;18565:44;:::i;:::-;18560:3;18553:57;18543:73;;:::o;18622:145::-;18716:44;18754:5;18716:44;:::i;:::-;18711:3;18704:57;18694:73;;:::o;18773:143::-;18861:48;18903:5;18861:48;:::i;:::-;18856:3;18849:61;18839:77;;:::o;18922:153::-;19020:48;19062:5;19020:48;:::i;:::-;19015:3;19008:61;18998:77;;:::o;19081:147::-;19176:45;19215:5;19176:45;:::i;:::-;19171:3;19164:58;19154:74;;:::o;19234:364::-;19322:3;19350:39;19383:5;19350:39;:::i;:::-;19405:71;19469:6;19464:3;19405:71;:::i;:::-;19398:78;;19485:52;19530:6;19525:3;19518:4;19511:5;19507:16;19485:52;:::i;:::-;19562:29;19584:6;19562:29;:::i;:::-;19557:3;19553:39;19546:46;;19326:272;;;;;:::o;19604:377::-;19710:3;19738:39;19771:5;19738:39;:::i;:::-;19793:89;19875:6;19870:3;19793:89;:::i;:::-;19786:96;;19891:52;19936:6;19931:3;19924:4;19917:5;19913:16;19891:52;:::i;:::-;19968:6;19963:3;19959:16;19952:23;;19714:267;;;;;:::o;19987:366::-;20129:3;20150:67;20214:2;20209:3;20150:67;:::i;:::-;20143:74;;20226:93;20315:3;20226:93;:::i;:::-;20344:2;20339:3;20335:12;20328:19;;20133:220;;;:::o;20359:366::-;20501:3;20522:67;20586:2;20581:3;20522:67;:::i;:::-;20515:74;;20598:93;20687:3;20598:93;:::i;:::-;20716:2;20711:3;20707:12;20700:19;;20505:220;;;:::o;20731:366::-;20873:3;20894:67;20958:2;20953:3;20894:67;:::i;:::-;20887:74;;20970:93;21059:3;20970:93;:::i;:::-;21088:2;21083:3;21079:12;21072:19;;20877:220;;;:::o;21103:366::-;21245:3;21266:67;21330:2;21325:3;21266:67;:::i;:::-;21259:74;;21342:93;21431:3;21342:93;:::i;:::-;21460:2;21455:3;21451:12;21444:19;;21249:220;;;:::o;21475:366::-;21617:3;21638:67;21702:2;21697:3;21638:67;:::i;:::-;21631:74;;21714:93;21803:3;21714:93;:::i;:::-;21832:2;21827:3;21823:12;21816:19;;21621:220;;;:::o;21847:366::-;21989:3;22010:67;22074:2;22069:3;22010:67;:::i;:::-;22003:74;;22086:93;22175:3;22086:93;:::i;:::-;22204:2;22199:3;22195:12;22188:19;;21993:220;;;:::o;22219:366::-;22361:3;22382:67;22446:2;22441:3;22382:67;:::i;:::-;22375:74;;22458:93;22547:3;22458:93;:::i;:::-;22576:2;22571:3;22567:12;22560:19;;22365:220;;;:::o;22591:366::-;22733:3;22754:67;22818:2;22813:3;22754:67;:::i;:::-;22747:74;;22830:93;22919:3;22830:93;:::i;:::-;22948:2;22943:3;22939:12;22932:19;;22737:220;;;:::o;22963:366::-;23105:3;23126:67;23190:2;23185:3;23126:67;:::i;:::-;23119:74;;23202:93;23291:3;23202:93;:::i;:::-;23320:2;23315:3;23311:12;23304:19;;23109:220;;;:::o;23335:366::-;23477:3;23498:67;23562:2;23557:3;23498:67;:::i;:::-;23491:74;;23574:93;23663:3;23574:93;:::i;:::-;23692:2;23687:3;23683:12;23676:19;;23481:220;;;:::o;23707:366::-;23849:3;23870:67;23934:2;23929:3;23870:67;:::i;:::-;23863:74;;23946:93;24035:3;23946:93;:::i;:::-;24064:2;24059:3;24055:12;24048:19;;23853:220;;;:::o;24079:366::-;24221:3;24242:67;24306:2;24301:3;24242:67;:::i;:::-;24235:74;;24318:93;24407:3;24318:93;:::i;:::-;24436:2;24431:3;24427:12;24420:19;;24225:220;;;:::o;24451:366::-;24593:3;24614:67;24678:2;24673:3;24614:67;:::i;:::-;24607:74;;24690:93;24779:3;24690:93;:::i;:::-;24808:2;24803:3;24799:12;24792:19;;24597:220;;;:::o;24823:366::-;24965:3;24986:67;25050:2;25045:3;24986:67;:::i;:::-;24979:74;;25062:93;25151:3;25062:93;:::i;:::-;25180:2;25175:3;25171:12;25164:19;;24969:220;;;:::o;25195:366::-;25337:3;25358:67;25422:2;25417:3;25358:67;:::i;:::-;25351:74;;25434:93;25523:3;25434:93;:::i;:::-;25552:2;25547:3;25543:12;25536:19;;25341:220;;;:::o;25567:366::-;25709:3;25730:67;25794:2;25789:3;25730:67;:::i;:::-;25723:74;;25806:93;25895:3;25806:93;:::i;:::-;25924:2;25919:3;25915:12;25908:19;;25713:220;;;:::o;25939:366::-;26081:3;26102:67;26166:2;26161:3;26102:67;:::i;:::-;26095:74;;26178:93;26267:3;26178:93;:::i;:::-;26296:2;26291:3;26287:12;26280:19;;26085:220;;;:::o;26311:366::-;26453:3;26474:67;26538:2;26533:3;26474:67;:::i;:::-;26467:74;;26550:93;26639:3;26550:93;:::i;:::-;26668:2;26663:3;26659:12;26652:19;;26457:220;;;:::o;26683:366::-;26825:3;26846:67;26910:2;26905:3;26846:67;:::i;:::-;26839:74;;26922:93;27011:3;26922:93;:::i;:::-;27040:2;27035:3;27031:12;27024:19;;26829:220;;;:::o;27055:366::-;27197:3;27218:67;27282:2;27277:3;27218:67;:::i;:::-;27211:74;;27294:93;27383:3;27294:93;:::i;:::-;27412:2;27407:3;27403:12;27396:19;;27201:220;;;:::o;27427:366::-;27569:3;27590:67;27654:2;27649:3;27590:67;:::i;:::-;27583:74;;27666:93;27755:3;27666:93;:::i;:::-;27784:2;27779:3;27775:12;27768:19;;27573:220;;;:::o;27799:362::-;27940:3;27961:65;28024:1;28019:3;27961:65;:::i;:::-;27954:72;;28035:93;28124:3;28035:93;:::i;:::-;28153:1;28148:3;28144:11;28137:18;;27944:217;;;:::o;28167:366::-;28309:3;28330:67;28394:2;28389:3;28330:67;:::i;:::-;28323:74;;28406:93;28495:3;28406:93;:::i;:::-;28524:2;28519:3;28515:12;28508:19;;28313:220;;;:::o;28539:366::-;28681:3;28702:67;28766:2;28761:3;28702:67;:::i;:::-;28695:74;;28778:93;28867:3;28778:93;:::i;:::-;28896:2;28891:3;28887:12;28880:19;;28685:220;;;:::o;28911:366::-;29053:3;29074:67;29138:2;29133:3;29074:67;:::i;:::-;29067:74;;29150:93;29239:3;29150:93;:::i;:::-;29268:2;29263:3;29259:12;29252:19;;29057:220;;;:::o;29363:701::-;29508:4;29503:3;29499:14;29595:4;29588:5;29584:16;29578:23;29614:70;29678:4;29673:3;29669:14;29655:12;29614:70;:::i;:::-;29523:171;29780:4;29773:5;29769:16;29763:23;29799:74;29867:4;29862:3;29858:14;29844:12;29799:74;:::i;:::-;29704:179;29969:4;29962:5;29958:16;29952:23;29988:59;30041:4;30036:3;30032:14;30018:12;29988:59;:::i;:::-;29893:164;29477:587;;;:::o;30150:711::-;30305:4;30300:3;30296:14;30392:4;30385:5;30381:16;30375:23;30411:70;30475:4;30470:3;30466:14;30452:12;30411:70;:::i;:::-;30320:171;30577:4;30570:5;30566:16;30560:23;30596:74;30664:4;30659:3;30655:14;30641:12;30596:74;:::i;:::-;30501:179;30766:4;30759:5;30755:16;30749:23;30785:59;30838:4;30833:3;30829:14;30815:12;30785:59;:::i;:::-;30690:164;30274:587;;;:::o;30959:516::-;31116:4;31111:3;31107:14;31208:4;31201:5;31197:16;31191:23;31227:63;31284:4;31279:3;31275:14;31261:12;31227:63;:::i;:::-;31131:169;31380:4;31373:5;31369:16;31363:23;31399:59;31452:4;31447:3;31443:14;31429:12;31399:59;:::i;:::-;31310:158;31085:390;;;:::o;31481:108::-;31558:24;31576:5;31558:24;:::i;:::-;31553:3;31546:37;31536:53;;:::o;31595:118::-;31682:24;31700:5;31682:24;:::i;:::-;31677:3;31670:37;31660:53;;:::o;31719:102::-;31792:22;31808:5;31792:22;:::i;:::-;31787:3;31780:35;31770:51;;:::o;31827:112::-;31910:22;31926:5;31910:22;:::i;:::-;31905:3;31898:35;31888:51;;:::o;31945:435::-;32125:3;32147:95;32238:3;32229:6;32147:95;:::i;:::-;32140:102;;32259:95;32350:3;32341:6;32259:95;:::i;:::-;32252:102;;32371:3;32364:10;;32129:251;;;;;:::o;32386:222::-;32479:4;32517:2;32506:9;32502:18;32494:26;;32530:71;32598:1;32587:9;32583:17;32574:6;32530:71;:::i;:::-;32484:124;;;;:::o;32614:640::-;32809:4;32847:3;32836:9;32832:19;32824:27;;32861:71;32929:1;32918:9;32914:17;32905:6;32861:71;:::i;:::-;32942:72;33010:2;32999:9;32995:18;32986:6;32942:72;:::i;:::-;33024;33092:2;33081:9;33077:18;33068:6;33024:72;:::i;:::-;33143:9;33137:4;33133:20;33128:2;33117:9;33113:18;33106:48;33171:76;33242:4;33233:6;33171:76;:::i;:::-;33163:84;;32814:440;;;;;;;:::o;33260:875::-;33545:4;33583:3;33572:9;33568:19;33560:27;;33597:71;33665:1;33654:9;33650:17;33641:6;33597:71;:::i;:::-;33678:72;33746:2;33735:9;33731:18;33722:6;33678:72;:::i;:::-;33760;33828:2;33817:9;33813:18;33804:6;33760:72;:::i;:::-;33842:80;33918:2;33907:9;33903:18;33894:6;33842:80;:::i;:::-;33970:9;33964:4;33960:20;33954:3;33943:9;33939:19;33932:49;33998:130;34123:4;33998:130;:::i;:::-;33990:138;;33550:585;;;;;;;:::o;34141:320::-;34256:4;34294:2;34283:9;34279:18;34271:26;;34307:71;34375:1;34364:9;34360:17;34351:6;34307:71;:::i;:::-;34388:66;34450:2;34439:9;34435:18;34426:6;34388:66;:::i;:::-;34261:200;;;;;:::o;34467:332::-;34588:4;34626:2;34615:9;34611:18;34603:26;;34639:71;34707:1;34696:9;34692:17;34683:6;34639:71;:::i;:::-;34720:72;34788:2;34777:9;34773:18;34764:6;34720:72;:::i;:::-;34593:206;;;;;:::o;34805:334::-;34953:4;34991;34980:9;34976:20;34968:28;;35006:126;35129:1;35118:9;35114:17;35105:6;35006:126;:::i;:::-;34958:181;;;;:::o;35145:342::-;35297:4;35335;35324:9;35320:20;35312:28;;35350:130;35477:1;35466:9;35462:17;35453:6;35350:130;:::i;:::-;35302:185;;;;:::o;35493:436::-;35692:4;35730;35719:9;35715:20;35707:28;;35745:177;35919:1;35908:9;35904:17;35895:6;35745:177;:::i;:::-;35697:232;;;;:::o;35935:460::-;36146:4;36184;36173:9;36169:20;36161:28;;36199:189;36385:1;36374:9;36370:17;36361:6;36199:189;:::i;:::-;36151:244;;;;:::o;36401:373::-;36544:4;36582:2;36571:9;36567:18;36559:26;;36631:9;36625:4;36621:20;36617:1;36606:9;36602:17;36595:47;36659:108;36762:4;36753:6;36659:108;:::i;:::-;36651:116;;36549:225;;;;:::o;36780:312::-;36917:4;36955;36944:9;36940:20;36932:28;;36970:115;37082:1;37071:9;37067:17;37058:6;36970:115;:::i;:::-;36922:170;;;;:::o;37098:210::-;37185:4;37223:2;37212:9;37208:18;37200:26;;37236:65;37298:1;37287:9;37283:17;37274:6;37236:65;:::i;:::-;37190:118;;;;:::o;37314:218::-;37405:4;37443:2;37432:9;37428:18;37420:26;;37456:69;37522:1;37511:9;37507:17;37498:6;37456:69;:::i;:::-;37410:122;;;;:::o;37538:236::-;37638:4;37676:2;37665:9;37661:18;37653:26;;37689:78;37764:1;37753:9;37749:17;37740:6;37689:78;:::i;:::-;37643:131;;;;:::o;37780:244::-;37884:4;37922:2;37911:9;37907:18;37899:26;;37935:82;38014:1;38003:9;37999:17;37990:6;37935:82;:::i;:::-;37889:135;;;;:::o;38030:313::-;38143:4;38181:2;38170:9;38166:18;38158:26;;38230:9;38224:4;38220:20;38216:1;38205:9;38201:17;38194:47;38258:78;38331:4;38322:6;38258:78;:::i;:::-;38250:86;;38148:195;;;;:::o;38349:419::-;38515:4;38553:2;38542:9;38538:18;38530:26;;38602:9;38596:4;38592:20;38588:1;38577:9;38573:17;38566:47;38630:131;38756:4;38630:131;:::i;:::-;38622:139;;38520:248;;;:::o;38774:419::-;38940:4;38978:2;38967:9;38963:18;38955:26;;39027:9;39021:4;39017:20;39013:1;39002:9;38998:17;38991:47;39055:131;39181:4;39055:131;:::i;:::-;39047:139;;38945:248;;;:::o;39199:419::-;39365:4;39403:2;39392:9;39388:18;39380:26;;39452:9;39446:4;39442:20;39438:1;39427:9;39423:17;39416:47;39480:131;39606:4;39480:131;:::i;:::-;39472:139;;39370:248;;;:::o;39624:419::-;39790:4;39828:2;39817:9;39813:18;39805:26;;39877:9;39871:4;39867:20;39863:1;39852:9;39848:17;39841:47;39905:131;40031:4;39905:131;:::i;:::-;39897:139;;39795:248;;;:::o;40049:419::-;40215:4;40253:2;40242:9;40238:18;40230:26;;40302:9;40296:4;40292:20;40288:1;40277:9;40273:17;40266:47;40330:131;40456:4;40330:131;:::i;:::-;40322:139;;40220:248;;;:::o;40474:419::-;40640:4;40678:2;40667:9;40663:18;40655:26;;40727:9;40721:4;40717:20;40713:1;40702:9;40698:17;40691:47;40755:131;40881:4;40755:131;:::i;:::-;40747:139;;40645:248;;;:::o;40899:419::-;41065:4;41103:2;41092:9;41088:18;41080:26;;41152:9;41146:4;41142:20;41138:1;41127:9;41123:17;41116:47;41180:131;41306:4;41180:131;:::i;:::-;41172:139;;41070:248;;;:::o;41324:419::-;41490:4;41528:2;41517:9;41513:18;41505:26;;41577:9;41571:4;41567:20;41563:1;41552:9;41548:17;41541:47;41605:131;41731:4;41605:131;:::i;:::-;41597:139;;41495:248;;;:::o;41749:419::-;41915:4;41953:2;41942:9;41938:18;41930:26;;42002:9;41996:4;41992:20;41988:1;41977:9;41973:17;41966:47;42030:131;42156:4;42030:131;:::i;:::-;42022:139;;41920:248;;;:::o;42174:419::-;42340:4;42378:2;42367:9;42363:18;42355:26;;42427:9;42421:4;42417:20;42413:1;42402:9;42398:17;42391:47;42455:131;42581:4;42455:131;:::i;:::-;42447:139;;42345:248;;;:::o;42599:419::-;42765:4;42803:2;42792:9;42788:18;42780:26;;42852:9;42846:4;42842:20;42838:1;42827:9;42823:17;42816:47;42880:131;43006:4;42880:131;:::i;:::-;42872:139;;42770:248;;;:::o;43024:419::-;43190:4;43228:2;43217:9;43213:18;43205:26;;43277:9;43271:4;43267:20;43263:1;43252:9;43248:17;43241:47;43305:131;43431:4;43305:131;:::i;:::-;43297:139;;43195:248;;;:::o;43449:419::-;43615:4;43653:2;43642:9;43638:18;43630:26;;43702:9;43696:4;43692:20;43688:1;43677:9;43673:17;43666:47;43730:131;43856:4;43730:131;:::i;:::-;43722:139;;43620:248;;;:::o;43874:419::-;44040:4;44078:2;44067:9;44063:18;44055:26;;44127:9;44121:4;44117:20;44113:1;44102:9;44098:17;44091:47;44155:131;44281:4;44155:131;:::i;:::-;44147:139;;44045:248;;;:::o;44299:419::-;44465:4;44503:2;44492:9;44488:18;44480:26;;44552:9;44546:4;44542:20;44538:1;44527:9;44523:17;44516:47;44580:131;44706:4;44580:131;:::i;:::-;44572:139;;44470:248;;;:::o;44724:419::-;44890:4;44928:2;44917:9;44913:18;44905:26;;44977:9;44971:4;44967:20;44963:1;44952:9;44948:17;44941:47;45005:131;45131:4;45005:131;:::i;:::-;44997:139;;44895:248;;;:::o;45149:419::-;45315:4;45353:2;45342:9;45338:18;45330:26;;45402:9;45396:4;45392:20;45388:1;45377:9;45373:17;45366:47;45430:131;45556:4;45430:131;:::i;:::-;45422:139;;45320:248;;;:::o;45574:419::-;45740:4;45778:2;45767:9;45763:18;45755:26;;45827:9;45821:4;45817:20;45813:1;45802:9;45798:17;45791:47;45855:131;45981:4;45855:131;:::i;:::-;45847:139;;45745:248;;;:::o;45999:419::-;46165:4;46203:2;46192:9;46188:18;46180:26;;46252:9;46246:4;46242:20;46238:1;46227:9;46223:17;46216:47;46280:131;46406:4;46280:131;:::i;:::-;46272:139;;46170:248;;;:::o;46424:419::-;46590:4;46628:2;46617:9;46613:18;46605:26;;46677:9;46671:4;46667:20;46663:1;46652:9;46648:17;46641:47;46705:131;46831:4;46705:131;:::i;:::-;46697:139;;46595:248;;;:::o;46849:419::-;47015:4;47053:2;47042:9;47038:18;47030:26;;47102:9;47096:4;47092:20;47088:1;47077:9;47073:17;47066:47;47130:131;47256:4;47130:131;:::i;:::-;47122:139;;47020:248;;;:::o;47274:419::-;47440:4;47478:2;47467:9;47463:18;47455:26;;47527:9;47521:4;47517:20;47513:1;47502:9;47498:17;47491:47;47555:131;47681:4;47555:131;:::i;:::-;47547:139;;47445:248;;;:::o;47699:419::-;47865:4;47903:2;47892:9;47888:18;47880:26;;47952:9;47946:4;47942:20;47938:1;47927:9;47923:17;47916:47;47980:131;48106:4;47980:131;:::i;:::-;47972:139;;47870:248;;;:::o;48124:419::-;48290:4;48328:2;48317:9;48313:18;48305:26;;48377:9;48371:4;48367:20;48363:1;48352:9;48348:17;48341:47;48405:131;48531:4;48405:131;:::i;:::-;48397:139;;48295:248;;;:::o;48549:338::-;48700:4;48738:2;48727:9;48723:18;48715:26;;48751:129;48877:1;48866:9;48862:17;48853:6;48751:129;:::i;:::-;48705:182;;;;:::o;48893:222::-;48986:4;49024:2;49013:9;49009:18;49001:26;;49037:71;49105:1;49094:9;49090:17;49081:6;49037:71;:::i;:::-;48991:124;;;;:::o;49121:214::-;49210:4;49248:2;49237:9;49233:18;49225:26;;49261:67;49325:1;49314:9;49310:17;49301:6;49261:67;:::i;:::-;49215:120;;;;:::o;49341:338::-;49465:4;49503:2;49492:9;49488:18;49480:26;;49516:67;49580:1;49569:9;49565:17;49556:6;49516:67;:::i;:::-;49593:79;49668:2;49657:9;49653:18;49644:6;49593:79;:::i;:::-;49470:209;;;;;:::o;49685:346::-;49813:4;49851:2;49840:9;49836:18;49828:26;;49864:67;49928:1;49917:9;49913:17;49904:6;49864:67;:::i;:::-;49941:83;50020:2;50009:9;50005:18;49996:6;49941:83;:::i;:::-;49818:213;;;;;:::o;50037:316::-;50150:4;50188:2;50177:9;50173:18;50165:26;;50201:67;50265:1;50254:9;50250:17;50241:6;50201:67;:::i;:::-;50278:68;50342:2;50331:9;50327:18;50318:6;50278:68;:::i;:::-;50155:198;;;;;:::o;50359:521::-;50520:4;50558:3;50547:9;50543:19;50535:27;;50572:67;50636:1;50625:9;50621:17;50612:6;50572:67;:::i;:::-;50649:68;50713:2;50702:9;50698:18;50689:6;50649:68;:::i;:::-;50727;50791:2;50780:9;50776:18;50767:6;50727:68;:::i;:::-;50805;50869:2;50858:9;50854:18;50845:6;50805:68;:::i;:::-;50525:355;;;;;;;:::o;50886:129::-;50920:6;50947:20;;:::i;:::-;50937:30;;50976:33;51004:4;50996:6;50976:33;:::i;:::-;50927:88;;;:::o;51021:75::-;51054:6;51087:2;51081:9;51071:19;;51061:35;:::o;51102:307::-;51163:4;51253:18;51245:6;51242:30;51239:2;;;51275:18;;:::i;:::-;51239:2;51313:29;51335:6;51313:29;:::i;:::-;51305:37;;51397:4;51391;51387:15;51379:23;;51168:241;;;:::o;51415:308::-;51477:4;51567:18;51559:6;51556:30;51553:2;;;51589:18;;:::i;:::-;51553:2;51627:29;51649:6;51627:29;:::i;:::-;51619:37;;51711:4;51705;51701:15;51693:23;;51482:241;;;:::o;51729:108::-;51804:4;51827:3;51819:11;;51809:28;;;:::o;51843:112::-;51922:4;51945:3;51937:11;;51927:28;;;:::o;51961:128::-;52056:4;52079:3;52071:11;;52061:28;;;:::o;52095:134::-;52196:4;52219:3;52211:11;;52201:28;;;:::o;52235:132::-;52302:4;52325:3;52317:11;;52355:4;52350:3;52346:14;52338:22;;52307:60;;;:::o;52373:97::-;52437:4;52460:3;52452:11;;52442:28;;;:::o;52476:114::-;52551:6;52579:4;52569:14;;52558:32;;;:::o;52596:118::-;52675:6;52703:4;52693:14;;52682:32;;;:::o;52720:134::-;52815:6;52843:4;52833:14;;52822:32;;;:::o;52860:140::-;52961:6;52989:4;52979:14;;52968:32;;;:::o;53006:114::-;53073:6;53107:5;53101:12;53091:22;;53080:40;;;:::o;53126:103::-;53190:6;53218:4;53208:14;;53197:32;;;:::o;53235:98::-;53286:6;53320:5;53314:12;53304:22;;53293:40;;;:::o;53339:99::-;53391:6;53425:5;53419:12;53409:22;;53398:40;;;:::o;53444:121::-;53522:4;53554;53549:3;53545:14;53537:22;;53527:38;;;:::o;53571:125::-;53653:4;53685;53680:3;53676:14;53668:22;;53658:38;;;:::o;53702:141::-;53800:4;53832;53827:3;53823:14;53815:22;;53805:38;;;:::o;53849:147::-;53953:4;53985;53980:3;53976:14;53968:22;;53958:38;;;:::o;54002:113::-;54072:4;54104;54099:3;54095:14;54087:22;;54077:38;;;:::o;54121:110::-;54188:4;54220;54215:3;54211:14;54203:22;;54193:38;;;:::o;54237:173::-;54364:11;54401:3;54386:18;;54376:34;;;;:::o;54416:179::-;54549:11;54586:3;54571:18;;54561:34;;;;:::o;54601:184::-;54700:11;54734:6;54729:3;54722:19;54774:4;54769:3;54765:14;54750:29;;54712:73;;;;:::o;54791:142::-;54887:11;54924:3;54909:18;;54899:34;;;;:::o;54939:168::-;55022:11;55056:6;55051:3;55044:19;55096:4;55091:3;55087:14;55072:29;;55034:73;;;;:::o;55113:169::-;55197:11;55231:6;55226:3;55219:19;55271:4;55266:3;55262:14;55247:29;;55209:73;;;;:::o;55288:148::-;55390:11;55427:3;55412:18;;55402:34;;;;:::o;55442:305::-;55482:3;55501:20;55519:1;55501:20;:::i;:::-;55496:25;;55535:20;55553:1;55535:20;:::i;:::-;55530:25;;55689:1;55621:66;55617:74;55614:1;55611:81;55608:2;;;55695:18;;:::i;:::-;55608:2;55739:1;55736;55732:9;55725:16;;55486:261;;;;:::o;55753:185::-;55793:1;55810:20;55828:1;55810:20;:::i;:::-;55805:25;;55844:20;55862:1;55844:20;:::i;:::-;55839:25;;55883:1;55873:2;;55888:18;;:::i;:::-;55873:2;55930:1;55927;55923:9;55918:14;;55795:143;;;;:::o;55944:191::-;55984:4;56004:20;56022:1;56004:20;:::i;:::-;55999:25;;56038:20;56056:1;56038:20;:::i;:::-;56033:25;;56077:1;56074;56071:8;56068:2;;;56082:18;;:::i;:::-;56068:2;56127:1;56124;56120:9;56112:17;;55989:146;;;;:::o;56141:185::-;56179:4;56199:18;56215:1;56199:18;:::i;:::-;56194:23;;56231:18;56247:1;56231:18;:::i;:::-;56226:23;;56268:1;56265;56262:8;56259:2;;;56273:18;;:::i;:::-;56259:2;56318:1;56315;56311:9;56303:17;;56184:142;;;;:::o;56332:96::-;56369:7;56398:24;56416:5;56398:24;:::i;:::-;56387:35;;56377:51;;;:::o;56434:90::-;56468:7;56511:5;56504:13;56497:21;56486:32;;56476:48;;;:::o;56530:149::-;56566:7;56606:66;56599:5;56595:78;56584:89;;56574:105;;;:::o;56685:129::-;56731:7;56760:5;56749:16;;56766:42;56802:5;56766:42;:::i;:::-;56739:75;;;:::o;56820:137::-;56870:7;56899:5;56888:16;;56905:46;56945:5;56905:46;:::i;:::-;56878:79;;;:::o;56963:126::-;57000:7;57040:42;57033:5;57029:54;57018:65;;57008:81;;;:::o;57095:77::-;57132:7;57161:5;57150:16;;57140:32;;;:::o;57178:86::-;57213:7;57253:4;57246:5;57242:16;57231:27;;57221:43;;;:::o;57270:129::-;57327:9;57360:33;57387:5;57360:33;:::i;:::-;57347:46;;57337:62;;;:::o;57405:137::-;57466:9;57499:37;57530:5;57499:37;:::i;:::-;57486:50;;57476:66;;;:::o;57548:121::-;57606:9;57639:24;57657:5;57639:24;:::i;:::-;57626:37;;57616:53;;;:::o;57675:154::-;57759:6;57754:3;57749;57736:30;57821:1;57812:6;57807:3;57803:16;57796:27;57726:103;;;:::o;57835:307::-;57903:1;57913:113;57927:6;57924:1;57921:13;57913:113;;;58012:1;58007:3;58003:11;57997:18;57993:1;57988:3;57984:11;57977:39;57949:2;57946:1;57942:10;57937:15;;57913:113;;;58044:6;58041:1;58038:13;58035:2;;;58124:1;58115:6;58110:3;58106:16;58099:27;58035:2;57884:258;;;;:::o;58148:320::-;58192:6;58229:1;58223:4;58219:12;58209:22;;58276:1;58270:4;58266:12;58297:18;58287:2;;58353:4;58345:6;58341:17;58331:27;;58287:2;58415;58407:6;58404:14;58384:18;58381:38;58378:2;;;58434:18;;:::i;:::-;58378:2;58199:269;;;;:::o;58474:281::-;58557:27;58579:4;58557:27;:::i;:::-;58549:6;58545:40;58687:6;58675:10;58672:22;58651:18;58639:10;58636:34;58633:62;58630:2;;;58698:18;;:::i;:::-;58630:2;58738:10;58734:2;58727:22;58517:238;;;:::o;58761:233::-;58800:3;58823:24;58841:5;58823:24;:::i;:::-;58814:33;;58869:66;58862:5;58859:77;58856:2;;;58939:18;;:::i;:::-;58856:2;58986:1;58979:5;58975:13;58968:20;;58804:190;;;:::o;59000:167::-;59037:3;59060:22;59076:5;59060:22;:::i;:::-;59051:31;;59104:4;59097:5;59094:15;59091:2;;;59112:18;;:::i;:::-;59091:2;59159:1;59152:5;59148:13;59141:20;;59041:126;;;:::o;59173:176::-;59205:1;59222:20;59240:1;59222:20;:::i;:::-;59217:25;;59256:20;59274:1;59256:20;:::i;:::-;59251:25;;59295:1;59285:2;;59300:18;;:::i;:::-;59285:2;59341:1;59338;59334:9;59329:14;;59207:142;;;;:::o;59355:180::-;59403:77;59400:1;59393:88;59500:4;59497:1;59490:15;59524:4;59521:1;59514:15;59541:180;59589:77;59586:1;59579:88;59686:4;59683:1;59676:15;59710:4;59707:1;59700:15;59727:180;59775:77;59772:1;59765:88;59872:4;59869:1;59862:15;59896:4;59893:1;59886:15;59913:180;59961:77;59958:1;59951:88;60058:4;60055:1;60048:15;60082:4;60079:1;60072:15;60099:180;60147:77;60144:1;60137:88;60244:4;60241:1;60234:15;60268:4;60265:1;60258:15;60285:180;60333:77;60330:1;60323:88;60430:4;60427:1;60420:15;60454:4;60451:1;60444:15;60471:180;60519:77;60516:1;60509:88;60616:4;60613:1;60606:15;60640:4;60637:1;60630:15;60657:117;60766:1;60763;60756:12;60780:117;60889:1;60886;60879:12;60903:117;61012:1;61009;61002:12;61026:117;61135:1;61132;61125:12;61149:102;61190:6;61241:2;61237:7;61232:2;61225:5;61221:14;61217:28;61207:38;;61197:54;;;:::o;61257:230::-;61397:34;61393:1;61385:6;61381:14;61374:58;61466:13;61461:2;61453:6;61449:15;61442:38;61363:124;:::o;61493:237::-;61633:34;61629:1;61621:6;61617:14;61610:58;61702:20;61697:2;61689:6;61685:15;61678:45;61599:131;:::o;61736:225::-;61876:34;61872:1;61864:6;61860:14;61853:58;61945:8;61940:2;61932:6;61928:15;61921:33;61842:119;:::o;61967:178::-;62107:30;62103:1;62095:6;62091:14;62084:54;62073:72;:::o;62151:175::-;62291:27;62287:1;62279:6;62275:14;62268:51;62257:69;:::o;62332:223::-;62472:34;62468:1;62460:6;62456:14;62449:58;62541:6;62536:2;62528:6;62524:15;62517:31;62438:117;:::o;62561:175::-;62701:27;62697:1;62689:6;62685:14;62678:51;62667:69;:::o;62742:231::-;62882:34;62878:1;62870:6;62866:14;62859:58;62951:14;62946:2;62938:6;62934:15;62927:39;62848:125;:::o;62979:235::-;63119:34;63115:1;63107:6;63103:14;63096:58;63188:18;63183:2;63175:6;63171:15;63164:43;63085:129;:::o;63220:231::-;63360:34;63356:1;63348:6;63344:14;63337:58;63429:14;63424:2;63416:6;63412:15;63405:39;63326:125;:::o;63457:176::-;63597:28;63593:1;63585:6;63581:14;63574:52;63563:70;:::o;63639:243::-;63779:34;63775:1;63767:6;63763:14;63756:58;63848:26;63843:2;63835:6;63831:15;63824:51;63745:137;:::o;63888:229::-;64028:34;64024:1;64016:6;64012:14;64005:58;64097:12;64092:2;64084:6;64080:15;64073:37;63994:123;:::o;64123:228::-;64263:34;64259:1;64251:6;64247:14;64240:58;64332:11;64327:2;64319:6;64315:15;64308:36;64229:122;:::o;64357:182::-;64497:34;64493:1;64485:6;64481:14;64474:58;64463:76;:::o;64545:231::-;64685:34;64681:1;64673:6;64669:14;64662:58;64754:14;64749:2;64741:6;64737:15;64730:39;64651:125;:::o;64782:182::-;64922:34;64918:1;64910:6;64906:14;64899:58;64888:76;:::o;64970:228::-;65110:34;65106:1;65098:6;65094:14;65087:58;65179:11;65174:2;65166:6;65162:15;65155:36;65076:122;:::o;65204:234::-;65344:34;65340:1;65332:6;65328:14;65321:58;65413:17;65408:2;65400:6;65396:15;65389:42;65310:128;:::o;65444:176::-;65584:28;65580:1;65572:6;65568:14;65561:52;65550:70;:::o;65626:220::-;65766:34;65762:1;65754:6;65750:14;65743:58;65835:3;65830:2;65822:6;65818:15;65811:28;65732:114;:::o;65852:::-;65958:8;:::o;65972:236::-;66112:34;66108:1;66100:6;66096:14;66089:58;66181:19;66176:2;66168:6;66164:15;66157:44;66078:130;:::o;66214:231::-;66354:34;66350:1;66342:6;66338:14;66331:58;66423:14;66418:2;66410:6;66406:15;66399:39;66320:125;:::o;66451:170::-;66591:22;66587:1;66579:6;66575:14;66568:46;66557:64;:::o;66627:114::-;66709:1;66702:5;66699:12;66689:2;;66715:18;;:::i;:::-;66689:2;66679:62;:::o;66747:118::-;66833:1;66826:5;66823:12;66813:2;;66839:18;;:::i;:::-;66813:2;66803:62;:::o;66871:122::-;66944:24;66962:5;66944:24;:::i;:::-;66937:5;66934:35;66924:2;;66983:1;66980;66973:12;66924:2;66914:79;:::o;66999:116::-;67069:21;67084:5;67069:21;:::i;:::-;67062:5;67059:32;67049:2;;67105:1;67102;67095:12;67049:2;67039:76;:::o;67121:120::-;67193:23;67210:5;67193:23;:::i;:::-;67186:5;67183:34;67173:2;;67231:1;67228;67221:12;67173:2;67163:78;:::o;67247:108::-;67329:1;67322:5;67319:12;67309:2;;67345:1;67342;67335:12;67309:2;67299:56;:::o;67361:112::-;67447:1;67440:5;67437:12;67427:2;;67463:1;67460;67453:12;67427:2;67417:56;:::o;67479:122::-;67552:24;67570:5;67552:24;:::i;:::-;67545:5;67542:35;67532:2;;67591:1;67588;67581:12;67532:2;67522:79;:::o;67607:118::-;67678:22;67694:5;67678:22;:::i;:::-;67671:5;67668:33;67658:2;;67715:1;67712;67705:12;67658:2;67648:77;:::o

Swarm Source

ipfs://f308ee1b3fac094d06d514df0a3c09f1c5322c96435360e2aeb853d40501fcc9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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