ETH Price: $3,456.17 (+1.22%)
Gas: 17 Gwei

Token

CryptoSVG (CRYPTOSVG)
 

Overview

Max Total Supply

287 CRYPTOSVG

Holders

80

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
mlotta.eth
Balance
2 CRYPTOSVG
0xb835367ae1cafcea58a10a51b17fea25d16c3dab
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

## CryptoSVGs are "on-chain" generative svg arts on the Ethereum blockchain. They animate periodically as the block height grows. ## **MINT IS LIVE.** ## https://cryptosvg.art/mint

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoSVG

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
 */

// SPDX-License-Identifier: MIT

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);
}

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

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

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

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

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

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

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

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

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

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

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

contract CryptoSVG is ERC721Enumerable, Ownable {
    uint256 public maxSupply = 5555;
    uint256 public constant price = 0.009 ether;
    uint256 public constant maxMintAmount = 20;
    bool public active = false;

    mapping(uint16 => uint16) private tokenMatrix;

    enum FilterType {
        blur,
        texture,
        linearGradient,
        radialGradient,
        fractalNoise,
        turbulence,
        pixel,
        unregular
    }

    struct FType {
        FilterType filterType;
        string baseFrequency;
        string numOctaves;
        string surfaceScale;
    }

    function generateFilterBlur(
        string memory id,
        string memory x,
        string memory y,
        string memory size,
        string memory deviation
    ) internal pure returns (string memory) {
        string memory output = string(abi.encodePacked('<filter id="', id, '" x="', x, '" y="', y));
        output = string(
            abi.encodePacked(
                string(abi.encodePacked('<filter id="', id, '" x="', x, '" y="', y)),
                '" width="',
                size,
                '" height="',
                size,
                '"><feGaussianBlur stdDeviation="',
                deviation,
                '" /></filter>'
            )
        );
        return output;
    }

    struct FilterBulence {
        string x;
        string y;
        string size;
        string filterType;
        string baseFrequency;
        string numOctaves;
    }

    function generateFilterBulence(string memory id, FilterBulence memory filterBulence)
        internal
        pure
        returns (string memory)
    {
        string memory output = string(
            abi.encodePacked('<filter id="', id, '" x="', filterBulence.x, '" y="', filterBulence.y)
        );
        output = string(
            abi.encodePacked(
                output,
                '" width="',
                filterBulence.size,
                '" height="',
                filterBulence.size,
                '"><feTurbulence type="',
                filterBulence.filterType
            )
        );
        output = string(
            abi.encodePacked(
                output,
                '" baseFrequency="',
                filterBulence.baseFrequency,
                '" numOctaves="',
                filterBulence.numOctaves,
                '" /><feComposite operator="in" in2="SourceGraphic" /></filter>'
            )
        );
        return output;
    }

    function generateFilteUnregular(string memory id, string memory color) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<filter id="',
                    id,
                    '"><feMorphology operator="dilate" radius="2" result="r1" /><feFlood flood-color="',
                    color,
                    '" flood-opacity="1" /><feComposite operator="in" in2="r1" /><feComposite in2="SourceAlpha" result="c1" /><feTurbulence type="fractalNoise" baseFrequency="0.01 0" numOctaves="2" seed="0" /><feDisplacementMap in="c1" scale="17" xChannelSelector="A" yChannelSelector="A" /></filter>'
                )
            );
    }

    function generateFilterPixel(string memory id) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<filter id="',
                    id,
                    '"><feFlood height="5" width="5" /><feComposite width="18" height="18" /><feTile in="BackgroundImage" result="a" /><feComposite operator="in" in="SourceGraphic" in2="a" /><feMorphology operator="dilate" radius="5" /></filter>'
                )
            );
    }

    function generateFilterTexture(
        string memory id,
        string memory color,
        string memory surfaceScale
    ) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<filter id="',
                    id,
                    '"><feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="5" result="1" /><feDiffuseLighting in="1" lighting-color="',
                    color,
                    '" surfaceScale="',
                    surfaceScale,
                    '"><feDistantLight azimuth="45" elevation="60" /></feDiffuseLighting><feComposite operator="in" in2="SourceGraphic" /></filter>'
                )
            );
    }

    struct RadialGradient {
        string cx;
        string cy;
        string r;
        bool fxy;
        string fx;
        string fy;
        bool reflect;
        bool userSpaceOnUse;
    }

    function generateRadialGradient(string memory id, RadialGradient memory radialGradient)
        internal
        pure
        returns (string memory)
    {
        string memory output = string(
            abi.encodePacked(
                '<radialGradient id="',
                id,
                radialGradient.userSpaceOnUse ? '" gradientUnits="userSpaceOnUse"' : '"',
                ' cx="',
                radialGradient.cx,
                '" cy="',
                radialGradient.cy,
                '" r="',
                radialGradient.r
            )
        );
        output = string(
            abi.encodePacked(
                output,
                radialGradient.fxy ? '" fx="' : '"',
                radialGradient.fxy ? radialGradient.fx : '',
                radialGradient.fxy ? '" fy="' : '',
                radialGradient.fxy ? radialGradient.fy : '',
                radialGradient.fxy ? '" spreadMethod="' : ' spreadMethod="',
                radialGradient.reflect ? 'reflect' : 'pad',
                '">'
            )
        );
        return output;
    }

    function generateLinearGradient(
        string memory id,
        string memory x,
        string memory y,
        string memory size
    ) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    string(
                        abi.encodePacked(
                            '<linearGradient id="',
                            id,
                            '" x="',
                            x,
                            '" y="',
                            y,
                            '" width="',
                            size,
                            '" height="'
                        )
                    ),
                    size,
                    '">'
                )
            );
    }

    function generatesStop(
        string memory opacity,
        string memory offset,
        string memory color
    ) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<stop style="stop-color:',
                    color,
                    ';stop-opacity:',
                    opacity,
                    '" offset="',
                    offset,
                    '"/>'
                )
            );
    }

    struct Circle {
        string cx;
        string cy;
        uint256 r;
        string fill;
        string filter;
        string opacity;
    }

    function generateCircle(Circle memory circle) internal pure returns (string memory) {
        return
            generateEllipse(
                Ellipase(circle.cx, circle.cy, circle.r, circle.r, circle.fill, circle.filter, circle.opacity)
            );
    }

    struct Ellipase {
        string cx;
        string cy;
        uint256 rx;
        uint256 ry;
        string fill;
        string filter;
        string opacity;
    }

    function generateEllipse(Ellipase memory ellipase) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    string(
                        abi.encodePacked(
                            '<ellipse cx="',
                            ellipase.cx,
                            '" cy="',
                            ellipase.cy,
                            '" rx="',
                            Strings.toString(ellipase.rx),
                            '" ry="'
                        )
                    ),
                    Strings.toString(ellipase.ry),
                    '" fill="',
                    ellipase.fill,
                    '" filter="',
                    ellipase.filter,
                    '" opacity="',
                    ellipase.opacity,
                    '" />'
                )
            );
    }

    function moonLocation(
        uint256 location,
        uint256 startingLocation,
        uint256 speed
    ) internal pure returns (int256) {
        return 750 - (((int256(location / speed) % 901) + int256(startingLocation)) % 901);
    }

    function _url(string memory id) internal pure returns (string memory) {
        return string(abi.encodePacked('url(#', id, ')'));
    }

    function calScale(int256 offset) internal pure returns (uint256) {
        uint256 scale = 0;
        if (offset >= 300 && offset <= 310) {
            scale = 100 - uint256(offset - 300) * 10;
        }
        return scale;
    }

    function calOffset(int256 location) internal pure returns (string memory) {
        string memory offsetString = '';
        if (location >= 0) {
            offsetString = Strings.toString(uint256(location));
        } else {
            offsetString = string(abi.encodePacked('-', Strings.toString(uint256(-location))));
        }
        return offsetString;
    }

    function animateMoon(int256 location, FilterType filterType) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<circle filter="',
                    filterType == FilterType.unregular ? _url('12') : filterType == FilterType.pixel ? _url('14') : '',
                    '" cx="',
                    calOffset(location),
                    '" cy="300" r="150" />'
                )
            );
    }

    function animateEllipse(int256 location, Ellipase memory ellipse) internal pure returns (string memory) {
        uint256 scale = calScale(location);
        return
            generateEllipse(
                Ellipase(
                    ellipse.cx,
                    ellipse.cy,
                    (ellipse.rx * scale) / 100,
                    (ellipse.ry * scale) / 100,
                    ellipse.fill,
                    ellipse.filter,
                    '1'
                )
            );
    }

    function animateCircle(int256 location, Circle memory circle) internal pure returns (string memory) {
        return
            generateCircle(
                Circle(
                    circle.cx,
                    circle.cy,
                    (circle.r * calScale(location)) / 100,
                    circle.fill,
                    circle.filter,
                    circle.opacity
                )
            );
    }

    function generatePlant(
        string memory color,
        int256 location,
        FType memory fType
    ) internal pure returns (string memory) {
        string memory k150 = '150';
        string memory k300 = '300';
        string memory k1 = '1';
        string memory k0 = '0';
        string memory kEmpty = '';
        uint256 scale = calScale(location);
        FilterType filterType = fType.filterType;
        string[54] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600" viewBox="0 0 600 600"><defs>';

        parts[1] = generateFilterBlur(k1, '-0.1', '-0.1', '2', k1);

        parts[2] = generateFilterBlur('2', '-0.1', '-0.1', '2', '10');

        parts[3] = generateFilterBlur('3', '-0.2', '-0.2', '3', '21');

        parts[4] = generateFilterBlur('4', k0, k0, '2', '91');

        parts[5] = generateFilterBlur('5', '-100', '-100', k300, '7');

        parts[6] = generateFilterBlur('6', '-100', '-100', k300, '21');

        parts[7] = generateFilterBlur('7', '-100', '-100', k300, '6');

        parts[8] = generateFilterBulence(
            '9',
            FilterBulence(k0, k0, k1, 'fractalNoise', fType.baseFrequency, fType.numOctaves)
        );

        parts[9] = generateFilterBulence(
            '10',
            FilterBulence(k0, k0, k1, 'turbulence', fType.baseFrequency, fType.numOctaves)
        );

        parts[10] = generateFilteUnregular('11', color);

        parts[11] = generateFilteUnregular('12', '#000000');

        parts[12] = generateFilterPixel('14');

        parts[13] = generateFilterTexture('15', color, fType.surfaceScale);

        parts[14] = '</defs>';

        parts[15] = generateRadialGradient(
            'r1',
            RadialGradient(k150, k300, Strings.toString((80 * scale) / 100), false, kEmpty, kEmpty, false, true)
        );

        parts[16] = generatesStop(k0, k0, color);

        parts[17] = generatesStop(k0, '0.89', color);

        parts[18] = generatesStop('0.99', '0.9', color);

        parts[19] = generatesStop(k0, k1, color);

        parts[20] = '</radialGradient>';

        parts[21] = generateRadialGradient(
            'r2',
            RadialGradient('230', k300, Strings.toString((30 * scale) / 100), false, kEmpty, kEmpty, false, true)
        );

        parts[22] = generatesStop(k0, k0, color);

        parts[23] = generatesStop(k0, '0.89', color);

        parts[24] = generatesStop('0.99', '0.9', color);

        parts[25] = generatesStop(k0, k1, color);

        parts[26] = '</radialGradient>';

        parts[27] = generateRadialGradient('r3', RadialGradient('0.3', '0.3', '0.4', true, '0.5', '0.5', true, false));

        parts[28] = generatesStop(k1, k0, '#000000');

        parts[29] = generatesStop(k1, k1, color);

        parts[30] = '</radialGradient>';

        parts[31] = generateLinearGradient('l1', k0, k0, k1);

        parts[32] = generatesStop(k1, k0, color);

        parts[33] = generatesStop(k1, k1, '#000000');

        parts[34] = '</linearGradient>';

        parts[35] = '<rect x="0" y="0"  height="600" width="600" />';

        parts[36] = string(
            abi.encodePacked(
                '<g transform="translate(300, 300)" filter="',
                filterType == FilterType.unregular ? _url('11') : kEmpty,
                '">'
            )
        );

        parts[37] = filterType == FilterType.linearGradient
            ? generateCircle(Circle(k0, k0, 150, _url('l1'), _url(k1), k1))
            : filterType == FilterType.radialGradient
            ? generateCircle(Circle(k0, k0, 150, _url('r3'), _url(k1), k1))
            : filterType == FilterType.unregular || filterType == FilterType.pixel
            ? kEmpty
            : generateCircle(Circle(k0, k0, 150, color, _url(k1), k1));

        parts[38] = filterType == FilterType.linearGradient
            ? generateCircle(Circle(k0, k0, 150, _url('l1'), _url('2'), k1))
            : filterType == FilterType.radialGradient
            ? generateCircle(Circle(k0, k0, 150, _url('r3'), _url('2'), k1))
            : filterType == FilterType.unregular || filterType == FilterType.pixel
            ? kEmpty
            : generateCircle(Circle(k0, k0, 150, color, _url('2'), k1));

        parts[39] = filterType == FilterType.unregular
            ? generateCircle(Circle(k0, k0, 150, color, _url('11'), k1))
            : filterType == FilterType.blur
            ? generateCircle(Circle(k0, k0, 150, color, _url('3'), k1))
            : filterType == FilterType.turbulence
            ? generateCircle(Circle(k0, k0, 150, color, _url('10'), k1))
            : filterType == FilterType.pixel
            ? generateCircle(Circle(k0, k0, 150, color, _url('14'), k1))
            : filterType == FilterType.texture
            ? generateCircle(Circle(k0, k0, 150, color, _url('15'), k1))
            : filterType == FilterType.linearGradient
            ? generateCircle(Circle(k0, k0, 150, _url('l1'), kEmpty, k1))
            : filterType == FilterType.radialGradient
            ? generateCircle(Circle(k0, k0, 150, _url('r3'), kEmpty, k1))
            : generateCircle(Circle(k0, k0, 150, color, _url('9'), k1));

        parts[40] = '</g>';

        parts[41] = animateMoon(location, filterType);

        parts[42] = string(
            abi.encodePacked(
                '<g filter="',
                filterType == FilterType.unregular ? _url('11') : filterType == FilterType.pixel ? _url('14') : kEmpty,
                '">'
            )
        );

        parts[43] = animateCircle(location, Circle(k150, k300, 100, _url('r1'), '', '0.25'));

        parts[44] = animateCircle(location, Circle('225', k300, 50, _url('r2'), '', '0.25'));

        parts[45] = animateCircle(location, Circle('110', k300, 30, color, '', '0.15'));

        parts[46] = animateCircle(location, Circle('278', k300, 50, color, '', '0.1'));

        parts[47] = '</g>';

        parts[48] = string(abi.encodePacked('<g filter="', filterType == FilterType.pixel ? _url('14') : kEmpty, '">'));

        parts[49] = animateEllipse(location, Ellipase(k150, k300, 15, 35, color, _url('5'), '1'));

        parts[50] = animateEllipse(location, Ellipase(k150, k300, 25, 35, color, _url('6'), '1'));

        parts[51] = animateEllipse(location, Ellipase(k150, k300, 10, 30, color, _url('7'), '1'));

        parts[52] = '</g>';

        parts[53] = '</svg>';

        string memory output = kEmpty;
        uint256 step = 8;
        for (uint256 j; j < 6; j++) {
            output = string(
                abi.encodePacked(
                    output,
                    parts[j * step],
                    parts[j * step + 1],
                    parts[j * step + 2],
                    parts[j * step + 3],
                    parts[j * step + 4],
                    parts[j * step + 5],
                    parts[j * step + 6],
                    parts[j * step + 7]
                )
            );
        }
        output = string(abi.encodePacked(output, parts[48], parts[49], parts[50], parts[51], parts[52], parts[53]));
        return output;
    }

    function parseFilterType(FilterType ft) internal pure returns (string memory) {
        if (ft == FilterType.blur) {
            return 'blur';
        } else if (ft == FilterType.texture) {
            return 'texture';
        } else if (ft == FilterType.linearGradient) {
            return 'linear';
        } else if (ft == FilterType.radialGradient) {
            return 'radial';
        } else if (ft == FilterType.fractalNoise) {
            return 'fractal';
        } else if (ft == FilterType.turbulence) {
            return 'turbulence';
        } else if (ft == FilterType.pixel) {
            return 'pixel';
        } else if (ft == FilterType.unregular) {
            return 'unregular';
        }
        return '';
    }

    function randomWithTokenId(string memory prefix, uint256 tokenId) internal pure returns (uint256) {
        return CryptoSVGLibrary.random(string(abi.encodePacked(prefix, Strings.toString(tokenId))));
    }

    function getColor(uint256 tokenId) public pure returns (string memory) {
        uint256 rand = randomWithTokenId('color', tokenId);
        return string(abi.encodePacked('#', CryptoSVGLibrary.substring(Strings.toHexString(rand), 2, 8)));
    }

    function getType(uint256 tokenId) public pure returns (FType memory) {
        uint256 rand = randomWithTokenId('type', tokenId);
        uint256 rand1 = randomWithTokenId('baseFrequency', tokenId);
        uint256 rand2 = randomWithTokenId('numOctaves', tokenId);
        uint256 rand3 = randomWithTokenId('surfaceScale', tokenId);
        uint256 num = (rand % 100) + 1;
        uint256 num1 = (rand1 % 5) + 1;
        uint256 num2 = (rand2 % 5) + 1;
        uint256 num3 = (rand3 % 3) + 1;
        FilterType ft = FilterType.blur;
        if (num <= 25) {
            ft = FilterType.blur;
        } else if (num <= 45) {
            ft = FilterType.texture;
        } else if (num <= 60) {
            ft = FilterType.linearGradient;
        } else if (num <= 75) {
            ft = FilterType.radialGradient;
        } else if (num <= 85) {
            ft = FilterType.turbulence;
        } else if (num <= 95) {
            ft = FilterType.fractalNoise;
        } else if (num <= 98) {
            ft = FilterType.unregular;
        } else {
            ft = FilterType.pixel;
        }
        return
            FType(
                ft,
                string(abi.encodePacked('0.0', Strings.toString(num1))),
                Strings.toString(num2),
                Strings.toString(num3)
            );
    }

    function getStartingLocation(uint256 tokenId) public pure returns (uint256) {
        return randomWithTokenId('start', tokenId) % 901;
    }

    function getSpeed(uint256 tokenId) public pure returns (uint256, uint256) {
        uint256 rand = randomWithTokenId('speed', tokenId);
        uint256 speed = 1;
        uint256 num = (randomWithTokenId('level', tokenId) % 100) + 1;
        uint256 level = 6;
        if (num <= 25) {
            speed = (rand % (999 - 512)) + 513;
            level = 6;
        } else if (num <= 50) {
            speed = (rand % (512 - 256)) + 257;
            level = 5;
        } else if (num <= 75) {
            speed = (rand % (256 - 128)) + 129;
            level = 4;
        } else if (num <= 85) {
            speed = (rand % (128 - 64)) + 65;
            level = 3;
        } else if (num <= 95) {
            speed = (rand % (64 - 16)) + 17;
            level = 2;
        } else if (num <= 98) {
            speed = (rand % 16) + 1;
            level = 1;
        } else {
            speed = (rand % 9000) + 1000;
            level = 0;
        }
        return (speed, level);
    }

    function getPeriod(uint256 tokenId) public pure returns (uint256) {
        (uint256 speed, ) = getSpeed(tokenId);
        return _getPeriod(speed);
    }

    function _getPeriod(uint256 speed) internal pure returns (uint256) {
        return 900 * speed;
    }

    function packAttribute(
        string memory color,
        FType memory ft,
        uint256 level,
        uint256 period,
        uint256 startingLocation
    ) internal pure returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '{"color": "',
                    string(
                        abi.encodePacked(
                            color,
                            '","type":"',
                            parseFilterType(ft.filterType),
                            '","speedLevel":"',
                            Strings.toString(level),
                            '","period":"',
                            string(abi.encodePacked(Strings.toString(period), ' block')),
                            '","startingLocation":"',
                            Strings.toString(startingLocation)
                        )
                    ),
                    '"}'
                )
            );
    }

    function _tokenURI(
        uint256 tokenId,
        FType memory ft,
        string memory color,
        uint256 location,
        uint256 startingLocation,
        uint256 speed,
        uint256 level
    ) internal pure returns (string memory) {
        int256 _location = moonLocation(location, startingLocation, speed);
        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "SVG #',
                        Strings.toString(tokenId),
                        '", "description": "", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(generatePlant(color, _location, ft))),
                        '","attributes": ',
                        packAttribute(color, ft, level, _getPeriod(speed), startingLocation),
                        '}'
                    )
                )
            )
        );
        return string(abi.encodePacked('data:application/json;base64,', json));
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        (uint256 speed, uint256 level) = getSpeed(tokenId);
        return
            _tokenURI(
                tokenId,
                getType(tokenId),
                getColor(tokenId),
                block.number,
                getStartingLocation(tokenId),
                speed,
                level
            );
    }

    // Private and Internal functions

    /**
     * @dev Returns a random available token to be minted
     *
     * Code used as reference:
     * https://github.com/1001-digital/erc721-extensions/blob/main/contracts/RandomlyAssigned.sol
     */
    function _getTokenToBeMinted(uint16 _totalMintedTokens) private returns (uint16) {
        uint16 maxIndex = uint16(maxSupply - totalSupply());
        uint16 random = CryptoSVGLibrary.getRandomNumber(maxIndex, _totalMintedTokens);

        uint16 tokenId = tokenMatrix[random];
        if (tokenMatrix[random] == 0) {
            tokenId = random;
        }

        tokenMatrix[maxIndex - 1] == 0 ? tokenMatrix[random] = maxIndex - 1 : tokenMatrix[random] = tokenMatrix[
            maxIndex - 1
        ];

        return tokenId;
    }

    function mint(uint256 amount) public payable {
        require(active, 'No active');
        require(amount <= maxMintAmount, 'Exceed limit');
        require(msg.value >= price * amount, 'Insufficient ether provided');
        uint256 supply = totalSupply();
        require(supply + amount <= maxSupply, 'Exceed amount');

        uint16 tmpTotalMintedTokens = uint16(supply);
        for (uint256 i; i < amount; i++) {
            _safeMint(_msgSender(), _getTokenToBeMinted(tmpTotalMintedTokens));
            tmpTotalMintedTokens++;
        }
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, 'No balance');

        require(payable(msg.sender).send(balance));
    }

    function setActive(bool _active) public onlyOwner {
        active = _active;
    }

    constructor() ERC721('CryptoSVG', 'CRYPTOSVG') Ownable() {}
}

library CryptoSVGLibrary {
    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    /**
     * @dev Generates a pseudo-random number.
     */
    function getRandomNumber(uint16 _upper, uint16 _totalMintedTokens) internal view returns (uint16) {
        uint16 rand = uint16(
            random(
                string(
                    abi.encodePacked(
                        _totalMintedTokens,
                        blockhash(block.number - 1),
                        block.coinbase,
                        block.difficulty,
                        msg.sender
                    )
                )
            )
        );

        return rand % _upper;
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return '';

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSpeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStartingLocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","outputs":[{"components":[{"internalType":"enum CryptoSVG.FilterType","name":"filterType","type":"uint8"},{"internalType":"string","name":"baseFrequency","type":"string"},{"internalType":"string","name":"numOctaves","type":"string"},{"internalType":"string","name":"surfaceScale","type":"string"}],"internalType":"struct CryptoSVG.FType","name":"","type":"tuple"}],"stateMutability":"pure","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":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"bool","name":"_active","type":"bool"}],"name":"setActive","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":"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":[],"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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b3600b55600c805460ff191690553480156200002157600080fd5b506040518060400160405280600981526020016843727970746f53564760b81b8152506040518060400160405280600981526020016843525950544f53564760b81b81525081600090805190602001906200007e9291906200010d565b508051620000949060019060208401906200010d565b505050620000b1620000ab620000b760201b60201c565b620000bb565b620001f0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b615fac80620002006000396000f3fe6080604052600436106101d85760003560e01c80636352211e11610102578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610549578063d5abeb0114610569578063e985e9c51461057f578063f2fde38b146105c857600080fd5b8063a0712d68146104d6578063a22cb465146104e9578063acec338a14610509578063b88d4fde1461052957600080fd5b806380057b9a116100d157806380057b9a146104685780638da5cb5b1461048857806395d89b41146104a6578063a035b1fe146104bb57600080fd5b80636352211e146103f3578063642293821461041357806370a0823114610433578063715018a61461045357600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e1461035e5780634b2c07061461037e5780634b93f7531461039e5780634f6ccce7146103d357600080fd5b806323b872dd146102dc5780632f745c59146102fc5780633ccfd60b1461031c5780634036ab781461033157600080fd5b8063081812fc116101b6578063081812fc1461024e578063095ea7b31461028657806318160ddd146102a8578063239c70ae146102c757600080fd5b806301ffc9a7146101dd57806302fb0c5e1461021257806306fdde031461022c575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046145cf565b6105e8565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50600c546101fd9060ff1681565b34801561023857600080fd5b50610241610613565b6040516102099190614644565b34801561025a57600080fd5b5061026e610269366004614657565b6106a5565b6040516001600160a01b039091168152602001610209565b34801561029257600080fd5b506102a66102a136600461468c565b61073f565b005b3480156102b457600080fd5b506008545b604051908152602001610209565b3480156102d357600080fd5b506102b9601481565b3480156102e857600080fd5b506102a66102f73660046146b6565b610855565b34801561030857600080fd5b506102b961031736600461468c565b610886565b34801561032857600080fd5b506102a661091c565b34801561033d57600080fd5b5061035161034c366004614657565b6109a9565b6040516102099190614708565b34801561036a57600080fd5b506102a66103793660046146b6565b610be9565b34801561038a57600080fd5b506102b9610399366004614657565b610c04565b3480156103aa57600080fd5b506103be6103b9366004614657565b610c23565b60408051928352602083019190915201610209565b3480156103df57600080fd5b506102b96103ee366004614657565b610dc1565b3480156103ff57600080fd5b5061026e61040e366004614657565b610e54565b34801561041f57600080fd5b506102b961042e366004614657565b610ecb565b34801561043f57600080fd5b506102b961044e366004614793565b610f01565b34801561045f57600080fd5b506102a6610f88565b34801561047457600080fd5b50610241610483366004614657565b610fbe565b34801561049457600080fd5b50600a546001600160a01b031661026e565b3480156104b257600080fd5b50610241611027565b3480156104c757600080fd5b506102b9661ff973cafa800081565b6102a66104e4366004614657565b611036565b3480156104f557600080fd5b506102a66105043660046147be565b6111b5565b34801561051557600080fd5b506102a66105243660046147f1565b61127a565b34801561053557600080fd5b506102a6610544366004614822565b6112b7565b34801561055557600080fd5b50610241610564366004614657565b6112e9565b34801561057557600080fd5b506102b9600b5481565b34801561058b57600080fd5b506101fd61059a3660046148fe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105d457600080fd5b506102a66105e3366004614793565b61132a565b60006001600160e01b0319821663780e9d6360e01b148061060d575061060d826113c2565b92915050565b60606000805461062290614928565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90614928565b801561069b5780601f106106705761010080835404028352916020019161069b565b820191906000526020600020905b81548152906001019060200180831161067e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061074a82610e54565b9050806001600160a01b0316836001600160a01b031614156107b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161071a565b336001600160a01b03821614806107d457506107d4813361059a565b6108465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071a565b6108508383611412565b505050565b61085f3382611480565b61087b5760405162461bcd60e51b815260040161071a90614963565b610850838383611573565b600061089183610f01565b82106108f35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161071a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146109465760405162461bcd60e51b815260040161071a906149b4565b47806109815760405162461bcd60e51b815260206004820152600a6024820152694e6f2062616c616e636560b01b604482015260640161071a565b604051339082156108fc029083906000818181858888f193505050506109a657600080fd5b50565b6109d5604080516080810190915280600081526020016060815260200160608152602001606081525090565b60006109fd604051806040016040528060048152602001637479706560e01b8152508461171e565b90506000610a306040518060400160405280600d81526020016c626173654672657175656e637960981b8152508561171e565b90506000610a606040518060400160405280600a8152602001696e756d4f63746176657360b01b8152508661171e565b90506000610a926040518060400160405280600c81526020016b737572666163655363616c6560a01b8152508761171e565b90506000610aa16064866149ff565b610aac906001614a29565b90506000610abb6005866149ff565b610ac6906001614a29565b90506000610ad56005866149ff565b610ae0906001614a29565b90506000610aef6003866149ff565b610afa906001614a29565b9050600060198511610b0e57506000610b72565b602d8511610b1e57506001610b72565b603c8511610b2e57506002610b72565b604b8511610b3e57506003610b72565b60558511610b4e57506005610b72565b605f8511610b5e57506004610b72565b60628511610b6e57506007610b72565b5060065b6040518060800160405280826007811115610b8f57610b8f6146f2565b8152602001610b9d86611752565b604051602001610bad9190614a41565b6040516020818303038152906040528152602001610bca85611752565b8152602001610bd884611752565b90529b9a5050505050505050505050565b610850838383604051806020016040528060008152506112b7565b600080610c1083610c23565b509050610c1c81611850565b9392505050565b6000806000610c4f604051806040016040528060058152602001641cdc19595960da1b8152508561171e565b905060006001905060006064610c82604051806040016040528060058152602001641b195d995b60da1b8152508861171e565b610c8c91906149ff565b610c97906001614a29565b9050600660198211610cc657610caf6101e7856149ff565b610cbb90610201614a29565b925060069050610db4565b60328211610cf157610cda610100856149ff565b610ce690610101614a29565b925060059050610db4565b604b8211610d1a57610d046080856149ff565b610d0f906081614a29565b925060049050610db4565b60558211610d4357610d2d6040856149ff565b610d38906041614a29565b925060039050610db4565b605f8211610d6c57610d566030856149ff565b610d61906011614a29565b925060029050610db4565b60628211610d9557610d7f6010856149ff565b610d8a906001614a29565b925060019050610db4565b610da1612328856149ff565b610dad906103e8614a29565b9250600090505b9196919550909350505050565b6000610dcc60085490565b8210610e2f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161071a565b60088281548110610e4257610e42614a6c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061060d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161071a565b6000610385610ef7604051806040016040528060058152602001641cdd185c9d60da1b8152508461171e565b61060d91906149ff565b60006001600160a01b038216610f6c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161071a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610fb25760405162461bcd60e51b815260040161071a906149b4565b610fbc600061185e565b565b60606000610fe96040518060400160405280600581526020016431b7b637b960d91b8152508461171e565b9050611000610ff7826118b0565b60026008611904565b6040516020016110109190614a82565b604051602081830303815290604052915050919050565b60606001805461062290614928565b600c5460ff166110745760405162461bcd60e51b81526020600482015260096024820152684e6f2061637469766560b81b604482015260640161071a565b60148111156110b45760405162461bcd60e51b815260206004820152600c60248201526b115e18d95959081b1a5b5a5d60a21b604482015260640161071a565b6110c581661ff973cafa8000614aab565b3410156111145760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742065746865722070726f76696465640000000000604482015260640161071a565b600061111f60085490565b600b5490915061112f8383614a29565b111561116d5760405162461bcd60e51b815260206004820152600d60248201526c115e18d9595908185b5bdd5b9d609a1b604482015260640161071a565b8060005b838110156111af5761118f33611186846119d1565b61ffff16611acc565b8161119981614aca565b92505080806111a790614aec565b915050611171565b50505050565b6001600160a01b03821633141561120e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146112a45760405162461bcd60e51b815260040161071a906149b4565b600c805460ff1916911515919091179055565b6112c13383611480565b6112dd5760405162461bcd60e51b815260040161071a90614963565b6111af84848484611aea565b60606000806112f784610c23565b9150915061132284611308866109a9565b61131187610fbe565b4361131b89610ecb565b8787611b1d565b949350505050565b600a546001600160a01b031633146113545760405162461bcd60e51b815260040161071a906149b4565b6001600160a01b0381166113b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071a565b6109a68161185e565b60006001600160e01b031982166380ac58cd60e01b14806113f357506001600160e01b03198216635b5e139f60e01b145b8061060d57506301ffc9a760e01b6001600160e01b031983161461060d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144782610e54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114f95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161071a565b600061150483610e54565b9050806001600160a01b0316846001600160a01b0316148061153f5750836001600160a01b0316611534846106a5565b6001600160a01b0316145b8061132257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611322565b826001600160a01b031661158682610e54565b6001600160a01b0316146115ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161071a565b6001600160a01b0382166116505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161071a565b61165b838383611bbb565b611666600082611412565b6001600160a01b038316600090815260036020526040812080546001929061168f908490614b07565b90915550506001600160a01b03821660009081526003602052604081208054600192906116bd908490614a29565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000610c1c8361172d84611752565b60405160200161173e929190614b1e565b604051602081830303815290604052611c73565b6060816117765750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117a0578061178a81614aec565b91506117999050600a83614b4d565b915061177a565b60008167ffffffffffffffff8111156117bb576117bb61480c565b6040519080825280601f01601f1916602001820160405280156117e5576020820181803683370190505b5090505b8415611322576117fa600183614b07565b9150611807600a866149ff565b611812906030614a29565b60f81b81838151811061182757611827614a6c565b60200101906001600160f81b031916908160001a905350611849600a86614b4d565b94506117e9565b600061060d82610384614aab565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816118d75750506040805180820190915260048152630307830360e41b602082015290565b8160005b81156118fa57806118eb81614aec565b915050600882901c91506118db565b6113228482611ca4565b60608360006119138585614b07565b67ffffffffffffffff81111561192b5761192b61480c565b6040519080825280601f01601f191660200182016040528015611955576020820181803683370190505b509050845b848110156119c75782818151811061197457611974614a6c565b01602001516001600160f81b0319168261198e8884614b07565b8151811061199e5761199e614a6c565b60200101906001600160f81b031916908160001a905350806119bf81614aec565b91505061195a565b5095945050505050565b6000806119dd60085490565b600b546119ea9190614b07565b905060006119f88285611e40565b61ffff8082166000908152600d60205260409020549192501680611a195750805b600d6000611a28600186614b61565b61ffff90811682526020820192909252604001600020541615611a9357600d6000611a54600186614b61565b61ffff908116825260208083019390935260409182016000908120548683168252600d90945291909120805461ffff1916929091169182179055611ac3565b611a9e600184614b61565b61ffff8381166000908152600d60205260409020805461ffff19169183169190911790555b50949350505050565b611ae6828260405180602001604052806000815250611eb0565b5050565b611af5848484611573565b611b0184848484611ee3565b6111af5760405162461bcd60e51b815260040161071a90614b84565b60606000611b2c868686611ff0565b90506000611b8a611b3c8b611752565b611b4f611b4a8b868e61202b565b613781565b611b648b8d89611b5e8c611850565b8d6138e7565b604051602001611b7693929190614bd6565b604051602081830303815290604052613781565b905080604051602001611b9d9190614cb0565b60405160208183030381529060405292505050979650505050505050565b6001600160a01b038316611c1657611c1181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c39565b816001600160a01b0316836001600160a01b031614611c3957611c39838261397c565b6001600160a01b038216611c505761085081613a19565b826001600160a01b0316826001600160a01b031614610850576108508282613ac8565b600081604051602001611c869190614cf5565b60408051601f19818403018152919052805160209091012092915050565b60606000611cb3836002614aab565b611cbe906002614a29565b67ffffffffffffffff811115611cd657611cd661480c565b6040519080825280601f01601f191660200182016040528015611d00576020820181803683370190505b509050600360fc1b81600081518110611d1b57611d1b614a6c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d4a57611d4a614a6c565b60200101906001600160f81b031916908160001a9053506000611d6e846002614aab565b611d79906001614a29565b90505b6001811115611df1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dad57611dad614a6c565b1a60f81b828281518110611dc357611dc3614a6c565b60200101906001600160f81b031916908160001a90535060049490941c93611dea81614d11565b9050611d7c565b508315610c1c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161071a565b600080611ea483611e52600143614b07565b60405160f09290921b6001600160f01b031916602083015240602282015241606090811b6bffffffffffffffffffffffff1990811660428401524460568401523390911b166076820152608a0161173e565b90506113228482614d28565b611eba8383613b0c565b611ec76000848484611ee3565b6108505760405162461bcd60e51b815260040161071a90614b84565b60006001600160a01b0384163b15611fe557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f27903390899088908890600401614d49565b602060405180830381600087803b158015611f4157600080fd5b505af1925050508015611f71575060408051601f3d908101601f19168201909252611f6e91810190614d86565b60015b611fcb573d808015611f9f576040519150601f19603f3d011682016040523d82523d6000602084013e611fa4565b606091505b508051611fc35760405162461bcd60e51b815260040161071a90614b84565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611322565b506001949350505050565b600061038583816120018588614b4d565b61200b9190614da3565b6120159190614db7565b61201f9190614da3565b611322906102ee614df8565b60408051808201825260038082526203135360ec1b602080840191909152835180850185529182526203330360ec1b82820152835180850185526001808252603160f81b8284015285518087018752908152600360fc1b81840152855192830190955260008083526060959192906120a289613c5a565b88519091506120af614591565b6040518060800160405280605d8152602001615eec605d913981526040805180820182526004808252632d302e3160e01b60208381018290528451808601865292835282810191909152835180850190945260018452601960f91b9084015261211c928992919083613c98565b81600160200201819052506121b8604051806040016040528060018152602001601960f91b815250604051806040016040528060048152602001632d302e3160e01b815250604051806040016040528060048152602001632d302e3160e01b815250604051806040016040528060018152602001601960f91b81525060405180604001604052806002815260200161031360f41b815250613c98565b8160026020020181905250612254604051806040016040528060018152602001603360f81b815250604051806040016040528060048152602001631698171960e11b815250604051806040016040528060048152602001631698171960e11b815250604051806040016040528060018152602001603360f81b81525060405180604001604052806002815260200161323160f01b815250613c98565b60608201526040805180820182526001808252600d60fa1b60208381019190915283518085018552918252601960f91b8282015283518085019094526002845261393160f01b908401526122ab9288918291613c98565b816004602002018190525061232d604051806040016040528060018152602001603560f81b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a604051806040016040528060018152602001603760f81b815250613c98565b81600560200201819052506123b0604051806040016040528060018152602001601b60f91b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a60405180604001604052806002815260200161323160f01b815250613c98565b8160066020020181905250612432604051806040016040528060018152602001603760f81b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a604051806040016040528060018152602001601b60f91b815250613c98565b60e082015260408051808201825260018152603960f81b602082810191909152825160c0810184528881528082018990528084018a905283518085018552600c81526b6672616374616c4e6f69736560a01b818401526060820152908d01516080820152918c015160a08301526124a891613d15565b6101008201526040805180820182526002815261031360f41b602082810191909152825160c0810184528881528082018990528084018a905283518085018552600a81526974757262756c656e636560b01b818401526060820152908d01516080820152918c015160a083015261251e91613d15565b610120820152604080518082019091526002815261313160f01b6020820152612547908d613da8565b6101408201526040805180820182526002815261189960f11b602082810191909152825180840190935260078352660233030303030360cc1b9083015261258d91613da8565b6101608201526040805180820190915260028152610c4d60f21b60208201526125b590613dd4565b610180820152604080518082019091526002815261313560f01b602082015260608b01516125e591908e90613dfd565b6101a08201526040805180820190915260078152661e17b232b3399f60c91b602082015281600e602002018190525061269660405180604001604052806002815260200161723160f01b8152506040518061010001604052808b81526020018a815260200161266b606488605061265c9190614aab565b6126669190614b4d565b611752565b815260006020820181905260408201899052606082018990526080820152600160a090910152613e2c565b6101e08201526126a785808e61404e565b610200820152604080518082019091526004815263302e383960e01b60208201526126d49086908e61404e565b6102208201526040805180820182526004815263302e393960e01b60208281019190915282518084019093526003835262302e3960e81b90830152612719918e61404e565b61024082015261272a85878e61404e565b61026082015260408051808201825260118152701e17b930b234b0b623b930b234b2b73a1f60791b602080830191909152610280840191909152815180830183526002815261391960f11b81830152825161014081018452600361010082019081526203233360ec1b61012083015281529182018a90526127ba92909190810161266b606461265c89601e614aab565b6102a08201526127cb85808e61404e565b6102c0820152604080518082019091526004815263302e383960e01b60208201526127f89086908e61404e565b6102e08201526040805180820182526004815263302e393960e01b60208281019190915282518084019093526003835262302e3960e81b9083015261283d918e61404e565b61030082015261284e85878e61404e565b61032082015260408051808201825260118152701e17b930b234b0b623b930b234b2b73a1f60791b602080830191909152610340840191909152815180830183526002815261723360f01b818301528251610140810184526003610100820181815262302e3360e81b610120840181905290835285518087018752828152808601919091528285015284518086018652818152620c0b8d60ea1b81860152828601526001606083018190528551808701875282815262302e3560e81b818701819052608085019190915286518088019097529186529385015260a081019390935260c0830191909152600060e083015261294791613e2c565b6103608201526040805180820190915260078152660233030303030360cc1b6020820152612978908790879061404e565b61038082015261298986808e61404e565b6103a08201526040805180820190915260118152701e17b930b234b0b623b930b234b2b73a1f60791b602082015281601e60200201819052506129e8604051806040016040528060028152602001616c3160f01b815250868789614065565b6103e08201526129f986868e61404e565b6104008201526040805180820190915260078152660233030303030360cc1b6020820152612a2a908790819061404e565b6104208201526040805180820190915260118152701e17b634b732b0b923b930b234b2b73a1f60791b602082015281602260200201819052506040518060600160405280602e8152602001615f49602e913961046082015260078281811115612a9557612a956146f2565b14612aa05783612ac3565b612ac360405180604001604052806002815260200161313160f01b8152506140b6565b604051602001612ad39190614e37565b60408051808303601f190181529190526104808201526002826007811115612afd57612afd6146f2565b14612bea576003826007811115612b1657612b166146f2565b14612b98576007826007811115612b2f57612b2f6146f2565b1480612b4c57506006826007811115612b4a57612b4a6146f2565b145b612b9257612b8d6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80896140b6565b81526020018890526140c9565b612c2e565b83612c2e565b612b8d6040518060c0016040528087815260200187815260200160968152602001612bdc60405180604001604052806002815260200161723360f01b8152506140b6565b8152602001612b80896140b6565b612c2e6040518060c0016040528087815260200187815260200160968152602001612bdc604051806040016040528060028152602001616c3160f01b8152506140b6565b6104a08201526002826007811115612c4857612c486146f2565b14612d5a576003826007811115612c6157612c616146f2565b14612cef576007826007811115612c7a57612c7a6146f2565b1480612c9757506006826007811115612c9557612c956146f2565b145b612ce957612ce46040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001601960f91b8152506140b6565b612d9e565b83612d9e565b612ce46040518060c0016040528087815260200187815260200160968152602001612d3360405180604001604052806002815260200161723360f01b8152506140b6565b8152602001612b80604051806040016040528060018152602001601960f91b8152506140b6565b612d9e6040518060c0016040528087815260200187815260200160968152602001612d33604051806040016040528060028152602001616c3160f01b8152506140b6565b6104c082015260078281811115612db757612db76146f2565b14613063576000826007811115612dd057612dd06146f2565b1461301a576005826007811115612de957612de96146f2565b14612fd0576006826007811115612e0257612e026146f2565b14612f86576001826007811115612e1b57612e1b6146f2565b14612f3c576002826007811115612e3457612e346146f2565b14612ef8576003826007811115612e4d57612e4d6146f2565b14612ea057612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001603960f81b8152506140b6565b6130ad565b612e9b6040518060c0016040528087815260200187815260200160968152602001612ee460405180604001604052806002815260200161723360f01b8152506140b6565b8152602001868152602001888152506140c9565b612e9b6040518060c0016040528087815260200187815260200160968152602001612ee4604051806040016040528060028152602001616c3160f01b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161313560f01b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060028152602001610c4d60f21b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161031360f41b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001603360f81b8152506140b6565b6130ad6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161313160f01b8152506140b6565b6104e08201526040805180820190915260048152631e17b39f60e11b60208201526105008201526130de8b83614122565b610520820152600782818111156130f7576130f76146f2565b14613143576006826007811115613110576131106146f2565b1461311b5783613166565b61313e604051806040016040528060028152602001610c4d60f21b8152506140b6565b613166565b61316660405180604001604052806002815260200161313160f01b8152506140b6565b6040516020016131769190614e9c565b60408051601f1981840301815291905281602a60200201819052506132158b6040518060c001604052808b81526020018a8152602001606481526020016131d660405180604001604052806002815260200161723160f01b8152506140b6565b815260200160405180602001604052806000815250815260200160405180604001604052806004815260200163302e323560e01b8152508152506141d0565b6105608201526040805161010081018252600360c082019081526232323560e81b60e0830152815260208181018a905260328284015282518084019093526002835261391960f11b90830152613276918d919060608201906131d6906140b6565b6105808201526040805161010081018252600360c082019081526203131360ec1b60e0830152815260208181018a9052601e82840152606082018f90528251808201845260008152608083015282518084019093526004835263302e313560e01b9083015260a08101919091526132ee908c906141d0565b81602d60200201819052506133758b6040518060c00160405280604051806040016040528060038152602001620646e760eb1b81525081526020018a8152602001603281526020018f815260200160405180602001604052806000815250815260200160405180604001604052806003815260200162302e3160e81b8152508152506141d0565b6105c08201526040805180820190915260048152631e17b39f60e11b60208201526105e082015260068260078111156133b0576133b06146f2565b146133bb57836133de565b6133de604051806040016040528060028152602001610c4d60f21b8152506140b6565b6040516020016133ee9190614e9c565b60408051601f1981840301815291905281603060200201819052506134818b6040518060e001604052808b81526020018a8152602001600f8152602001602381526020018f815260200161345a604051806040016040528060018152602001603560f81b8152506140b6565b8152602001604051806040016040528060018152602001603160f81b81525081525061423c565b81603160200201819052506134dd8b6040518060e001604052808b81526020018a815260200160198152602001602381526020018f815260200161345a604051806040016040528060018152602001601b60f91b8152506140b6565b81603260200201819052506135398b6040518060e001604052808b81526020018a8152602001600a8152602001601e81526020018f815260200161345a604051806040016040528060018152602001603760f81b8152506140b6565b61066082015260408051808201825260048152631e17b39f60e11b602080830191909152610680840191909152815180830190925260068252651e17b9bb339f60d11b908201526106a082015283600860005b600681101561371f5782846135a18484614aab565b603681106135b1576135b1614a6c565b6020020151856135c18585614aab565b6135cc906001614a29565b603681106135dc576135dc614a6c565b6020020151866135ec8686614aab565b6135f7906002614a29565b6036811061360757613607614a6c565b6020020151876136178787614aab565b613622906003614a29565b6036811061363257613632614a6c565b6020020151886136428888614aab565b61364d906004614a29565b6036811061365d5761365d614a6c565b60200201518961366d8989614aab565b613678906005614a29565b6036811061368857613688614a6c565b60200201518a6136988a8a614aab565b6136a3906006614a29565b603681106136b3576136b3614a6c565b60200201518b6136c38b8b614aab565b6136ce906007614a29565b603681106136de576136de614a6c565b60200201516040516020016136fb99989796959493929190614edc565b6040516020818303038152906040529250808061371790614aec565b91505061358c565b506106008301516106208401516106408501516106608601516106808701516106a088015160405161375f96899690959094909390929091602001614f9d565b60408051808303601f190181529190529e9d5050505050505050505050505050565b8051606090806137a1575050604080516020810190915260008152919050565b600060036137b0836002614a29565b6137ba9190614b4d565b6137c5906004614aab565b905060006137d4826020614a29565b67ffffffffffffffff8111156137ec576137ec61480c565b6040519080825280601f01601f191660200182016040528015613816576020820181803683370190505b5090506000604051806060016040528060408152602001615eac604091399050600181016020830160005b868110156138a2576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613841565b5060038606600181146138bc57600281146138cd576138d9565b613d3d60f01b6001198301526138d9565b603d60f81b6000198301525b505050918152949350505050565b6060856138f786600001516142e5565b61390086611752565b61390986611752565b604051602001613919919061502f565b60405160208183030381529060405261393186611752565b604051602001613945959493929190615059565b60408051601f198184030181529082905261396291602001615136565b604051602081830303815290604052905095945050505050565b6000600161398984610f01565b6139939190614b07565b6000838152600760205260409020549091508082146139e6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613a2b90600190614b07565b60008381526009602052604081205460088054939450909284908110613a5357613a53614a6c565b906000526020600020015490508060088381548110613a7457613a74614a6c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613aac57613aac615176565b6001900381819060005260206000200160009055905550505050565b6000613ad383610f01565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613b625760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071a565b6000818152600260205260409020546001600160a01b031615613bc75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071a565b613bd360008383611bbb565b6001600160a01b0382166000908152600360205260408120805460019290613bfc908490614a29565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008061012c8312801590613c7157506101368313155b1561060d57613c8261012c84614df8565b613c8d90600a614aab565b610c1c906064614b07565b60606000868686604051602001613cb19392919061518c565b6040516020818303038152906040529050868686604051602001613cd79392919061518c565b60408051601f1981840301815290829052613cfa9186908190879060200161520c565b60408051808303601f19018152919052979650505050505050565b606060008383600001518460200151604051602001613d369392919061518c565b60408051601f19818403018152828252908501516060860151919350613d6292849282916020016152d5565b60405160208183030381529060405290508083608001518460a00151604051602001613d909392919061537d565b60408051808303601f19018152919052949350505050565b60608282604051602001613dbd929190615449565b604051602081830303815290604052905092915050565b606081604051602001613de79190615658565b6040516020818303038152906040529050919050565b6060838383604051602001613e1493929190615798565b60405160208183030381529060405290509392505050565b60606000838360e00151613e5957604051806040016040528060018152602001601160f91b815250613e90565b6040518060400160405280602081526020017f22206772616469656e74556e6974733d227573657253706163654f6e557365228152505b84516020808701516040808901519051613ead969594930161594a565b6040516020818303038152906040529050808360600151613ee757604051806040016040528060018152602001601160f91b815250613f07565b604051806040016040528060068152602001651110333c1e9160d11b8152505b8460600151613f255760405180602001604052806000815250613f2b565b84608001515b8560600151613f495760405180602001604052806000815250613f69565b604051806040016040528060068152602001651110333c9e9160d11b8152505b8660600151613f875760405180602001604052806000815250613f8d565b8660a001515b8760600151613fc3576040518060400160405280600f81526020016e1039b83932b0b226b2ba3437b21e9160891b815250613fed565b6040518060400160405280601081526020016f111039b83932b0b226b2ba3437b21e9160811b8152505b8860c0015161401757604051806040016040528060038152602001621c185960ea1b815250614038565b604051806040016040528060078152602001661c99599b1958dd60ca1b8152505b604051602001613d909796959493929190615a13565b6060818484604051602001613e1493929190615aaf565b60608484848460405160200161407e9493929190615b5d565b60408051601f198184030181529082905261409d918490602001615c27565b6040516020818303038152906040529050949350505050565b606081604051602001613de79190615c63565b606061060d6040518060e001604052808460000151815260200184602001518152602001846040015181526020018460400151815260200184606001518152602001846080015181526020018460a001518152506144e1565b60606007826007811115614138576141386146f2565b14614193576006826007811115614151576141516146f2565b1461416b57604051806020016040528060008152506141b6565b61418e604051806040016040528060028152602001610c4d60f21b8152506140b6565b6141b6565b6141b660405180604001604052806002815260200161189960f11b8152506140b6565b6141bf8461454b565b604051602001613dbd929190615c9b565b6060610c1c6040518060c00160405280846000015181526020018460200151815260200160646141ff87613c5a565b866040015161420e9190614aab565b6142189190614b4d565b815260608086015160208301526080860151604083015260a08601519101526140c9565b6060600061424984613c5a565b90506113226040518060e001604052808560000151815260200185602001518152602001606484876040015161427f9190614aab565b6142899190614b4d565b815260200160648487606001516142a09190614aab565b6142aa9190614b4d565b8152602001856080015181526020018560a001518152602001604051806040016040528060018152602001603160f81b8152508152506144e1565b606060008260078111156142fb576142fb6146f2565b141561432157505060408051808201909152600481526331363ab960e11b602082015290565b6001826007811115614335576143356146f2565b141561435e5750506040805180820190915260078152667465787475726560c81b602082015290565b6002826007811115614372576143726146f2565b141561439a5750506040805180820190915260068152653634b732b0b960d11b602082015290565b60038260078111156143ae576143ae6146f2565b14156143d65750506040805180820190915260068152651c98591a585b60d21b602082015290565b60048260078111156143ea576143ea6146f2565b1415614413575050604080518082019091526007815266199c9858dd185b60ca1b602082015290565b6005826007811115614427576144276146f2565b141561445357505060408051808201909152600a81526974757262756c656e636560b01b602082015290565b6006826007811115614467576144676146f2565b141561448e5750506040805180820190915260058152641c1a5e195b60da1b602082015290565b60078260078111156144a2576144a26146f2565b14156144cd5750506040805180820190915260098152683ab73932b3bab630b960b91b602082015290565b505060408051602081019091526000815290565b6060816000015182602001516144fa8460400151611752565b60405160200161450c93929190615d1b565b6040516020818303038152906040526145288360600151611752565b83608001518460a001518560c00151604051602001613de7959493929190615db1565b604080516020810190915260008082526060919083126145755761456e83611752565b905061060d565b61458161266684615e72565b604051602001613dbd9190615e8f565b604051806106c001604052806036905b60608152602001906001900390816145a15790505090565b6001600160e01b0319811681146109a657600080fd5b6000602082840312156145e157600080fd5b8135610c1c816145b9565b60005b838110156146075781810151838201526020016145ef565b838111156111af5750506000910152565b600081518084526146308160208601602086016145ec565b601f01601f19169290920160200192915050565b602081526000610c1c6020830184614618565b60006020828403121561466957600080fd5b5035919050565b80356001600160a01b038116811461468757600080fd5b919050565b6000806040838503121561469f57600080fd5b6146a883614670565b946020939093013593505050565b6000806000606084860312156146cb57600080fd5b6146d484614670565b92506146e260208501614670565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b60208152600082516008811061472e57634e487b7160e01b600052602160045260246000fd5b8060208401525060208301516080604084015261474e60a0840182614618565b90506040840151601f198085840301606086015261476c8383614618565b925060608601519150808584030160808601525061478a8282614618565b95945050505050565b6000602082840312156147a557600080fd5b610c1c82614670565b8035801515811461468757600080fd5b600080604083850312156147d157600080fd5b6147da83614670565b91506147e8602084016147ae565b90509250929050565b60006020828403121561480357600080fd5b610c1c826147ae565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561483857600080fd5b61484185614670565b935061484f60208601614670565b925060408501359150606085013567ffffffffffffffff8082111561487357600080fd5b818701915087601f83011261488757600080fd5b8135818111156148995761489961480c565b604051601f8201601f19908116603f011681019083821181831017156148c1576148c161480c565b816040528281528a60208487010111156148da57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561491157600080fd5b61491a83614670565b91506147e860208401614670565b600181811c9082168061493c57607f821691505b6020821081141561495d57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082614a0e57614a0e6149e9565b500690565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a3c57614a3c614a13565b500190565b620302e360ec1b815260008251614a5f8160038501602087016145ec565b9190910160030192915050565b634e487b7160e01b600052603260045260246000fd5b602360f81b815260008251614a9e8160018501602087016145ec565b9190910160010192915050565b6000816000190483118215151615614ac557614ac5614a13565b500290565b600061ffff80831681811415614ae257614ae2614a13565b6001019392505050565b6000600019821415614b0057614b00614a13565b5060010190565b600082821015614b1957614b19614a13565b500390565b60008351614b308184602088016145ec565b835190830190614b448183602088016145ec565b01949350505050565b600082614b5c57614b5c6149e9565b500490565b600061ffff83811690831681811015614b7c57614b7c614a13565b039392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6e7b226e616d65223a2022535647202360881b81528351600090614c0181600f8501602089016145ec565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a2022600f918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602f8201528451614c648160498401602089016145ec565b6f011161130ba3a3934b13aba32b9911d160851b604992909101918201528351614c958160598401602088016145ec565b607d60f81b60599290910191820152605a0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614ce881601d8501602087016145ec565b91909101601d0192915050565b60008251614d078184602087016145ec565b9190910192915050565b600081614d2057614d20614a13565b506000190190565b600061ffff80841680614d3d57614d3d6149e9565b92169190910692915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614d7c90830184614618565b9695505050505050565b600060208284031215614d9857600080fd5b8151610c1c816145b9565b600082614db257614db26149e9565b500790565b600080821280156001600160ff1b0384900385131615614dd957614dd9614a13565b600160ff1b8390038412811615614df257614df2614a13565b50500190565b60008083128015600160ff1b850184121615614e1657614e16614a13565b6001600160ff1b0384018313811615614e3157614e31614a13565b50500390565b7f3c67207472616e73666f726d3d227472616e736c617465283330302c2033303081526a1491103334b63a32b91e9160a91b602082015260008251614e8381602b8501602087016145ec565b61111f60f11b602b939091019283015250602d01919050565b6a1e33903334b63a32b91e9160a91b81528151600090614ec381600b8501602087016145ec565b61111f60f11b600b939091019283015250600d01919050565b60008a51614eee818460208f016145ec565b8a51614f008183860160208f016145ec565b8a519184010190614f15818360208e016145ec565b8951614f278183850160208e016145ec565b8951929091010190614f3d818360208c016145ec565b8751614f4f8183850160208c016145ec565b8751929091010190614f65818360208a016145ec565b8551614f778183850160208a016145ec565b8551929091010190614f8d8183602088016145ec565b019b9a5050505050505050505050565b600088516020614fb08285838e016145ec565b895191840191614fc38184848e016145ec565b8951920191614fd58184848d016145ec565b8851920191614fe78184848c016145ec565b8751920191614ff98184848b016145ec565b865192019161500b8184848a016145ec565b855192019161501d81848489016145ec565b919091019a9950505050505050505050565b600082516150418184602087016145ec565b6520626c6f636b60d01b920191825250600601919050565b6000865161506b818460208b016145ec565b691116113a3cb832911d1160b11b908301908152865161509281600a840160208b016145ec565b6f11161139b832b2b22632bb32b6111d1160811b600a929091019182015285516150c381601a840160208a016145ec565b6b1116113832b934b7b2111d1160a11b601a929091019182015284516150f08160268401602089016145ec565b7511161139ba30b93a34b733a637b1b0ba34b7b7111d1160511b60269290910191820152835161512781603c8401602088016145ec565b01603c01979650505050505050565b6a3d9131b7b637b9111d101160a91b8152815160009061515d81600b8501602087016145ec565b61227d60f01b600b939091019283015250600d01919050565b634e487b7160e01b600052603160045260246000fd5b6b1e3334b63a32b91034b21e9160a11b815283516000906151b481600c8501602089016145ec565b6411103c1e9160d91b600c9184019182015284516151d98160118401602089016145ec565b6411103c9e9160d91b6011929091019182015283516151ff8160168401602088016145ec565b0160160195945050505050565b6000855161521e818460208a016145ec565b6811103bb4b23a341e9160b91b9083019081528551615244816009840160208a016145ec565b6911103432b4b3b43a1e9160b11b60099290910191820152845161526f8160138401602089016145ec565b7f223e3c6665476175737369616e426c757220737464446576696174696f6e3d226013929091019182015283516152ad8160338401602088016145ec565b6c1110179f1e17b334b63a32b91f60991b603392909101918201526040019695505050505050565b600085516152e7818460208a016145ec565b6811103bb4b23a341e9160b91b908301908152855161530d816009840160208a016145ec565b6911103432b4b3b43a1e9160b11b6009929091019182015284516153388160138401602089016145ec565b75111f1e3332aa3ab9313ab632b731b2903a3cb8329e9160511b60139290910191820152835161536f8160298401602088016145ec565b016029019695505050505050565b6000845161538f8184602089016145ec565b7011103130b9b2a33932b8bab2b731bc9e9160791b90830190815284516153bd8160118401602089016145ec565b6d1110373ab6a7b1ba30bb32b99e9160911b6011929091019182015283516153ec81601f8401602088016145ec565b7f22202f3e3c6665436f6d706f73697465206f70657261746f723d22696e222069601f92909101918201527f6e323d22536f757263654772617068696322202f3e3c2f66696c7465723e0000603f820152605d0195945050505050565b6b1e3334b63a32b91034b21e9160a11b8152825160009061547181600c8501602088016145ec565b7f223e3c66654d6f7270686f6c6f6779206f70657261746f723d2264696c617465600c918401918201527f22207261646975733d22322220726573756c743d22723122202f3e3c6665466c602c8201527037b7b210333637b7b216b1b7b637b91e9160791b604c82015283516154ee81605d8401602088016145ec565b7f2220666c6f6f642d6f7061636974793d223122202f3e3c6665436f6d706f7369605d92909101918201527f7465206f70657261746f723d22696e2220696e323d22723122202f3e3c666543607d8201527f6f6d706f7369746520696e323d22536f75726365416c7068612220726573756c609d8201527f743d22633122202f3e3c666554757262756c656e636520747970653d2266726160bd8201527f6374616c4e6f6973652220626173654672657175656e63793d22302e3031203060dd8201527f22206e756d4f6374617665733d22322220736565643d223022202f3e3c66654460fd8201527f6973706c6163656d656e744d617020696e3d22633122207363616c653d22313761011d8201527f2220784368616e6e656c53656c6563746f723d22412220794368616e6e656c5361013d8201527f656c6563746f723d224122202f3e3c2f66696c7465723e00000000000000000061015d82015261017401949350505050565b6b1e3334b63a32b91034b21e9160a11b8152815160009061568081600c8501602087016145ec565b7f223e3c6665466c6f6f64206865696768743d2235222077696474683d22352220600c9390910192830152507f2f3e3c6665436f6d706f736974652077696474683d2231382220686569676874602c8201527f3d22313822202f3e3c666554696c6520696e3d224261636b67726f756e64496d604c8201527f6167652220726573756c743d226122202f3e3c6665436f6d706f73697465206f606c8201527f70657261746f723d22696e2220696e3d22536f75726365477261706869632220608c8201527f696e323d226122202f3e3c66654d6f7270686f6c6f6779206f70657261746f7260ac8201527f3d2264696c61746522207261646975733d223522202f3e3c2f66696c7465723e60cc82015260ec01919050565b6b1e3334b63a32b91034b21e9160a11b815283516000906157c081600c8501602089016145ec565b7f223e3c666554757262756c656e636520747970653d226672616374616c4e6f69600c918401918201527f73652220626173654672657175656e63793d22302e3122206e756d4f63746176602c8201527f65733d22352220726573756c743d223122202f3e3c6665446966667573654c69604c8201527f676874696e6720696e3d223122206c69676874696e672d636f6c6f723d220000606c820152845161586f81608a8401602089016145ec565b6f111039bab93330b1b2a9b1b0b6329e9160811b608a929091019182015283516158a081609a8401602088016145ec565b7f223e3c666544697374616e744c6967687420617a696d7574683d223435222065609a92909101918201527f6c65766174696f6e3d22363022202f3e3c2f6665446966667573654c6967687460ba8201527f696e673e3c6665436f6d706f73697465206f70657261746f723d22696e22206960da8201527f6e323d22536f757263654772617068696322202f3e3c2f66696c7465723e000060fa8201526101180195945050505050565b731e3930b234b0b623b930b234b2b73a1034b21e9160611b8152855160009061597a816014850160208b016145ec565b865190830190615991816014840160208b016145ec565b641031bc1e9160d91b6014929091019182015285516159b7816019840160208a016145ec565b65111031bc9e9160d11b6019929091019182015284516159de81601f8401602089016145ec565b641110391e9160d91b601f92909101918201528351615a048160248401602088016145ec565b01602401979650505050505050565b600088516020615a268285838e016145ec565b895191840191615a398184848e016145ec565b8951920191615a4b8184848d016145ec565b8851920191615a5d8184848c016145ec565b8751920191615a6f8184848b016145ec565b8651920191615a818184848a016145ec565b8551920191615a9381848489016145ec565b61111f60f11b9201918252506002019998505050505050505050565b7f3c73746f70207374796c653d2273746f702d636f6c6f723a0000000000000000815260008451615ae78160188501602089016145ec565b6d1db9ba37b816b7b830b1b4ba3c9d60911b6018918401918201528451615b158160268401602089016145ec565b69111037b33339b2ba1e9160b11b602692909101918201528351615b408160308401602088016145ec565b6211179f60e91b6030929091019182015260330195945050505050565b731e3634b732b0b923b930b234b2b73a1034b21e9160611b81528451600090615b8d816014850160208a016145ec565b6411103c1e9160d91b6014918401918201528551615bb2816019840160208a016145ec565b6411103c9e9160d91b601992909101918201528451615bd881601e8401602089016145ec565b6811103bb4b23a341e9160b91b601e92909101918201528351615c028160278401602088016145ec565b6911103432b4b3b43a1e9160b11b602792909101918201526031019695505050505050565b60008351615c398184602088016145ec565b835190830190615c4d8183602088016145ec565b61111f60f11b9101908152600201949350505050565b6475726c282360d81b815260008251615c838160058501602087016145ec565b602960f81b6005939091019283015250600601919050565b6f1e31b4b931b632903334b63a32b91e9160811b81528251600090615cc78160108501602088016145ec565b65111031bc1e9160d11b6010918401918201528351615ced8160168401602088016145ec565b74111031bc9e911998181110391e91189a981110179f60591b60169290910191820152602b01949350505050565b6c1e32b63634b839b29031bc1e9160991b81528351600090615d4481600d8501602089016145ec565b65111031bc9e9160d11b600d918401918201528451615d6a8160138401602089016145ec565b651110393c1e9160d11b601392909101918201528351615d918160198401602088016145ec565b651110393c9e9160d11b60199290910191820152601f0195945050505050565b60008651615dc3818460208b016145ec565b865190830190615dd7818360208b016145ec565b6711103334b6361e9160c11b91019081528551615dfb816008840160208a016145ec565b6911103334b63a32b91e9160b11b600892909101918201528451615e268160128401602089016145ec565b6a111037b830b1b4ba3c9e9160a91b601292909101918201528351615e5281601d8401602088016145ec565b631110179f60e11b601d9290910191820152602101979650505050505050565b6000600160ff1b821415615e8857615e88614a13565b5060000390565b602d60f81b815260008251614a9e8160018501602087016145ec56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222077696474683d2236303022206865696768743d22363030222076696577426f783d223020302036303020363030223e3c646566733e3c7265637420783d22302220793d22302220206865696768743d22363030222077696474683d2236303022202f3ea2646970667358221220da0310f70aadf921a1c99d85a02222088d2df875c139cabbba7ff976c943355564736f6c63430008090033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636352211e11610102578063a0712d6811610095578063c87b56dd11610064578063c87b56dd14610549578063d5abeb0114610569578063e985e9c51461057f578063f2fde38b146105c857600080fd5b8063a0712d68146104d6578063a22cb465146104e9578063acec338a14610509578063b88d4fde1461052957600080fd5b806380057b9a116100d157806380057b9a146104685780638da5cb5b1461048857806395d89b41146104a6578063a035b1fe146104bb57600080fd5b80636352211e146103f3578063642293821461041357806370a0823114610433578063715018a61461045357600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e1461035e5780634b2c07061461037e5780634b93f7531461039e5780634f6ccce7146103d357600080fd5b806323b872dd146102dc5780632f745c59146102fc5780633ccfd60b1461031c5780634036ab781461033157600080fd5b8063081812fc116101b6578063081812fc1461024e578063095ea7b31461028657806318160ddd146102a8578063239c70ae146102c757600080fd5b806301ffc9a7146101dd57806302fb0c5e1461021257806306fdde031461022c575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046145cf565b6105e8565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50600c546101fd9060ff1681565b34801561023857600080fd5b50610241610613565b6040516102099190614644565b34801561025a57600080fd5b5061026e610269366004614657565b6106a5565b6040516001600160a01b039091168152602001610209565b34801561029257600080fd5b506102a66102a136600461468c565b61073f565b005b3480156102b457600080fd5b506008545b604051908152602001610209565b3480156102d357600080fd5b506102b9601481565b3480156102e857600080fd5b506102a66102f73660046146b6565b610855565b34801561030857600080fd5b506102b961031736600461468c565b610886565b34801561032857600080fd5b506102a661091c565b34801561033d57600080fd5b5061035161034c366004614657565b6109a9565b6040516102099190614708565b34801561036a57600080fd5b506102a66103793660046146b6565b610be9565b34801561038a57600080fd5b506102b9610399366004614657565b610c04565b3480156103aa57600080fd5b506103be6103b9366004614657565b610c23565b60408051928352602083019190915201610209565b3480156103df57600080fd5b506102b96103ee366004614657565b610dc1565b3480156103ff57600080fd5b5061026e61040e366004614657565b610e54565b34801561041f57600080fd5b506102b961042e366004614657565b610ecb565b34801561043f57600080fd5b506102b961044e366004614793565b610f01565b34801561045f57600080fd5b506102a6610f88565b34801561047457600080fd5b50610241610483366004614657565b610fbe565b34801561049457600080fd5b50600a546001600160a01b031661026e565b3480156104b257600080fd5b50610241611027565b3480156104c757600080fd5b506102b9661ff973cafa800081565b6102a66104e4366004614657565b611036565b3480156104f557600080fd5b506102a66105043660046147be565b6111b5565b34801561051557600080fd5b506102a66105243660046147f1565b61127a565b34801561053557600080fd5b506102a6610544366004614822565b6112b7565b34801561055557600080fd5b50610241610564366004614657565b6112e9565b34801561057557600080fd5b506102b9600b5481565b34801561058b57600080fd5b506101fd61059a3660046148fe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105d457600080fd5b506102a66105e3366004614793565b61132a565b60006001600160e01b0319821663780e9d6360e01b148061060d575061060d826113c2565b92915050565b60606000805461062290614928565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90614928565b801561069b5780601f106106705761010080835404028352916020019161069b565b820191906000526020600020905b81548152906001019060200180831161067e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061074a82610e54565b9050806001600160a01b0316836001600160a01b031614156107b85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161071a565b336001600160a01b03821614806107d457506107d4813361059a565b6108465760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161071a565b6108508383611412565b505050565b61085f3382611480565b61087b5760405162461bcd60e51b815260040161071a90614963565b610850838383611573565b600061089183610f01565b82106108f35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161071a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146109465760405162461bcd60e51b815260040161071a906149b4565b47806109815760405162461bcd60e51b815260206004820152600a6024820152694e6f2062616c616e636560b01b604482015260640161071a565b604051339082156108fc029083906000818181858888f193505050506109a657600080fd5b50565b6109d5604080516080810190915280600081526020016060815260200160608152602001606081525090565b60006109fd604051806040016040528060048152602001637479706560e01b8152508461171e565b90506000610a306040518060400160405280600d81526020016c626173654672657175656e637960981b8152508561171e565b90506000610a606040518060400160405280600a8152602001696e756d4f63746176657360b01b8152508661171e565b90506000610a926040518060400160405280600c81526020016b737572666163655363616c6560a01b8152508761171e565b90506000610aa16064866149ff565b610aac906001614a29565b90506000610abb6005866149ff565b610ac6906001614a29565b90506000610ad56005866149ff565b610ae0906001614a29565b90506000610aef6003866149ff565b610afa906001614a29565b9050600060198511610b0e57506000610b72565b602d8511610b1e57506001610b72565b603c8511610b2e57506002610b72565b604b8511610b3e57506003610b72565b60558511610b4e57506005610b72565b605f8511610b5e57506004610b72565b60628511610b6e57506007610b72565b5060065b6040518060800160405280826007811115610b8f57610b8f6146f2565b8152602001610b9d86611752565b604051602001610bad9190614a41565b6040516020818303038152906040528152602001610bca85611752565b8152602001610bd884611752565b90529b9a5050505050505050505050565b610850838383604051806020016040528060008152506112b7565b600080610c1083610c23565b509050610c1c81611850565b9392505050565b6000806000610c4f604051806040016040528060058152602001641cdc19595960da1b8152508561171e565b905060006001905060006064610c82604051806040016040528060058152602001641b195d995b60da1b8152508861171e565b610c8c91906149ff565b610c97906001614a29565b9050600660198211610cc657610caf6101e7856149ff565b610cbb90610201614a29565b925060069050610db4565b60328211610cf157610cda610100856149ff565b610ce690610101614a29565b925060059050610db4565b604b8211610d1a57610d046080856149ff565b610d0f906081614a29565b925060049050610db4565b60558211610d4357610d2d6040856149ff565b610d38906041614a29565b925060039050610db4565b605f8211610d6c57610d566030856149ff565b610d61906011614a29565b925060029050610db4565b60628211610d9557610d7f6010856149ff565b610d8a906001614a29565b925060019050610db4565b610da1612328856149ff565b610dad906103e8614a29565b9250600090505b9196919550909350505050565b6000610dcc60085490565b8210610e2f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161071a565b60088281548110610e4257610e42614a6c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061060d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161071a565b6000610385610ef7604051806040016040528060058152602001641cdd185c9d60da1b8152508461171e565b61060d91906149ff565b60006001600160a01b038216610f6c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161071a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610fb25760405162461bcd60e51b815260040161071a906149b4565b610fbc600061185e565b565b60606000610fe96040518060400160405280600581526020016431b7b637b960d91b8152508461171e565b9050611000610ff7826118b0565b60026008611904565b6040516020016110109190614a82565b604051602081830303815290604052915050919050565b60606001805461062290614928565b600c5460ff166110745760405162461bcd60e51b81526020600482015260096024820152684e6f2061637469766560b81b604482015260640161071a565b60148111156110b45760405162461bcd60e51b815260206004820152600c60248201526b115e18d95959081b1a5b5a5d60a21b604482015260640161071a565b6110c581661ff973cafa8000614aab565b3410156111145760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742065746865722070726f76696465640000000000604482015260640161071a565b600061111f60085490565b600b5490915061112f8383614a29565b111561116d5760405162461bcd60e51b815260206004820152600d60248201526c115e18d9595908185b5bdd5b9d609a1b604482015260640161071a565b8060005b838110156111af5761118f33611186846119d1565b61ffff16611acc565b8161119981614aca565b92505080806111a790614aec565b915050611171565b50505050565b6001600160a01b03821633141561120e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161071a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146112a45760405162461bcd60e51b815260040161071a906149b4565b600c805460ff1916911515919091179055565b6112c13383611480565b6112dd5760405162461bcd60e51b815260040161071a90614963565b6111af84848484611aea565b60606000806112f784610c23565b9150915061132284611308866109a9565b61131187610fbe565b4361131b89610ecb565b8787611b1d565b949350505050565b600a546001600160a01b031633146113545760405162461bcd60e51b815260040161071a906149b4565b6001600160a01b0381166113b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071a565b6109a68161185e565b60006001600160e01b031982166380ac58cd60e01b14806113f357506001600160e01b03198216635b5e139f60e01b145b8061060d57506301ffc9a760e01b6001600160e01b031983161461060d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144782610e54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114f95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161071a565b600061150483610e54565b9050806001600160a01b0316846001600160a01b0316148061153f5750836001600160a01b0316611534846106a5565b6001600160a01b0316145b8061132257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611322565b826001600160a01b031661158682610e54565b6001600160a01b0316146115ee5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161071a565b6001600160a01b0382166116505760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161071a565b61165b838383611bbb565b611666600082611412565b6001600160a01b038316600090815260036020526040812080546001929061168f908490614b07565b90915550506001600160a01b03821660009081526003602052604081208054600192906116bd908490614a29565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000610c1c8361172d84611752565b60405160200161173e929190614b1e565b604051602081830303815290604052611c73565b6060816117765750506040805180820190915260018152600360fc1b602082015290565b8160005b81156117a0578061178a81614aec565b91506117999050600a83614b4d565b915061177a565b60008167ffffffffffffffff8111156117bb576117bb61480c565b6040519080825280601f01601f1916602001820160405280156117e5576020820181803683370190505b5090505b8415611322576117fa600183614b07565b9150611807600a866149ff565b611812906030614a29565b60f81b81838151811061182757611827614a6c565b60200101906001600160f81b031916908160001a905350611849600a86614b4d565b94506117e9565b600061060d82610384614aab565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816118d75750506040805180820190915260048152630307830360e41b602082015290565b8160005b81156118fa57806118eb81614aec565b915050600882901c91506118db565b6113228482611ca4565b60608360006119138585614b07565b67ffffffffffffffff81111561192b5761192b61480c565b6040519080825280601f01601f191660200182016040528015611955576020820181803683370190505b509050845b848110156119c75782818151811061197457611974614a6c565b01602001516001600160f81b0319168261198e8884614b07565b8151811061199e5761199e614a6c565b60200101906001600160f81b031916908160001a905350806119bf81614aec565b91505061195a565b5095945050505050565b6000806119dd60085490565b600b546119ea9190614b07565b905060006119f88285611e40565b61ffff8082166000908152600d60205260409020549192501680611a195750805b600d6000611a28600186614b61565b61ffff90811682526020820192909252604001600020541615611a9357600d6000611a54600186614b61565b61ffff908116825260208083019390935260409182016000908120548683168252600d90945291909120805461ffff1916929091169182179055611ac3565b611a9e600184614b61565b61ffff8381166000908152600d60205260409020805461ffff19169183169190911790555b50949350505050565b611ae6828260405180602001604052806000815250611eb0565b5050565b611af5848484611573565b611b0184848484611ee3565b6111af5760405162461bcd60e51b815260040161071a90614b84565b60606000611b2c868686611ff0565b90506000611b8a611b3c8b611752565b611b4f611b4a8b868e61202b565b613781565b611b648b8d89611b5e8c611850565b8d6138e7565b604051602001611b7693929190614bd6565b604051602081830303815290604052613781565b905080604051602001611b9d9190614cb0565b60405160208183030381529060405292505050979650505050505050565b6001600160a01b038316611c1657611c1181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c39565b816001600160a01b0316836001600160a01b031614611c3957611c39838261397c565b6001600160a01b038216611c505761085081613a19565b826001600160a01b0316826001600160a01b031614610850576108508282613ac8565b600081604051602001611c869190614cf5565b60408051601f19818403018152919052805160209091012092915050565b60606000611cb3836002614aab565b611cbe906002614a29565b67ffffffffffffffff811115611cd657611cd661480c565b6040519080825280601f01601f191660200182016040528015611d00576020820181803683370190505b509050600360fc1b81600081518110611d1b57611d1b614a6c565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d4a57611d4a614a6c565b60200101906001600160f81b031916908160001a9053506000611d6e846002614aab565b611d79906001614a29565b90505b6001811115611df1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611dad57611dad614a6c565b1a60f81b828281518110611dc357611dc3614a6c565b60200101906001600160f81b031916908160001a90535060049490941c93611dea81614d11565b9050611d7c565b508315610c1c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161071a565b600080611ea483611e52600143614b07565b60405160f09290921b6001600160f01b031916602083015240602282015241606090811b6bffffffffffffffffffffffff1990811660428401524460568401523390911b166076820152608a0161173e565b90506113228482614d28565b611eba8383613b0c565b611ec76000848484611ee3565b6108505760405162461bcd60e51b815260040161071a90614b84565b60006001600160a01b0384163b15611fe557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f27903390899088908890600401614d49565b602060405180830381600087803b158015611f4157600080fd5b505af1925050508015611f71575060408051601f3d908101601f19168201909252611f6e91810190614d86565b60015b611fcb573d808015611f9f576040519150601f19603f3d011682016040523d82523d6000602084013e611fa4565b606091505b508051611fc35760405162461bcd60e51b815260040161071a90614b84565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611322565b506001949350505050565b600061038583816120018588614b4d565b61200b9190614da3565b6120159190614db7565b61201f9190614da3565b611322906102ee614df8565b60408051808201825260038082526203135360ec1b602080840191909152835180850185529182526203330360ec1b82820152835180850185526001808252603160f81b8284015285518087018752908152600360fc1b81840152855192830190955260008083526060959192906120a289613c5a565b88519091506120af614591565b6040518060800160405280605d8152602001615eec605d913981526040805180820182526004808252632d302e3160e01b60208381018290528451808601865292835282810191909152835180850190945260018452601960f91b9084015261211c928992919083613c98565b81600160200201819052506121b8604051806040016040528060018152602001601960f91b815250604051806040016040528060048152602001632d302e3160e01b815250604051806040016040528060048152602001632d302e3160e01b815250604051806040016040528060018152602001601960f91b81525060405180604001604052806002815260200161031360f41b815250613c98565b8160026020020181905250612254604051806040016040528060018152602001603360f81b815250604051806040016040528060048152602001631698171960e11b815250604051806040016040528060048152602001631698171960e11b815250604051806040016040528060018152602001603360f81b81525060405180604001604052806002815260200161323160f01b815250613c98565b60608201526040805180820182526001808252600d60fa1b60208381019190915283518085018552918252601960f91b8282015283518085019094526002845261393160f01b908401526122ab9288918291613c98565b816004602002018190525061232d604051806040016040528060018152602001603560f81b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a604051806040016040528060018152602001603760f81b815250613c98565b81600560200201819052506123b0604051806040016040528060018152602001601b60f91b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a60405180604001604052806002815260200161323160f01b815250613c98565b8160066020020181905250612432604051806040016040528060018152602001603760f81b8152506040518060400160405280600481526020016302d3130360e41b8152506040518060400160405280600481526020016302d3130360e41b8152508a604051806040016040528060018152602001601b60f91b815250613c98565b60e082015260408051808201825260018152603960f81b602082810191909152825160c0810184528881528082018990528084018a905283518085018552600c81526b6672616374616c4e6f69736560a01b818401526060820152908d01516080820152918c015160a08301526124a891613d15565b6101008201526040805180820182526002815261031360f41b602082810191909152825160c0810184528881528082018990528084018a905283518085018552600a81526974757262756c656e636560b01b818401526060820152908d01516080820152918c015160a083015261251e91613d15565b610120820152604080518082019091526002815261313160f01b6020820152612547908d613da8565b6101408201526040805180820182526002815261189960f11b602082810191909152825180840190935260078352660233030303030360cc1b9083015261258d91613da8565b6101608201526040805180820190915260028152610c4d60f21b60208201526125b590613dd4565b610180820152604080518082019091526002815261313560f01b602082015260608b01516125e591908e90613dfd565b6101a08201526040805180820190915260078152661e17b232b3399f60c91b602082015281600e602002018190525061269660405180604001604052806002815260200161723160f01b8152506040518061010001604052808b81526020018a815260200161266b606488605061265c9190614aab565b6126669190614b4d565b611752565b815260006020820181905260408201899052606082018990526080820152600160a090910152613e2c565b6101e08201526126a785808e61404e565b610200820152604080518082019091526004815263302e383960e01b60208201526126d49086908e61404e565b6102208201526040805180820182526004815263302e393960e01b60208281019190915282518084019093526003835262302e3960e81b90830152612719918e61404e565b61024082015261272a85878e61404e565b61026082015260408051808201825260118152701e17b930b234b0b623b930b234b2b73a1f60791b602080830191909152610280840191909152815180830183526002815261391960f11b81830152825161014081018452600361010082019081526203233360ec1b61012083015281529182018a90526127ba92909190810161266b606461265c89601e614aab565b6102a08201526127cb85808e61404e565b6102c0820152604080518082019091526004815263302e383960e01b60208201526127f89086908e61404e565b6102e08201526040805180820182526004815263302e393960e01b60208281019190915282518084019093526003835262302e3960e81b9083015261283d918e61404e565b61030082015261284e85878e61404e565b61032082015260408051808201825260118152701e17b930b234b0b623b930b234b2b73a1f60791b602080830191909152610340840191909152815180830183526002815261723360f01b818301528251610140810184526003610100820181815262302e3360e81b610120840181905290835285518087018752828152808601919091528285015284518086018652818152620c0b8d60ea1b81860152828601526001606083018190528551808701875282815262302e3560e81b818701819052608085019190915286518088019097529186529385015260a081019390935260c0830191909152600060e083015261294791613e2c565b6103608201526040805180820190915260078152660233030303030360cc1b6020820152612978908790879061404e565b61038082015261298986808e61404e565b6103a08201526040805180820190915260118152701e17b930b234b0b623b930b234b2b73a1f60791b602082015281601e60200201819052506129e8604051806040016040528060028152602001616c3160f01b815250868789614065565b6103e08201526129f986868e61404e565b6104008201526040805180820190915260078152660233030303030360cc1b6020820152612a2a908790819061404e565b6104208201526040805180820190915260118152701e17b634b732b0b923b930b234b2b73a1f60791b602082015281602260200201819052506040518060600160405280602e8152602001615f49602e913961046082015260078281811115612a9557612a956146f2565b14612aa05783612ac3565b612ac360405180604001604052806002815260200161313160f01b8152506140b6565b604051602001612ad39190614e37565b60408051808303601f190181529190526104808201526002826007811115612afd57612afd6146f2565b14612bea576003826007811115612b1657612b166146f2565b14612b98576007826007811115612b2f57612b2f6146f2565b1480612b4c57506006826007811115612b4a57612b4a6146f2565b145b612b9257612b8d6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80896140b6565b81526020018890526140c9565b612c2e565b83612c2e565b612b8d6040518060c0016040528087815260200187815260200160968152602001612bdc60405180604001604052806002815260200161723360f01b8152506140b6565b8152602001612b80896140b6565b612c2e6040518060c0016040528087815260200187815260200160968152602001612bdc604051806040016040528060028152602001616c3160f01b8152506140b6565b6104a08201526002826007811115612c4857612c486146f2565b14612d5a576003826007811115612c6157612c616146f2565b14612cef576007826007811115612c7a57612c7a6146f2565b1480612c9757506006826007811115612c9557612c956146f2565b145b612ce957612ce46040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001601960f91b8152506140b6565b612d9e565b83612d9e565b612ce46040518060c0016040528087815260200187815260200160968152602001612d3360405180604001604052806002815260200161723360f01b8152506140b6565b8152602001612b80604051806040016040528060018152602001601960f91b8152506140b6565b612d9e6040518060c0016040528087815260200187815260200160968152602001612d33604051806040016040528060028152602001616c3160f01b8152506140b6565b6104c082015260078281811115612db757612db76146f2565b14613063576000826007811115612dd057612dd06146f2565b1461301a576005826007811115612de957612de96146f2565b14612fd0576006826007811115612e0257612e026146f2565b14612f86576001826007811115612e1b57612e1b6146f2565b14612f3c576002826007811115612e3457612e346146f2565b14612ef8576003826007811115612e4d57612e4d6146f2565b14612ea057612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001603960f81b8152506140b6565b6130ad565b612e9b6040518060c0016040528087815260200187815260200160968152602001612ee460405180604001604052806002815260200161723360f01b8152506140b6565b8152602001868152602001888152506140c9565b612e9b6040518060c0016040528087815260200187815260200160968152602001612ee4604051806040016040528060028152602001616c3160f01b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161313560f01b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060028152602001610c4d60f21b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161031360f41b8152506140b6565b612e9b6040518060c00160405280878152602001878152602001609681526020018e8152602001612b80604051806040016040528060018152602001603360f81b8152506140b6565b6130ad6040518060c00160405280878152602001878152602001609681526020018e8152602001612b8060405180604001604052806002815260200161313160f01b8152506140b6565b6104e08201526040805180820190915260048152631e17b39f60e11b60208201526105008201526130de8b83614122565b610520820152600782818111156130f7576130f76146f2565b14613143576006826007811115613110576131106146f2565b1461311b5783613166565b61313e604051806040016040528060028152602001610c4d60f21b8152506140b6565b613166565b61316660405180604001604052806002815260200161313160f01b8152506140b6565b6040516020016131769190614e9c565b60408051601f1981840301815291905281602a60200201819052506132158b6040518060c001604052808b81526020018a8152602001606481526020016131d660405180604001604052806002815260200161723160f01b8152506140b6565b815260200160405180602001604052806000815250815260200160405180604001604052806004815260200163302e323560e01b8152508152506141d0565b6105608201526040805161010081018252600360c082019081526232323560e81b60e0830152815260208181018a905260328284015282518084019093526002835261391960f11b90830152613276918d919060608201906131d6906140b6565b6105808201526040805161010081018252600360c082019081526203131360ec1b60e0830152815260208181018a9052601e82840152606082018f90528251808201845260008152608083015282518084019093526004835263302e313560e01b9083015260a08101919091526132ee908c906141d0565b81602d60200201819052506133758b6040518060c00160405280604051806040016040528060038152602001620646e760eb1b81525081526020018a8152602001603281526020018f815260200160405180602001604052806000815250815260200160405180604001604052806003815260200162302e3160e81b8152508152506141d0565b6105c08201526040805180820190915260048152631e17b39f60e11b60208201526105e082015260068260078111156133b0576133b06146f2565b146133bb57836133de565b6133de604051806040016040528060028152602001610c4d60f21b8152506140b6565b6040516020016133ee9190614e9c565b60408051601f1981840301815291905281603060200201819052506134818b6040518060e001604052808b81526020018a8152602001600f8152602001602381526020018f815260200161345a604051806040016040528060018152602001603560f81b8152506140b6565b8152602001604051806040016040528060018152602001603160f81b81525081525061423c565b81603160200201819052506134dd8b6040518060e001604052808b81526020018a815260200160198152602001602381526020018f815260200161345a604051806040016040528060018152602001601b60f91b8152506140b6565b81603260200201819052506135398b6040518060e001604052808b81526020018a8152602001600a8152602001601e81526020018f815260200161345a604051806040016040528060018152602001603760f81b8152506140b6565b61066082015260408051808201825260048152631e17b39f60e11b602080830191909152610680840191909152815180830190925260068252651e17b9bb339f60d11b908201526106a082015283600860005b600681101561371f5782846135a18484614aab565b603681106135b1576135b1614a6c565b6020020151856135c18585614aab565b6135cc906001614a29565b603681106135dc576135dc614a6c565b6020020151866135ec8686614aab565b6135f7906002614a29565b6036811061360757613607614a6c565b6020020151876136178787614aab565b613622906003614a29565b6036811061363257613632614a6c565b6020020151886136428888614aab565b61364d906004614a29565b6036811061365d5761365d614a6c565b60200201518961366d8989614aab565b613678906005614a29565b6036811061368857613688614a6c565b60200201518a6136988a8a614aab565b6136a3906006614a29565b603681106136b3576136b3614a6c565b60200201518b6136c38b8b614aab565b6136ce906007614a29565b603681106136de576136de614a6c565b60200201516040516020016136fb99989796959493929190614edc565b6040516020818303038152906040529250808061371790614aec565b91505061358c565b506106008301516106208401516106408501516106608601516106808701516106a088015160405161375f96899690959094909390929091602001614f9d565b60408051808303601f190181529190529e9d5050505050505050505050505050565b8051606090806137a1575050604080516020810190915260008152919050565b600060036137b0836002614a29565b6137ba9190614b4d565b6137c5906004614aab565b905060006137d4826020614a29565b67ffffffffffffffff8111156137ec576137ec61480c565b6040519080825280601f01601f191660200182016040528015613816576020820181803683370190505b5090506000604051806060016040528060408152602001615eac604091399050600181016020830160005b868110156138a2576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613841565b5060038606600181146138bc57600281146138cd576138d9565b613d3d60f01b6001198301526138d9565b603d60f81b6000198301525b505050918152949350505050565b6060856138f786600001516142e5565b61390086611752565b61390986611752565b604051602001613919919061502f565b60405160208183030381529060405261393186611752565b604051602001613945959493929190615059565b60408051601f198184030181529082905261396291602001615136565b604051602081830303815290604052905095945050505050565b6000600161398984610f01565b6139939190614b07565b6000838152600760205260409020549091508082146139e6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613a2b90600190614b07565b60008381526009602052604081205460088054939450909284908110613a5357613a53614a6c565b906000526020600020015490508060088381548110613a7457613a74614a6c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613aac57613aac615176565b6001900381819060005260206000200160009055905550505050565b6000613ad383610f01565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613b625760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161071a565b6000818152600260205260409020546001600160a01b031615613bc75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161071a565b613bd360008383611bbb565b6001600160a01b0382166000908152600360205260408120805460019290613bfc908490614a29565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008061012c8312801590613c7157506101368313155b1561060d57613c8261012c84614df8565b613c8d90600a614aab565b610c1c906064614b07565b60606000868686604051602001613cb19392919061518c565b6040516020818303038152906040529050868686604051602001613cd79392919061518c565b60408051601f1981840301815290829052613cfa9186908190879060200161520c565b60408051808303601f19018152919052979650505050505050565b606060008383600001518460200151604051602001613d369392919061518c565b60408051601f19818403018152828252908501516060860151919350613d6292849282916020016152d5565b60405160208183030381529060405290508083608001518460a00151604051602001613d909392919061537d565b60408051808303601f19018152919052949350505050565b60608282604051602001613dbd929190615449565b604051602081830303815290604052905092915050565b606081604051602001613de79190615658565b6040516020818303038152906040529050919050565b6060838383604051602001613e1493929190615798565b60405160208183030381529060405290509392505050565b60606000838360e00151613e5957604051806040016040528060018152602001601160f91b815250613e90565b6040518060400160405280602081526020017f22206772616469656e74556e6974733d227573657253706163654f6e557365228152505b84516020808701516040808901519051613ead969594930161594a565b6040516020818303038152906040529050808360600151613ee757604051806040016040528060018152602001601160f91b815250613f07565b604051806040016040528060068152602001651110333c1e9160d11b8152505b8460600151613f255760405180602001604052806000815250613f2b565b84608001515b8560600151613f495760405180602001604052806000815250613f69565b604051806040016040528060068152602001651110333c9e9160d11b8152505b8660600151613f875760405180602001604052806000815250613f8d565b8660a001515b8760600151613fc3576040518060400160405280600f81526020016e1039b83932b0b226b2ba3437b21e9160891b815250613fed565b6040518060400160405280601081526020016f111039b83932b0b226b2ba3437b21e9160811b8152505b8860c0015161401757604051806040016040528060038152602001621c185960ea1b815250614038565b604051806040016040528060078152602001661c99599b1958dd60ca1b8152505b604051602001613d909796959493929190615a13565b6060818484604051602001613e1493929190615aaf565b60608484848460405160200161407e9493929190615b5d565b60408051601f198184030181529082905261409d918490602001615c27565b6040516020818303038152906040529050949350505050565b606081604051602001613de79190615c63565b606061060d6040518060e001604052808460000151815260200184602001518152602001846040015181526020018460400151815260200184606001518152602001846080015181526020018460a001518152506144e1565b60606007826007811115614138576141386146f2565b14614193576006826007811115614151576141516146f2565b1461416b57604051806020016040528060008152506141b6565b61418e604051806040016040528060028152602001610c4d60f21b8152506140b6565b6141b6565b6141b660405180604001604052806002815260200161189960f11b8152506140b6565b6141bf8461454b565b604051602001613dbd929190615c9b565b6060610c1c6040518060c00160405280846000015181526020018460200151815260200160646141ff87613c5a565b866040015161420e9190614aab565b6142189190614b4d565b815260608086015160208301526080860151604083015260a08601519101526140c9565b6060600061424984613c5a565b90506113226040518060e001604052808560000151815260200185602001518152602001606484876040015161427f9190614aab565b6142899190614b4d565b815260200160648487606001516142a09190614aab565b6142aa9190614b4d565b8152602001856080015181526020018560a001518152602001604051806040016040528060018152602001603160f81b8152508152506144e1565b606060008260078111156142fb576142fb6146f2565b141561432157505060408051808201909152600481526331363ab960e11b602082015290565b6001826007811115614335576143356146f2565b141561435e5750506040805180820190915260078152667465787475726560c81b602082015290565b6002826007811115614372576143726146f2565b141561439a5750506040805180820190915260068152653634b732b0b960d11b602082015290565b60038260078111156143ae576143ae6146f2565b14156143d65750506040805180820190915260068152651c98591a585b60d21b602082015290565b60048260078111156143ea576143ea6146f2565b1415614413575050604080518082019091526007815266199c9858dd185b60ca1b602082015290565b6005826007811115614427576144276146f2565b141561445357505060408051808201909152600a81526974757262756c656e636560b01b602082015290565b6006826007811115614467576144676146f2565b141561448e5750506040805180820190915260058152641c1a5e195b60da1b602082015290565b60078260078111156144a2576144a26146f2565b14156144cd5750506040805180820190915260098152683ab73932b3bab630b960b91b602082015290565b505060408051602081019091526000815290565b6060816000015182602001516144fa8460400151611752565b60405160200161450c93929190615d1b565b6040516020818303038152906040526145288360600151611752565b83608001518460a001518560c00151604051602001613de7959493929190615db1565b604080516020810190915260008082526060919083126145755761456e83611752565b905061060d565b61458161266684615e72565b604051602001613dbd9190615e8f565b604051806106c001604052806036905b60608152602001906001900390816145a15790505090565b6001600160e01b0319811681146109a657600080fd5b6000602082840312156145e157600080fd5b8135610c1c816145b9565b60005b838110156146075781810151838201526020016145ef565b838111156111af5750506000910152565b600081518084526146308160208601602086016145ec565b601f01601f19169290920160200192915050565b602081526000610c1c6020830184614618565b60006020828403121561466957600080fd5b5035919050565b80356001600160a01b038116811461468757600080fd5b919050565b6000806040838503121561469f57600080fd5b6146a883614670565b946020939093013593505050565b6000806000606084860312156146cb57600080fd5b6146d484614670565b92506146e260208501614670565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b60208152600082516008811061472e57634e487b7160e01b600052602160045260246000fd5b8060208401525060208301516080604084015261474e60a0840182614618565b90506040840151601f198085840301606086015261476c8383614618565b925060608601519150808584030160808601525061478a8282614618565b95945050505050565b6000602082840312156147a557600080fd5b610c1c82614670565b8035801515811461468757600080fd5b600080604083850312156147d157600080fd5b6147da83614670565b91506147e8602084016147ae565b90509250929050565b60006020828403121561480357600080fd5b610c1c826147ae565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561483857600080fd5b61484185614670565b935061484f60208601614670565b925060408501359150606085013567ffffffffffffffff8082111561487357600080fd5b818701915087601f83011261488757600080fd5b8135818111156148995761489961480c565b604051601f8201601f19908116603f011681019083821181831017156148c1576148c161480c565b816040528281528a60208487010111156148da57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561491157600080fd5b61491a83614670565b91506147e860208401614670565b600181811c9082168061493c57607f821691505b6020821081141561495d57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082614a0e57614a0e6149e9565b500690565b634e487b7160e01b600052601160045260246000fd5b60008219821115614a3c57614a3c614a13565b500190565b620302e360ec1b815260008251614a5f8160038501602087016145ec565b9190910160030192915050565b634e487b7160e01b600052603260045260246000fd5b602360f81b815260008251614a9e8160018501602087016145ec565b9190910160010192915050565b6000816000190483118215151615614ac557614ac5614a13565b500290565b600061ffff80831681811415614ae257614ae2614a13565b6001019392505050565b6000600019821415614b0057614b00614a13565b5060010190565b600082821015614b1957614b19614a13565b500390565b60008351614b308184602088016145ec565b835190830190614b448183602088016145ec565b01949350505050565b600082614b5c57614b5c6149e9565b500490565b600061ffff83811690831681811015614b7c57614b7c614a13565b039392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6e7b226e616d65223a2022535647202360881b81528351600090614c0181600f8501602089016145ec565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a2022600f918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602f8201528451614c648160498401602089016145ec565b6f011161130ba3a3934b13aba32b9911d160851b604992909101918201528351614c958160598401602088016145ec565b607d60f81b60599290910191820152605a0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614ce881601d8501602087016145ec565b91909101601d0192915050565b60008251614d078184602087016145ec565b9190910192915050565b600081614d2057614d20614a13565b506000190190565b600061ffff80841680614d3d57614d3d6149e9565b92169190910692915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614d7c90830184614618565b9695505050505050565b600060208284031215614d9857600080fd5b8151610c1c816145b9565b600082614db257614db26149e9565b500790565b600080821280156001600160ff1b0384900385131615614dd957614dd9614a13565b600160ff1b8390038412811615614df257614df2614a13565b50500190565b60008083128015600160ff1b850184121615614e1657614e16614a13565b6001600160ff1b0384018313811615614e3157614e31614a13565b50500390565b7f3c67207472616e73666f726d3d227472616e736c617465283330302c2033303081526a1491103334b63a32b91e9160a91b602082015260008251614e8381602b8501602087016145ec565b61111f60f11b602b939091019283015250602d01919050565b6a1e33903334b63a32b91e9160a91b81528151600090614ec381600b8501602087016145ec565b61111f60f11b600b939091019283015250600d01919050565b60008a51614eee818460208f016145ec565b8a51614f008183860160208f016145ec565b8a519184010190614f15818360208e016145ec565b8951614f278183850160208e016145ec565b8951929091010190614f3d818360208c016145ec565b8751614f4f8183850160208c016145ec565b8751929091010190614f65818360208a016145ec565b8551614f778183850160208a016145ec565b8551929091010190614f8d8183602088016145ec565b019b9a5050505050505050505050565b600088516020614fb08285838e016145ec565b895191840191614fc38184848e016145ec565b8951920191614fd58184848d016145ec565b8851920191614fe78184848c016145ec565b8751920191614ff98184848b016145ec565b865192019161500b8184848a016145ec565b855192019161501d81848489016145ec565b919091019a9950505050505050505050565b600082516150418184602087016145ec565b6520626c6f636b60d01b920191825250600601919050565b6000865161506b818460208b016145ec565b691116113a3cb832911d1160b11b908301908152865161509281600a840160208b016145ec565b6f11161139b832b2b22632bb32b6111d1160811b600a929091019182015285516150c381601a840160208a016145ec565b6b1116113832b934b7b2111d1160a11b601a929091019182015284516150f08160268401602089016145ec565b7511161139ba30b93a34b733a637b1b0ba34b7b7111d1160511b60269290910191820152835161512781603c8401602088016145ec565b01603c01979650505050505050565b6a3d9131b7b637b9111d101160a91b8152815160009061515d81600b8501602087016145ec565b61227d60f01b600b939091019283015250600d01919050565b634e487b7160e01b600052603160045260246000fd5b6b1e3334b63a32b91034b21e9160a11b815283516000906151b481600c8501602089016145ec565b6411103c1e9160d91b600c9184019182015284516151d98160118401602089016145ec565b6411103c9e9160d91b6011929091019182015283516151ff8160168401602088016145ec565b0160160195945050505050565b6000855161521e818460208a016145ec565b6811103bb4b23a341e9160b91b9083019081528551615244816009840160208a016145ec565b6911103432b4b3b43a1e9160b11b60099290910191820152845161526f8160138401602089016145ec565b7f223e3c6665476175737369616e426c757220737464446576696174696f6e3d226013929091019182015283516152ad8160338401602088016145ec565b6c1110179f1e17b334b63a32b91f60991b603392909101918201526040019695505050505050565b600085516152e7818460208a016145ec565b6811103bb4b23a341e9160b91b908301908152855161530d816009840160208a016145ec565b6911103432b4b3b43a1e9160b11b6009929091019182015284516153388160138401602089016145ec565b75111f1e3332aa3ab9313ab632b731b2903a3cb8329e9160511b60139290910191820152835161536f8160298401602088016145ec565b016029019695505050505050565b6000845161538f8184602089016145ec565b7011103130b9b2a33932b8bab2b731bc9e9160791b90830190815284516153bd8160118401602089016145ec565b6d1110373ab6a7b1ba30bb32b99e9160911b6011929091019182015283516153ec81601f8401602088016145ec565b7f22202f3e3c6665436f6d706f73697465206f70657261746f723d22696e222069601f92909101918201527f6e323d22536f757263654772617068696322202f3e3c2f66696c7465723e0000603f820152605d0195945050505050565b6b1e3334b63a32b91034b21e9160a11b8152825160009061547181600c8501602088016145ec565b7f223e3c66654d6f7270686f6c6f6779206f70657261746f723d2264696c617465600c918401918201527f22207261646975733d22322220726573756c743d22723122202f3e3c6665466c602c8201527037b7b210333637b7b216b1b7b637b91e9160791b604c82015283516154ee81605d8401602088016145ec565b7f2220666c6f6f642d6f7061636974793d223122202f3e3c6665436f6d706f7369605d92909101918201527f7465206f70657261746f723d22696e2220696e323d22723122202f3e3c666543607d8201527f6f6d706f7369746520696e323d22536f75726365416c7068612220726573756c609d8201527f743d22633122202f3e3c666554757262756c656e636520747970653d2266726160bd8201527f6374616c4e6f6973652220626173654672657175656e63793d22302e3031203060dd8201527f22206e756d4f6374617665733d22322220736565643d223022202f3e3c66654460fd8201527f6973706c6163656d656e744d617020696e3d22633122207363616c653d22313761011d8201527f2220784368616e6e656c53656c6563746f723d22412220794368616e6e656c5361013d8201527f656c6563746f723d224122202f3e3c2f66696c7465723e00000000000000000061015d82015261017401949350505050565b6b1e3334b63a32b91034b21e9160a11b8152815160009061568081600c8501602087016145ec565b7f223e3c6665466c6f6f64206865696768743d2235222077696474683d22352220600c9390910192830152507f2f3e3c6665436f6d706f736974652077696474683d2231382220686569676874602c8201527f3d22313822202f3e3c666554696c6520696e3d224261636b67726f756e64496d604c8201527f6167652220726573756c743d226122202f3e3c6665436f6d706f73697465206f606c8201527f70657261746f723d22696e2220696e3d22536f75726365477261706869632220608c8201527f696e323d226122202f3e3c66654d6f7270686f6c6f6779206f70657261746f7260ac8201527f3d2264696c61746522207261646975733d223522202f3e3c2f66696c7465723e60cc82015260ec01919050565b6b1e3334b63a32b91034b21e9160a11b815283516000906157c081600c8501602089016145ec565b7f223e3c666554757262756c656e636520747970653d226672616374616c4e6f69600c918401918201527f73652220626173654672657175656e63793d22302e3122206e756d4f63746176602c8201527f65733d22352220726573756c743d223122202f3e3c6665446966667573654c69604c8201527f676874696e6720696e3d223122206c69676874696e672d636f6c6f723d220000606c820152845161586f81608a8401602089016145ec565b6f111039bab93330b1b2a9b1b0b6329e9160811b608a929091019182015283516158a081609a8401602088016145ec565b7f223e3c666544697374616e744c6967687420617a696d7574683d223435222065609a92909101918201527f6c65766174696f6e3d22363022202f3e3c2f6665446966667573654c6967687460ba8201527f696e673e3c6665436f6d706f73697465206f70657261746f723d22696e22206960da8201527f6e323d22536f757263654772617068696322202f3e3c2f66696c7465723e000060fa8201526101180195945050505050565b731e3930b234b0b623b930b234b2b73a1034b21e9160611b8152855160009061597a816014850160208b016145ec565b865190830190615991816014840160208b016145ec565b641031bc1e9160d91b6014929091019182015285516159b7816019840160208a016145ec565b65111031bc9e9160d11b6019929091019182015284516159de81601f8401602089016145ec565b641110391e9160d91b601f92909101918201528351615a048160248401602088016145ec565b01602401979650505050505050565b600088516020615a268285838e016145ec565b895191840191615a398184848e016145ec565b8951920191615a4b8184848d016145ec565b8851920191615a5d8184848c016145ec565b8751920191615a6f8184848b016145ec565b8651920191615a818184848a016145ec565b8551920191615a9381848489016145ec565b61111f60f11b9201918252506002019998505050505050505050565b7f3c73746f70207374796c653d2273746f702d636f6c6f723a0000000000000000815260008451615ae78160188501602089016145ec565b6d1db9ba37b816b7b830b1b4ba3c9d60911b6018918401918201528451615b158160268401602089016145ec565b69111037b33339b2ba1e9160b11b602692909101918201528351615b408160308401602088016145ec565b6211179f60e91b6030929091019182015260330195945050505050565b731e3634b732b0b923b930b234b2b73a1034b21e9160611b81528451600090615b8d816014850160208a016145ec565b6411103c1e9160d91b6014918401918201528551615bb2816019840160208a016145ec565b6411103c9e9160d91b601992909101918201528451615bd881601e8401602089016145ec565b6811103bb4b23a341e9160b91b601e92909101918201528351615c028160278401602088016145ec565b6911103432b4b3b43a1e9160b11b602792909101918201526031019695505050505050565b60008351615c398184602088016145ec565b835190830190615c4d8183602088016145ec565b61111f60f11b9101908152600201949350505050565b6475726c282360d81b815260008251615c838160058501602087016145ec565b602960f81b6005939091019283015250600601919050565b6f1e31b4b931b632903334b63a32b91e9160811b81528251600090615cc78160108501602088016145ec565b65111031bc1e9160d11b6010918401918201528351615ced8160168401602088016145ec565b74111031bc9e911998181110391e91189a981110179f60591b60169290910191820152602b01949350505050565b6c1e32b63634b839b29031bc1e9160991b81528351600090615d4481600d8501602089016145ec565b65111031bc9e9160d11b600d918401918201528451615d6a8160138401602089016145ec565b651110393c1e9160d11b601392909101918201528351615d918160198401602088016145ec565b651110393c9e9160d11b60199290910191820152601f0195945050505050565b60008651615dc3818460208b016145ec565b865190830190615dd7818360208b016145ec565b6711103334b6361e9160c11b91019081528551615dfb816008840160208a016145ec565b6911103334b63a32b91e9160b11b600892909101918201528451615e268160128401602089016145ec565b6a111037b830b1b4ba3c9e9160a91b601292909101918201528351615e5281601d8401602088016145ec565b631110179f60e11b601d9290910191820152602101979650505050505050565b6000600160ff1b821415615e8857615e88614a13565b5060000390565b602d60f81b815260008251614a9e8160018501602087016145ec56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222077696474683d2236303022206865696768743d22363030222076696577426f783d223020302036303020363030223e3c646566733e3c7265637420783d22302220793d22302220206865696768743d22363030222077696474683d2236303022202f3ea2646970667358221220da0310f70aadf921a1c99d85a02222088d2df875c139cabbba7ff976c943355564736f6c63430008090033

Deployed Bytecode Sourcemap

41850:26970:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35702:224;;;;;;;;;;-1:-1:-1;35702:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35702:224:0;;;;;;;;42042:26;;;;;;;;;;-1:-1:-1;42042:26:0;;;;;;;;22830:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24389:221::-;;;;;;;;;;-1:-1:-1;24389:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;24389:221:0;1528:203:1;23912:411:0;;;;;;;;;;-1:-1:-1;23912:411:0;;;;;:::i;:::-;;:::i;:::-;;36342:113;;;;;;;;;;-1:-1:-1;36430:10:0;:17;36342:113;;;2319:25:1;;;2307:2;2292:18;36342:113:0;2173:177:1;41993:42:0;;;;;;;;;;;;42033:2;41993:42;;25279:339;;;;;;;;;;-1:-1:-1;25279:339:0;;;;;:::i;:::-;;:::i;36010:256::-;;;;;;;;;;-1:-1:-1;36010:256:0;;;;;:::i;:::-;;:::i;68462:195::-;;;;;;;;;;;;;:::i;61749:1353::-;;;;;;;;;;-1:-1:-1;61749:1353:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25689:185::-;;;;;;;;;;-1:-1:-1;25689:185:0;;;;;:::i;:::-;;:::i;64281:157::-;;;;;;;;;;-1:-1:-1;64281:157:0;;;;;:::i;:::-;;:::i;63261:1012::-;;;;;;;;;;-1:-1:-1;63261:1012:0;;;;;:::i;:::-;;:::i;:::-;;;;3962:25:1;;;4018:2;4003:18;;3996:34;;;;3935:18;63261:1012:0;3788:248:1;36532:233:0;;;;;;;;;;-1:-1:-1;36532:233:0;;;;;:::i;:::-;;:::i;22524:239::-;;;;;;;;;;-1:-1:-1;22524:239:0;;;;;:::i;:::-;;:::i;63110:143::-;;;;;;;;;;-1:-1:-1;63110:143:0;;;;;:::i;:::-;;:::i;22254:208::-;;;;;;;;;;-1:-1:-1;22254:208:0;;;;;:::i;:::-;;:::i;9890:94::-;;;;;;;;;;;;;:::i;61493:248::-;;;;;;;;;;-1:-1:-1;61493:248:0;;;;;:::i;:::-;;:::i;9239:87::-;;;;;;;;;;-1:-1:-1;9312:6:0;;-1:-1:-1;;;;;9312:6:0;9239:87;;22999:104;;;;;;;;;;;;;:::i;41943:43::-;;;;;;;;;;;;41975:11;41943:43;;67889:565;;;;;;:::i;:::-;;:::i;24682:295::-;;;;;;;;;;-1:-1:-1;24682:295:0;;;;;:::i;:::-;;:::i;68665:85::-;;;;;;;;;;-1:-1:-1;68665:85:0;;;;;:::i;:::-;;:::i;25945:328::-;;;;;;;;;;-1:-1:-1;25945:328:0;;;;;:::i;:::-;;:::i;66636:427::-;;;;;;;;;;-1:-1:-1;66636:427:0;;;;;:::i;:::-;;:::i;41905:31::-;;;;;;;;;;;;;;;;25048:164;;;;;;;;;;-1:-1:-1;25048:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25169:25:0;;;25145:4;25169:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25048:164;10139:192;;;;;;;;;;-1:-1:-1;10139:192:0;;;;;:::i;:::-;;:::i;35702:224::-;35804:4;-1:-1:-1;;;;;;35828:50:0;;-1:-1:-1;;;35828:50:0;;:90;;;35882:36;35906:11;35882:23;:36::i;:::-;35821:97;35702:224;-1:-1:-1;;35702:224:0:o;22830:100::-;22884:13;22917:5;22910:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22830:100;:::o;24389:221::-;24465:7;27872:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27872:16:0;24485:73;;;;-1:-1:-1;;;24485:73:0;;6968:2:1;24485:73:0;;;6950:21:1;7007:2;6987:18;;;6980:30;7046:34;7026:18;;;7019:62;-1:-1:-1;;;7097:18:1;;;7090:42;7149:19;;24485:73:0;;;;;;;;;-1:-1:-1;24578:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24578:24:0;;24389:221::o;23912:411::-;23993:13;24009:23;24024:7;24009:14;:23::i;:::-;23993:39;;24057:5;-1:-1:-1;;;;;24051:11:0;:2;-1:-1:-1;;;;;24051:11:0;;;24043:57;;;;-1:-1:-1;;;24043:57:0;;7381:2:1;24043:57:0;;;7363:21:1;7420:2;7400:18;;;7393:30;7459:34;7439:18;;;7432:62;-1:-1:-1;;;7510:18:1;;;7503:31;7551:19;;24043:57:0;7179:397:1;24043:57:0;8195:10;-1:-1:-1;;;;;24135:21:0;;;;:62;;-1:-1:-1;24160:37:0;24177:5;8195:10;25048:164;:::i;24160:37::-;24113:168;;;;-1:-1:-1;;;24113:168:0;;7783:2:1;24113:168:0;;;7765:21:1;7822:2;7802:18;;;7795:30;7861:34;7841:18;;;7834:62;7932:26;7912:18;;;7905:54;7976:19;;24113:168:0;7581:420:1;24113:168:0;24294:21;24303:2;24307:7;24294:8;:21::i;:::-;23982:341;23912:411;;:::o;25279:339::-;25474:41;8195:10;25507:7;25474:18;:41::i;:::-;25466:103;;;;-1:-1:-1;;;25466:103:0;;;;;;;:::i;:::-;25582:28;25592:4;25598:2;25602:7;25582:9;:28::i;36010:256::-;36107:7;36143:23;36160:5;36143:16;:23::i;:::-;36135:5;:31;36127:87;;;;-1:-1:-1;;;36127:87:0;;8626:2:1;36127:87:0;;;8608:21:1;8665:2;8645:18;;;8638:30;8704:34;8684:18;;;8677:62;-1:-1:-1;;;8755:18:1;;;8748:41;8806:19;;36127:87:0;8424:407:1;36127:87:0;-1:-1:-1;;;;;;36232:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36010:256::o;68462:195::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8195:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;68528:21:::1;68568:11:::0;68560:34:::1;;;::::0;-1:-1:-1;;;68560:34:0;;9399:2:1;68560:34:0::1;::::0;::::1;9381:21:1::0;9438:2;9418:18;;;9411:30;-1:-1:-1;;;9457:18:1;;;9450:40;9507:18;;68560:34:0::1;9197:334:1::0;68560:34:0::1;68615:33;::::0;68623:10:::1;::::0;68615:33;::::1;;;::::0;68640:7;;68615:33:::1;::::0;;;68640:7;68623:10;68615:33;::::1;;;;;;68607:42;;;::::0;::::1;;68499:158;68462:195::o:0;61749:1353::-;61804:12;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61804:12:0;61829;61844:34;;;;;;;;;;;;;;-1:-1:-1;;;61844:34:0;;;61870:7;61844:17;:34::i;:::-;61829:49;;61889:13;61905:43;;;;;;;;;;;;;;-1:-1:-1;;;61905:43:0;;;61940:7;61905:17;:43::i;:::-;61889:59;;61959:13;61975:40;;;;;;;;;;;;;;-1:-1:-1;;;61975:40:0;;;62007:7;61975:17;:40::i;:::-;61959:56;;62026:13;62042:42;;;;;;;;;;;;;;-1:-1:-1;;;62042:42:0;;;62076:7;62042:17;:42::i;:::-;62026:58;-1:-1:-1;62095:11:0;62110:10;62117:3;62110:4;:10;:::i;:::-;62109:16;;62124:1;62109:16;:::i;:::-;62095:30;-1:-1:-1;62136:12:0;62152:9;62160:1;62152:5;:9;:::i;:::-;62151:15;;62165:1;62151:15;:::i;:::-;62136:30;-1:-1:-1;62177:12:0;62193:9;62201:1;62193:5;:9;:::i;:::-;62192:15;;62206:1;62192:15;:::i;:::-;62177:30;-1:-1:-1;62218:12:0;62234:9;62242:1;62234:5;:9;:::i;:::-;62233:15;;62247:1;62233:15;:::i;:::-;62218:30;;62259:13;62312:2;62305:3;:9;62301:566;;-1:-1:-1;62336:15:0;62301:566;;;62380:2;62373:3;:9;62369:498;;-1:-1:-1;62404:18:0;62369:498;;;62451:2;62444:3;:9;62440:427;;-1:-1:-1;62475:25:0;62440:427;;;62529:2;62522:3;:9;62518:349;;-1:-1:-1;62553:25:0;62518:349;;;62607:2;62600:3;:9;62596:271;;-1:-1:-1;62631:21:0;62596:271;;;62681:2;62674:3;:9;62670:197;;-1:-1:-1;62705:23:0;62670:197;;;62757:2;62750:3;:9;62746:121;;-1:-1:-1;62781:20:0;62746:121;;;-1:-1:-1;62839:16:0;62746:121;62897:197;;;;;;;;62921:2;62897:197;;;;;;;;:::i;:::-;;;;;62973:22;62990:4;62973:16;:22::i;:::-;62949:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;62897:197;;;;63016:22;63033:4;63016:16;:22::i;:::-;62897:197;;;;63057:22;63074:4;63057:16;:22::i;:::-;62897:197;;62877:217;61749:1353;-1:-1:-1;;;;;;;;;;;61749:1353:0:o;25689:185::-;25827:39;25844:4;25850:2;25854:7;25827:39;;;;;;;;;;;;:16;:39::i;64281:157::-;64338:7;64359:13;64378:17;64387:7;64378:8;:17::i;:::-;64358:37;;;64413:17;64424:5;64413:10;:17::i;:::-;64406:24;64281:157;-1:-1:-1;;;64281:157:0:o;63261:1012::-;63317:7;63326;63346:12;63361:35;;;;;;;;;;;;;;-1:-1:-1;;;63361:35:0;;;63388:7;63361:17;:35::i;:::-;63346:50;;63407:13;63423:1;63407:17;;63435:11;63488:3;63450:35;;;;;;;;;;;;;;-1:-1:-1;;;63450:35:0;;;63477:7;63450:17;:35::i;:::-;:41;;;;:::i;:::-;63449:47;;63495:1;63449:47;:::i;:::-;63435:61;-1:-1:-1;63523:1:0;63546:2;63539:9;;63535:699;;63574:18;63582:9;63574:4;:18;:::i;:::-;63573:26;;63596:3;63573:26;:::i;:::-;63565:34;;63622:1;63614:9;;63535:699;;;63652:2;63645:3;:9;63641:593;;63680:18;63688:9;63680:4;:18;:::i;:::-;63679:26;;63702:3;63679:26;:::i;:::-;63671:34;;63728:1;63720:9;;63641:593;;;63758:2;63751:3;:9;63747:487;;63786:18;63794:9;63786:4;:18;:::i;:::-;63785:26;;63808:3;63785:26;:::i;:::-;63777:34;;63834:1;63826:9;;63747:487;;;63864:2;63857:3;:9;63853:381;;63892:17;63900:8;63892:4;:17;:::i;:::-;63891:24;;63913:2;63891:24;:::i;:::-;63883:32;;63938:1;63930:9;;63853:381;;;63968:2;63961:3;:9;63957:277;;63996:16;64004:7;63996:4;:16;:::i;:::-;63995:23;;64016:2;63995:23;:::i;:::-;63987:31;;64041:1;64033:9;;63957:277;;;64071:2;64064:3;:9;64060:174;;64099:9;64106:2;64099:4;:9;:::i;:::-;64098:15;;64112:1;64098:15;:::i;:::-;64090:23;;64136:1;64128:9;;64060:174;;;64179:11;64186:4;64179;:11;:::i;:::-;64178:20;;64194:4;64178:20;:::i;:::-;64170:28;;64221:1;64213:9;;64060:174;64252:5;;64259;;-1:-1:-1;63261:1012:0;;-1:-1:-1;;;;63261:1012:0:o;36532:233::-;36607:7;36643:30;36430:10;:17;;36342:113;36643:30;36635:5;:38;36627:95;;;;-1:-1:-1;;;36627:95:0;;10677:2:1;36627:95:0;;;10659:21:1;10716:2;10696:18;;;10689:30;10755:34;10735:18;;;10728:62;-1:-1:-1;;;10806:18:1;;;10799:42;10858:19;;36627:95:0;10475:408:1;36627:95:0;36740:10;36751:5;36740:17;;;;;;;;:::i;:::-;;;;;;;;;36733:24;;36532:233;;;:::o;22524:239::-;22596:7;22632:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22632:16:0;22667:19;22659:73;;;;-1:-1:-1;;;22659:73:0;;11222:2:1;22659:73:0;;;11204:21:1;11261:2;11241:18;;;11234:30;11300:34;11280:18;;;11273:62;-1:-1:-1;;;11351:18:1;;;11344:39;11400:19;;22659:73:0;11020:405:1;63110:143:0;63177:7;63242:3;63204:35;;;;;;;;;;;;;;-1:-1:-1;;;63204:35:0;;;63231:7;63204:17;:35::i;:::-;:41;;;;:::i;22254:208::-;22326:7;-1:-1:-1;;;;;22354:19:0;;22346:74;;;;-1:-1:-1;;;22346:74:0;;11632:2:1;22346:74:0;;;11614:21:1;11671:2;11651:18;;;11644:30;11710:34;11690:18;;;11683:62;-1:-1:-1;;;11761:18:1;;;11754:40;11811:19;;22346:74:0;11430:406:1;22346:74:0;-1:-1:-1;;;;;;22438:16:0;;;;;:9;:16;;;;;;;22254:208::o;9890:94::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8195:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;9955:21:::1;9973:1;9955:9;:21::i;:::-;9890:94::o:0;61493:248::-;61549:13;61575:12;61590:35;;;;;;;;;;;;;;-1:-1:-1;;;61590:35:0;;;61617:7;61590:17;:35::i;:::-;61575:50;;61672:59;61699:25;61719:4;61699:19;:25::i;:::-;61726:1;61729;61672:26;:59::i;:::-;61650:82;;;;;;;;:::i;:::-;;;;;;;;;;;;;61636:97;;;61493:248;;;:::o;22999:104::-;23055:13;23088:7;23081:14;;;;;:::i;67889:565::-;67953:6;;;;67945:28;;;;-1:-1:-1;;;67945:28:0;;12466:2:1;67945:28:0;;;12448:21:1;12505:1;12485:18;;;12478:29;-1:-1:-1;;;12523:18:1;;;12516:39;12572:18;;67945:28:0;12264:332:1;67945:28:0;42033:2;67992:6;:23;;67984:48;;;;-1:-1:-1;;;67984:48:0;;12803:2:1;67984:48:0;;;12785:21:1;12842:2;12822:18;;;12815:30;-1:-1:-1;;;12861:18:1;;;12854:42;12913:18;;67984:48:0;12601:336:1;67984:48:0;68064:14;68072:6;41975:11;68064:14;:::i;:::-;68051:9;:27;;68043:67;;;;-1:-1:-1;;;68043:67:0;;13317:2:1;68043:67:0;;;13299:21:1;13356:2;13336:18;;;13329:30;13395:29;13375:18;;;13368:57;13442:18;;68043:67:0;13115:351:1;68043:67:0;68121:14;68138:13;36430:10;:17;;36342:113;68138:13;68189:9;;68121:30;;-1:-1:-1;68170:15:0;68179:6;68121:30;68170:15;:::i;:::-;:28;;68162:54;;;;-1:-1:-1;;;68162:54:0;;13673:2:1;68162:54:0;;;13655:21:1;13712:2;13692:18;;;13685:30;-1:-1:-1;;;13731:18:1;;;13724:43;13784:18;;68162:54:0;13471:337:1;68162:54:0;68266:6;68229:27;68284:163;68304:6;68300:1;:10;68284:163;;;68332:66;8195:10;68356:41;68376:20;68356:19;:41::i;:::-;68332:66;;:9;:66::i;:::-;68413:22;;;;:::i;:::-;;;;68312:3;;;;;:::i;:::-;;;;68284:163;;;;67934:520;;67889:565;:::o;24682:295::-;-1:-1:-1;;;;;24785:24:0;;8195:10;24785:24;;24777:62;;;;-1:-1:-1;;;24777:62:0;;14357:2:1;24777:62:0;;;14339:21:1;14396:2;14376:18;;;14369:30;14435:27;14415:18;;;14408:55;14480:18;;24777:62:0;14155:349:1;24777:62:0;8195:10;24852:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24852:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24852:53:0;;;;;;;;;;24921:48;;540:41:1;;;24852:42:0;;8195:10;24921:48;;513:18:1;24921:48:0;;;;;;;24682:295;;:::o;68665:85::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8195:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;68726:6:::1;:16:::0;;-1:-1:-1;;68726:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68665:85::o;25945:328::-;26120:41;8195:10;26153:7;26120:18;:41::i;:::-;26112:103;;;;-1:-1:-1;;;26112:103:0;;;;;;;:::i;:::-;26226:39;26240:4;26246:2;26250:7;26259:5;26226:13;:39::i;66636:427::-;66701:13;66728;66743;66760:17;66769:7;66760:8;:17::i;:::-;66727:50;;;;66808:247;66836:7;66862:16;66870:7;66862;:16::i;:::-;66897:17;66906:7;66897:8;:17::i;:::-;66933:12;66964:28;66984:7;66964:19;:28::i;:::-;67011:5;67035;66808:9;:247::i;:::-;66788:267;66636:427;-1:-1:-1;;;;66636:427:0:o;10139:192::-;9312:6;;-1:-1:-1;;;;;9312:6:0;8195:10;9459:23;9451:68;;;;-1:-1:-1;;;9451:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10228:22:0;::::1;10220:73;;;::::0;-1:-1:-1;;;10220:73:0;;14711:2:1;10220:73:0::1;::::0;::::1;14693:21:1::0;14750:2;14730:18;;;14723:30;14789:34;14769:18;;;14762:62;-1:-1:-1;;;14840:18:1;;;14833:36;14886:19;;10220:73:0::1;14509:402:1::0;10220:73:0::1;10304:19;10314:8;10304:9;:19::i;21885:305::-:0;21987:4;-1:-1:-1;;;;;;22024:40:0;;-1:-1:-1;;;22024:40:0;;:105;;-1:-1:-1;;;;;;;22081:48:0;;-1:-1:-1;;;22081:48:0;22024:105;:158;;;-1:-1:-1;;;;;;;;;;20603:40:0;;;22146:36;20494:157;31765:174;31840:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31840:29:0;-1:-1:-1;;;;;31840:29:0;;;;;;;;:24;;31894:23;31840:24;31894:14;:23::i;:::-;-1:-1:-1;;;;;31885:46:0;;;;;;;;;;;31765:174;;:::o;28077:348::-;28170:4;27872:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27872:16:0;28187:73;;;;-1:-1:-1;;;28187:73:0;;15118:2:1;28187:73:0;;;15100:21:1;15157:2;15137:18;;;15130:30;15196:34;15176:18;;;15169:62;-1:-1:-1;;;15247:18:1;;;15240:42;15299:19;;28187:73:0;14916:408:1;28187:73:0;28271:13;28287:23;28302:7;28287:14;:23::i;:::-;28271:39;;28340:5;-1:-1:-1;;;;;28329:16:0;:7;-1:-1:-1;;;;;28329:16:0;;:51;;;;28373:7;-1:-1:-1;;;;;28349:31:0;:20;28361:7;28349:11;:20::i;:::-;-1:-1:-1;;;;;28349:31:0;;28329:51;:87;;;-1:-1:-1;;;;;;25169:25:0;;;25145:4;25169:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28384:32;25048:164;31069:578;31228:4;-1:-1:-1;;;;;31201:31:0;:23;31216:7;31201:14;:23::i;:::-;-1:-1:-1;;;;;31201:31:0;;31193:85;;;;-1:-1:-1;;;31193:85:0;;15531:2:1;31193:85:0;;;15513:21:1;15570:2;15550:18;;;15543:30;15609:34;15589:18;;;15582:62;-1:-1:-1;;;15660:18:1;;;15653:39;15709:19;;31193:85:0;15329:405:1;31193:85:0;-1:-1:-1;;;;;31297:16:0;;31289:65;;;;-1:-1:-1;;;31289:65:0;;15941:2:1;31289:65:0;;;15923:21:1;15980:2;15960:18;;;15953:30;16019:34;15999:18;;;15992:62;-1:-1:-1;;;16070:18:1;;;16063:34;16114:19;;31289:65:0;15739:400:1;31289:65:0;31367:39;31388:4;31394:2;31398:7;31367:20;:39::i;:::-;31471:29;31488:1;31492:7;31471:8;:29::i;:::-;-1:-1:-1;;;;;31513:15:0;;;;;;:9;:15;;;;;:20;;31532:1;;31513:15;:20;;31532:1;;31513:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31544:13:0;;;;;;:9;:13;;;;;:18;;31561:1;;31544:13;:18;;31561:1;;31544:18;:::i;:::-;;;;-1:-1:-1;;31573:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31573:21:0;-1:-1:-1;;;;;31573:21:0;;;;;;;;;31612:27;;31573:16;;31612:27;;;;;;;31069:578;;;:::o;61277:208::-;61366:7;61393:84;61441:6;61449:25;61466:7;61449:16;:25::i;:::-;61424:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61393:23;:84::i;5817:723::-;5873:13;6094:10;6090:53;;-1:-1:-1;;6121:10:0;;;;;;;;;;;;-1:-1:-1;;;6121:10:0;;;;;5817:723::o;6090:53::-;6168:5;6153:12;6209:78;6216:9;;6209:78;;6242:8;;;;:::i;:::-;;-1:-1:-1;6265:10:0;;-1:-1:-1;6273:2:0;6265:10;;:::i;:::-;;;6209:78;;;6297:19;6329:6;6319:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6319:17:0;;6297:39;;6347:154;6354:10;;6347:154;;6381:11;6391:1;6381:11;;:::i;:::-;;-1:-1:-1;6450:10:0;6458:2;6450:5;:10;:::i;:::-;6437:24;;:2;:24;:::i;:::-;6424:39;;6407:6;6414;6407:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6407:56:0;;;;;;;;-1:-1:-1;6478:11:0;6487:2;6478:11;;:::i;:::-;;;6347:154;;64446:104;64504:7;64531:11;64537:5;64531:3;:11;:::i;10339:173::-;10414:6;;;-1:-1:-1;;;;;10431:17:0;;;-1:-1:-1;;;;;;10431:17:0;;;;;;;10464:40;;10414:6;;;10431:17;10414:6;;10464:40;;10395:16;;10464:40;10384:128;10339:173;:::o;6650:340::-;6709:13;6739:10;6735:56;;-1:-1:-1;;6766:13:0;;;;;;;;;;;;-1:-1:-1;;;6766:13:0;;;;;6650:340::o;6735:56::-;6816:5;6801:12;6861:78;6868:9;;6861:78;;6894:8;;;;:::i;:::-;;;;6926:1;6917:10;;;;;6861:78;;;6956:26;6968:5;6975:6;6956:11;:26::i;68856:419::-;68989:13;69045:3;69015:21;69092;69103:10;69092:8;:21;:::i;:::-;69082:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69082:32:0;-1:-1:-1;69060:54:0;-1:-1:-1;69142:10:0;69125:111;69158:8;69154:1;:12;69125:111;;;69213:8;69222:1;69213:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;69213:11:0;69188:6;69195:14;69199:10;69195:1;:14;:::i;:::-;69188:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;69188:36:0;;;;;;;;-1:-1:-1;69168:3:0;;;;:::i;:::-;;;;69125:111;;;-1:-1:-1;69260:6:0;68856:419;-1:-1:-1;;;;;68856:419:0:o;67328:553::-;67401:6;67420:15;67457:13;36430:10;:17;;36342:113;67457:13;67445:9;;:25;;;;:::i;:::-;67420:51;;67482:13;67498:62;67531:8;67541:18;67498:32;:62::i;:::-;67590:19;;;;67573:14;67590:19;;;:11;:19;;;;;;67482:78;;-1:-1:-1;67590:19:0;67624:24;67620:73;;-1:-1:-1;67675:6:0;67620:73;67705:11;:25;67717:12;67728:1;67717:8;:12;:::i;:::-;67705:25;;;;;;;;;;;;;;;-1:-1:-1;67705:25:0;;;:30;:141;;67797:11;:49;67823:12;67834:1;67823:8;:12;:::i;:::-;67797:49;;;;;;;;;;;;;;;;;;-1:-1:-1;67797:49:0;;;;67775:19;;;;;:11;:19;;;;;;;:71;;-1:-1:-1;;67775:71:0;67797:49;;;;67775:71;;;;;67705:141;;;67760:12;67771:1;67760:8;:12;:::i;:::-;67738:19;;;;;;;;:11;:19;;;;;:34;;-1:-1:-1;;67738:34:0;;;;;;;;;;67705:141;-1:-1:-1;67866:7:0;67328:553;-1:-1:-1;;;;67328:553:0:o;28767:110::-;28843:26;28853:2;28857:7;28843:26;;;;;;;;;;;;:9;:26::i;:::-;28767:110;;:::o;27155:315::-;27312:28;27322:4;27328:2;27332:7;27312:9;:28::i;:::-;27359:48;27382:4;27388:2;27392:7;27401:5;27359:22;:48::i;:::-;27351:111;;;;-1:-1:-1;;;27351:111:0;;;;;;;:::i;65572:1056::-;65813:13;65839:16;65858:47;65871:8;65881:16;65899:5;65858:12;:47::i;:::-;65839:66;;65916:18;65937:602;66105:25;66122:7;66105:16;:25::i;:::-;66244:57;66264:35;66278:5;66285:9;66296:2;66264:13;:35::i;:::-;66244:13;:57::i;:::-;66373:68;66387:5;66394:2;66398:5;66405:17;66416:5;66405:10;:17::i;:::-;66424:16;66373:13;:68::i;:::-;66018:476;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65937:13;:602::i;:::-;65916:623;;66614:4;66564:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;66550:70;;;;65572:1056;;;;;;;;;:::o;37378:589::-;-1:-1:-1;;;;;37584:18:0;;37580:187;;37619:40;37651:7;38794:10;:17;;38767:24;;;;:15;:24;;;;;:44;;;38822:24;;;;;;;;;;;;38690:164;37619:40;37580:187;;;37689:2;-1:-1:-1;;;;;37681:10:0;:4;-1:-1:-1;;;;;37681:10:0;;37677:90;;37708:47;37741:4;37747:7;37708:32;:47::i;:::-;-1:-1:-1;;;;;37781:16:0;;37777:183;;37814:45;37851:7;37814:36;:45::i;37777:183::-;37887:4;-1:-1:-1;;;;;37881:10:0;:2;-1:-1:-1;;;;;37881:10:0;;37877:83;;37908:40;37936:2;37940:7;37908:27;:40::i;69283:138::-;69343:7;69405:5;69388:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69388:23:0;;;;;;;;;69378:34;;69388:23;69378:34;;;;;69283:138;-1:-1:-1;;69283:138:0:o;7118:451::-;7193:13;7219:19;7251:10;7255:6;7251:1;:10;:::i;:::-;:14;;7264:1;7251:14;:::i;:::-;7241:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7241:25:0;;7219:47;;-1:-1:-1;;;7277:6:0;7284:1;7277:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7277:15:0;;;;;;;;;-1:-1:-1;;;7303:6:0;7310:1;7303:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7303:15:0;;;;;;;;-1:-1:-1;7334:9:0;7346:10;7350:6;7346:1;:10;:::i;:::-;:14;;7359:1;7346:14;:::i;:::-;7334:26;;7329:135;7366:1;7362;:5;7329:135;;;-1:-1:-1;;;7414:5:0;7422:3;7414:11;7401:25;;;;;;;:::i;:::-;;;;7389:6;7396:1;7389:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;7389:37:0;;;;;;;;-1:-1:-1;7451:1:0;7441:11;;;;;7369:3;;;:::i;:::-;;;7329:135;;;-1:-1:-1;7482:10:0;;7474:55;;;;-1:-1:-1;;;7474:55:0;;20029:2:1;7474:55:0;;;20011:21:1;;;20048:18;;;20041:30;20107:34;20087:18;;;20080:62;20159:18;;7474:55:0;19827:356:1;69494:543:0;69584:6;;69638:347;69735:18;69790:16;69805:1;69790:12;:16;:::i;:::-;69692:259;;20481:3:1;20459:16;;;;-1:-1:-1;;;;;;20455:38:1;69692:259:0;;;20443:51:1;69780:27:0;20510:11:1;;;20503:27;69834:14:0;20618:2:1;20614:15;;;-1:-1:-1;;20610:24:1;;;20596:12;;;20589:46;69875:16:0;20651:12:1;;;20644:28;69918:10:0;20706:15:1;;;20702:24;20688:12;;;20681:46;20743:13;;69692:259:0;20188:574:1;69638:347:0;69603:393;-1:-1:-1;70016:13:0;70023:6;69603:393;70016:13;:::i;29104:321::-;29234:18;29240:2;29244:7;29234:5;:18::i;:::-;29285:54;29316:1;29320:2;29324:7;29333:5;29285:22;:54::i;:::-;29263:154;;;;-1:-1:-1;;;29263:154:0;;;;;;;:::i;32504:803::-;32659:4;-1:-1:-1;;;;;32680:13:0;;13005:20;13053:8;32676:624;;32716:72;;-1:-1:-1;;;32716:72:0;;-1:-1:-1;;;;;32716:36:0;;;;;:72;;8195:10;;32767:4;;32773:7;;32782:5;;32716:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32716:72:0;;;;;;;;-1:-1:-1;;32716:72:0;;;;;;;;;;;;:::i;:::-;;;32712:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32962:13:0;;32958:272;;33005:60;;-1:-1:-1;;;33005:60:0;;;;;;;:::i;32958:272::-;33180:6;33174:13;33165:6;33161:2;33157:15;33150:38;32712:533;-1:-1:-1;;;;;;32839:55:0;-1:-1:-1;;;32839:55:0;;-1:-1:-1;32832:62:0;;32676:624;-1:-1:-1;33284:4:0;32504:803;;;;;;:::o;50700:247::-;50838:6;50935:3;50914:16;50935:3;50880:16;50891:5;50880:8;:16;:::i;:::-;50873:30;;;;:::i;:::-;50872:59;;;;:::i;:::-;50871:67;;;;:::i;:::-;50864:75;;:3;:75;:::i;53216:7286::-;53380:26;;;;;;;;;;;;-1:-1:-1;;;53380:26:0;;;;;;;;53417;;;;;;;;;;-1:-1:-1;;;53417:26:0;;;;53454:22;;;;;;;;;;;-1:-1:-1;;;53454:22:0;;;;53487;;;;;;;;;;-1:-1:-1;;;53487:22:0;;;;53520:25;;;;;;;;53380:18;53520:25;;;53354:13;;53454:22;;53520:25;53572:18;53581:8;53572;:18::i;:::-;53625:16;;53556:34;;-1:-1:-1;53652:23:0;;:::i;:::-;53686:106;;;;;;;;;;;;;;;;;;;53816:47;;;;;;;;;;;;-1:-1:-1;;;53686:8:0;53816:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53816:47:0;;;;;;53835:2;;53816:47;;53835:2;53816:18;:47::i;:::-;53805:5;53811:1;53805:8;;;:58;;;;53887:50;;;;;;;;;;;;;;-1:-1:-1;;;53887:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53887:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53887:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53887:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53887:50:0;;;:18;:50::i;:::-;53876:5;53882:1;53876:8;;;:61;;;;53961:50;;;;;;;;;;;;;;-1:-1:-1;;;53961:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53961:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53961:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53961:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53961:50:0;;;:18;:50::i;:::-;53950:8;;;:61;54035:42;;;;;;;;;;;;-1:-1:-1;;;53950:8:0;54035:42;;;;;;;;;;;;;;;;;-1:-1:-1;;;54035:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;54035:42:0;;;;;;54059:2;;;;54035:18;:42::i;:::-;54024:5;54030:1;54024:8;;;:53;;;;54101:50;;;;;;;;;;;;;;-1:-1:-1;;;54101:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54101:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54101:50:0;;;54141:4;54101:50;;;;;;;;;;;;;-1:-1:-1;;;54101:50:0;;;:18;:50::i;:::-;54090:5;54096:1;54090:8;;;:61;;;;54175:51;;;;;;;;;;;;;;-1:-1:-1;;;54175:51:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54175:51:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54175:51:0;;;54215:4;54175:51;;;;;;;;;;;;;-1:-1:-1;;;54175:51:0;;;:18;:51::i;:::-;54164:5;54170:1;54164:8;;;:62;;;;54250:50;;;;;;;;;;;;;;-1:-1:-1;;;54250:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54250:50:0;;;;;;;;;;;;;;;;-1:-1:-1;;;54250:50:0;;;54290:4;54250:50;;;;;;;;;;;;;-1:-1:-1;;;54250:50:0;;;:18;:50::i;:::-;54239:8;;;:61;54324:145;;;;;;;;;;;-1:-1:-1;;;54239:8:0;54324:145;;;;;;;54378:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54378:80:0;;;;;;;;54420:19;;;;54378:80;;;;54441:16;;;;-1:-1:-1;54378:80:0;;;54324:145;;:21;:145::i;:::-;54313:8;;;:156;54493:144;;;;;;;;;;;-1:-1:-1;;;54313:8:0;54493:144;;;;;;;54548:78;;-1:-1:-1;54548:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54548:78:0;;;;;;;;54588:19;;;;54548:78;;;;54609:16;;;;54548:78;;;;54493:144;;:21;:144::i;:::-;54482:8;;;:155;54662:35;;;;;;;;;;;;-1:-1:-1;;;54482:8:0;54662:35;;;;;54691:5;54662:22;:35::i;:::-;54650:9;;;:47;54722:39;;;;;;;;;;;-1:-1:-1;;;54650:9:0;54722:39;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54722:39:0;;;;;;:22;:39::i;:::-;54710:9;;;:51;54786:25;;;;;;;;;;;;-1:-1:-1;;;54710:9:0;54786:25;;;;;:19;:25::i;:::-;54774:9;;;:37;54836:54;;;;;;;;;;;;-1:-1:-1;;;54774:9:0;54836:54;;;54871:18;;;;54836:54;;;54864:5;;54836:21;:54::i;:::-;54824:9;;;:66;54903:21;;;;;;;;;;;;-1:-1:-1;;;54824:9:0;54903:21;;;54824:5;54909:2;54903:9;;;:21;;;;54949:167;;;;;;;;;;;;;;-1:-1:-1;;;54949:167:0;;;55005:100;;;;;;;;55020:4;55005:100;;;;55026:4;55005:100;;;;55032:36;55064:3;55055:5;55050:2;:10;;;;:::i;:::-;55049:18;;;;:::i;:::-;55032:16;:36::i;:::-;55005:100;;55070:5;55005:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;54949:22;:167::i;:::-;54937:9;;;:179;55141:28;55155:2;;55163:5;55141:13;:28::i;:::-;55129:9;;;:40;55194:32;;;;;;;;;;;;-1:-1:-1;;;55129:9:0;55194:32;;;;;55208:2;;55220:5;55194:13;:32::i;:::-;55182:9;;;:44;55251:35;;;;;;;;;;;-1:-1:-1;;;55182:9:0;55251:35;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55251:35:0;;;;;;55280:5;55251:13;:35::i;:::-;55239:9;;;:47;55311:28;55325:2;55329;55333:5;55311:13;:28::i;:::-;55299:9;;;:40;55352:31;;;;;;;;;;;-1:-1:-1;;;55299:9:0;55352:31;;;;;;;:9;;;:31;;;;55408:168;;;;;;;;;;-1:-1:-1;;;55408:168:0;;;;55464:101;;;;;;;;;;;;;;-1:-1:-1;;;55464:101:0;;;;;;;;;;;;55408:168;;;;55464:101;;;55492:36;55524:3;55510:10;55515:5;55510:2;:10;:::i;55408:168::-;55396:9;;;:180;55601:28;55615:2;;55623:5;55601:13;:28::i;:::-;55589:9;;;:40;55654:32;;;;;;;;;;;;-1:-1:-1;;;55589:9:0;55654:32;;;;;55668:2;;55680:5;55654:13;:32::i;:::-;55642:9;;;:44;55711:35;;;;;;;;;;;-1:-1:-1;;;55642:9:0;55711:35;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55711:35:0;;;;;;55740:5;55711:13;:35::i;:::-;55699:9;;;:47;55771:28;55785:2;55789;55793:5;55771:13;:28::i;:::-;55759:9;;;:40;55812:31;;;;;;;;;;;-1:-1:-1;;;55759:9:0;55812:31;;;;;;;:9;;;:31;;;;55868:98;;;;;;;;;;-1:-1:-1;;;55868:98:0;;;;55897:68;;;;;;;;;;;;;;-1:-1:-1;;;55897:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55897:68:0;;;;;;;;55933:4;55897:68;;;;;;;;;;;;;;;;-1:-1:-1;;;55897:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55897:68:0;;;;-1:-1:-1;;;;55897:68:0;55868:98;;:22;:98::i;:::-;55856:9;;;:110;55991:32;;;;;;;;;;;;-1:-1:-1;;;55856:9:0;55991:32;;;;;56005:2;;56009;;55991:13;:32::i;:::-;55979:9;;;:44;56048:28;56062:2;;56070:5;56048:13;:28::i;:::-;56036:9;;;:40;56089:31;;;;;;;;;;;;-1:-1:-1;;;56036:9:0;56089:31;;;56036:5;56095:2;56089:9;;;:31;;;;56145:40;;;;;;;;;;;;;;-1:-1:-1;;;56145:40:0;;;56174:2;56178;56182;56145:22;:40::i;:::-;56133:9;;;:52;56210:28;56224:2;56228;56232:5;56210:13;:28::i;:::-;56198:9;;;:40;56263:32;;;;;;;;;;;;-1:-1:-1;;;56204:2:0;56263:32;;;;;56277:2;;;;56263:13;:32::i;:::-;56251:9;;;:44;56308:31;;;;;;;;;;;;-1:-1:-1;;;56251:9:0;56308:31;;;56251:5;56314:2;56308:9;;;:31;;;;56352:60;;;;;;;;;;;;;;;;;:9;;;:60;56571:20;56557:10;:34;;;;;;;;:::i;:::-;;:56;;56607:6;56557:56;;;56594:10;;;;;;;;;;;;;;-1:-1:-1;;;56594:10:0;;;:4;:10::i;:::-;56458:193;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;56458:193:0;;;;;;56425:9;;;:237;56701:25;56687:10;:39;;;;;;;;:::i;:::-;;:426;;56833:25;56819:10;:39;;;;;;;;:::i;:::-;;:294;;56965:20;56951:10;:34;;;;;;;;:::i;:::-;;:68;;;-1:-1:-1;57003:16:0;56989:10;:30;;;;;;;;:::i;:::-;;56951:68;:162;;57057:56;57072:40;;;;;;;;57079:2;57072:40;;;;57083:2;57072:40;;;;57087:3;57072:40;;;;57092:5;57072:40;;;;57099:8;57104:2;57099:4;:8::i;:::-;57072:40;;;;;;;57057:14;:56::i;:::-;56687:426;;56951:162;57035:6;56687:426;;56819:294;56874:61;56889:45;;;;;;;;56896:2;56889:45;;;;56900:2;56889:45;;;;56904:3;56889:45;;;;56909:10;;;;;;;;;;;;;;-1:-1:-1;;;56909:10:0;;;:4;:10::i;:::-;56889:45;;;;56921:8;56926:2;56921:4;:8::i;56687:426::-;56742:61;56757:45;;;;;;;;56764:2;56757:45;;;;56768:2;56757:45;;;;56772:3;56757:45;;;;56777:10;;;;;;;;;;;;;;-1:-1:-1;;;56777:10:0;;;:4;:10::i;56742:61::-;56675:9;;;:438;57152:25;57138:10;:39;;;;;;;;:::i;:::-;;:429;;57285:25;57271:10;:39;;;;;;;;:::i;:::-;;:296;;57418:20;57404:10;:34;;;;;;;;:::i;:::-;;:68;;;-1:-1:-1;57456:16:0;57442:10;:30;;;;;;;;:::i;:::-;;57404:68;:163;;57510:57;57525:41;;;;;;;;57532:2;57525:41;;;;57536:2;57525:41;;;;57540:3;57525:41;;;;57545:5;57525:41;;;;57552:9;;;;;;;;;;;;;;-1:-1:-1;;;57552:9:0;;;:4;:9::i;57510:57::-;57138:429;;57404:163;57488:6;57138:429;;57271:296;57326:62;57341:46;;;;;;;;57348:2;57341:46;;;;57352:2;57341:46;;;;57356:3;57341:46;;;;57361:10;;;;;;;;;;;;;;-1:-1:-1;;;57361:10:0;;;:4;:10::i;:::-;57341:46;;;;57373:9;;;;;;;;;;;;;;-1:-1:-1;;;57373:9:0;;;:4;:9::i;57138:429::-;57193:62;57208:46;;;;;;;;57215:2;57208:46;;;;57219:2;57208:46;;;;57223:3;57208:46;;;;57228:10;;;;;;;;;;;;;;-1:-1:-1;;;57228:10:0;;;:4;:10::i;57193:62::-;57126:9;;;:441;57606:20;57592:10;:34;;;;;;;;:::i;:::-;;:926;;57730:15;57716:10;:29;;;;;;;;:::i;:::-;;:802;;57848:21;57834:10;:35;;;;;;;;:::i;:::-;;:684;;57973:16;57959:10;:30;;;;;;;;:::i;:::-;;:559;;58093:18;58079:10;:32;;;;;;;;:::i;:::-;;:439;;58215:25;58201:10;:39;;;;;;;;:::i;:::-;;:317;;58345:25;58331:10;:39;;;;;;;;:::i;:::-;;:187;;58461:57;58476:41;;;;;;;;58483:2;58476:41;;;;58487:2;58476:41;;;;58491:3;58476:41;;;;58496:5;58476:41;;;;58503:9;;;;;;;;;;;;;;-1:-1:-1;;;58503:9:0;;;:4;:9::i;58461:57::-;57592:926;;58331:187;58386:59;58401:43;;;;;;;;58408:2;58401:43;;;;58412:2;58401:43;;;;58416:3;58401:43;;;;58421:10;;;;;;;;;;;;;;-1:-1:-1;;;58421:10:0;;;:4;:10::i;:::-;58401:43;;;;58433:6;58401:43;;;;58441:2;58401:43;;;58386:14;:59::i;58201:317::-;58256:59;58271:43;;;;;;;;58278:2;58271:43;;;;58282:2;58271:43;;;;58286:3;58271:43;;;;58291:10;;;;;;;;;;;;;;-1:-1:-1;;;58291:10:0;;;:4;:10::i;58079:439::-;58127:58;58142:42;;;;;;;;58149:2;58142:42;;;;58153:2;58142:42;;;;58157:3;58142:42;;;;58162:5;58142:42;;;;58169:10;;;;;;;;;;;;;;-1:-1:-1;;;58169:10:0;;;:4;:10::i;57959:559::-;58005:58;58020:42;;;;;;;;58027:2;58020:42;;;;58031:2;58020:42;;;;58035:3;58020:42;;;;58040:5;58020:42;;;;58047:10;;;;;;;;;;;;;;-1:-1:-1;;;58047:10:0;;;:4;:10::i;57834:684::-;57885:58;57900:42;;;;;;;;57907:2;57900:42;;;;57911:2;57900:42;;;;57915:3;57900:42;;;;57920:5;57900:42;;;;57927:10;;;;;;;;;;;;;;-1:-1:-1;;;57927:10:0;;;:4;:10::i;57716:802::-;57761:57;57776:41;;;;;;;;57783:2;57776:41;;;;57787:2;57776:41;;;;57791:3;57776:41;;;;57796:5;57776:41;;;;57803:9;;;;;;;;;;;;;;-1:-1:-1;;;57803:9:0;;;:4;:9::i;57592:926::-;57642:58;57657:42;;;;;;;;57664:2;57657:42;;;;57668:2;57657:42;;;;57672:3;57657:42;;;;57677:5;57657:42;;;;57684:10;;;;;;;;;;;;;;-1:-1:-1;;;57684:10:0;;;:4;:10::i;57642:58::-;57580:9;;;:938;58531:18;;;;;;;;;;;;-1:-1:-1;;;57580:9:0;58531:18;;;:9;;;:18;58574:33;58586:8;58596:10;58574:11;:33::i;:::-;58562:9;;;:45;58734:20;58720:10;:34;;;;;;;;:::i;:::-;;:102;;58784:16;58770:10;:30;;;;;;;;:::i;:::-;;:52;;58816:6;58720:102;;58770:52;58803:10;;;;;;;;;;;;;;-1:-1:-1;;;58803:10:0;;;:4;:10::i;:::-;58720:102;;;58757:10;;;;;;;;;;;;;;-1:-1:-1;;;58757:10:0;;;:4;:10::i;:::-;58653:207;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58653:207:0;;;;;;;;;58620:5;58626:2;58620:9;;;:251;;;;58896:72;58910:8;58920:47;;;;;;;;58927:4;58920:47;;;;58933:4;58920:47;;;;58939:3;58920:47;;;;58944:10;;;;;;;;;;;;;;-1:-1:-1;;;58944:10:0;;;:4;:10::i;:::-;58920:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58920:47:0;;;;;;58896:13;:72::i;:::-;58884:9;;;:84;59017:47;;;;;;;;;;;;;;;-1:-1:-1;;;59017:47:0;;;;;;58884:9;59017:47;;;;;;59037:2;59017:47;;;;59041:10;;;;;;;;;;;-1:-1:-1;;;59041:10:0;;;;58993:72;;59007:8;;59017:47;;;;;59041:10;;:4;:10::i;58993:72::-;58981:9;;;:84;59114:42;;;;;;;;;;;;;;;-1:-1:-1;;;59114:42:0;;;;;;58981:9;59114:42;;;;;;59134:2;59114:42;;;;;;;;;;;;;;;;;-1:-1:-1;59114:42:0;;-1:-1:-1;59114:42:0;;;;;;;;;;;;;;-1:-1:-1;;;59114:42:0;;;;-1:-1:-1;;;59114:42:0;;;;59090:67;;59104:8;;59090:13;:67::i;:::-;59078:5;59084:2;59078:9;;;:79;;;;59182:66;59196:8;59206:41;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59206:41:0;;;;;;;59220:4;59206:41;;;;59226:2;59206:41;;;;59230:5;59206:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59206:41:0;;;;;;59182:13;:66::i;:::-;59170:9;;;:78;59261:18;;;;;;;;;;;;-1:-1:-1;;;59170:9:0;59261:18;;;:9;;;:18;59357:16;59343:10;:30;;;;;;;;:::i;:::-;;:52;;59389:6;59343:52;;;59376:10;;;;;;;;;;;;;;-1:-1:-1;;;59376:10:0;;;:4;:10::i;:::-;59311:91;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59311:91:0;;;;;;;;;59292:5;59298:2;59292:9;;;:111;;;;59428:77;59443:8;59453:51;;;;;;;;59462:4;59453:51;;;;59468:4;59453:51;;;;59474:2;59453:51;;;;59478:2;59453:51;;;;59482:5;59453:51;;;;59489:9;;;;;;;;;;;;;;-1:-1:-1;;;59489:9:0;;;:4;:9::i;:::-;59453:51;;;;;;;;;;;;;;;;;-1:-1:-1;;;59453:51:0;;;;;;59428:14;:77::i;:::-;59416:5;59422:2;59416:9;;;:89;;;;59530:77;59545:8;59555:51;;;;;;;;59564:4;59555:51;;;;59570:4;59555:51;;;;59576:2;59555:51;;;;59580:2;59555:51;;;;59584:5;59555:51;;;;59591:9;;;;;;;;;;;;;;-1:-1:-1;;;59591:9:0;;;:4;:9::i;59530:77::-;59518:5;59524:2;59518:9;;;:89;;;;59632:77;59647:8;59657:51;;;;;;;;59666:4;59657:51;;;;59672:4;59657:51;;;;59678:2;59657:51;;;;59682:2;59657:51;;;;59686:5;59657:51;;;;59693:9;;;;;;;;;;;;;;-1:-1:-1;;;59693:9:0;;;:4;:9::i;59632:77::-;59620:9;;;:89;59722:18;;;;;;;;;;;-1:-1:-1;;;59620:9:0;59722:18;;;;;;;:9;;;:18;;;;59753:20;;;;;;;;;;;-1:-1:-1;;;59753:20:0;;;;:9;;;:20;59809:6;59841:1;-1:-1:-1;59853:500:0;59873:1;59869;:5;59853:500;;;59969:6;59998:5;60004:8;60008:4;60004:1;:8;:::i;:::-;59998:15;;;;;;;:::i;:::-;;;;;60036:5;60042:8;60046:4;60042:1;:8;:::i;:::-;:12;;60053:1;60042:12;:::i;:::-;60036:19;;;;;;;:::i;:::-;;;;;60078:5;60084:8;60088:4;60084:1;:8;:::i;:::-;:12;;60095:1;60084:12;:::i;:::-;60078:19;;;;;;;:::i;:::-;;;;;60120:5;60126:8;60130:4;60126:1;:8;:::i;:::-;:12;;60137:1;60126:12;:::i;:::-;60120:19;;;;;;;:::i;:::-;;;;;60162:5;60168:8;60172:4;60168:1;:8;:::i;:::-;:12;;60179:1;60168:12;:::i;:::-;60162:19;;;;;;;:::i;:::-;;;;;60204:5;60210:8;60214:4;60210:1;:8;:::i;:::-;:12;;60221:1;60210:12;:::i;:::-;60204:19;;;;;;;:::i;:::-;;;;;60246:5;60252:8;60256:4;60252:1;:8;:::i;:::-;:12;;60263:1;60252:12;:::i;:::-;60246:19;;;;;;;:::i;:::-;;;;;60288:5;60294:8;60298:4;60294:1;:8;:::i;:::-;:12;;60305:1;60294:12;:::i;:::-;60288:19;;;;;;;:::i;:::-;;;;;59930:396;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59896:445;;59876:3;;;;;:::i;:::-;;;;59853:500;;;-1:-1:-1;60404:9:0;;;;60415;;;;60426;;;;60437;;;;60448;;;;60459;;;;60379:90;;;;60396:6;;60404:9;;60415;;60426;;60437;;60448;;60404;60379:90;;:::i;:::-;;;;;;;-1:-1:-1;;60379:90:0;;;;;;;53216:7286;-1:-1:-1;;;;;;;;;;;;;;53216:7286:0:o;70391:1607::-;70489:11;;70449:13;;70515:8;70511:23;;-1:-1:-1;;70525:9:0;;;;;;;;;-1:-1:-1;70525:9:0;;;70391:1607;-1:-1:-1;70391:1607:0:o;70511:23::-;70586:18;70624:1;70613:7;:3;70619:1;70613:7;:::i;:::-;70612:13;;;;:::i;:::-;70607:19;;:1;:19;:::i;:::-;70586:40;-1:-1:-1;70684:19:0;70716:15;70586:40;70729:2;70716:15;:::i;:::-;70706:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70706:26:0;;70684:48;;70745:18;70766:5;;;;;;;;;;;;;;;;;70745:26;;70835:1;70828:5;70824:13;70880:2;70872:6;70868:15;70931:1;70899:777;70954:3;70951:1;70948:10;70899:777;;;71009:1;71052:12;;;;;71046:19;71147:4;71135:2;71131:14;;;;;71113:40;;71107:47;71256:2;71252:14;;;71248:25;;71234:40;;71228:47;71385:1;71381:13;;;71377:24;;71363:39;;71357:46;71505:16;;;;71491:31;;71485:38;71183:1;71179:11;;;71277:4;71224:58;;;71215:68;71308:11;;71353:57;;;71344:67;;;;71436:11;;71481:49;;71472:59;71560:3;71556:13;71589:22;;71659:1;71644:17;;;;71002:9;70899:777;;;70903:44;71708:1;71703:3;71699:11;71729:1;71724:84;;;;71827:1;71822:82;;;;71692:212;;71724:84;-1:-1:-1;;;;;71757:17:0;;71750:43;71724:84;;71822:82;-1:-1:-1;;;;;71855:17:0;;71848:41;71692:212;-1:-1:-1;;;71920:26:0;;;71927:6;70391:1607;-1:-1:-1;;;;70391:1607:0:o;64558:1006::-;64751:13;64977:5;65056:30;65072:2;:13;;;65056:15;:30::i;:::-;65166:23;65183:5;65166:16;:23::i;:::-;65289:24;65306:6;65289:16;:24::i;:::-;65272:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;65411:34;65428:16;65411;:34::i;:::-;64930:542;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64930:542:0;;;;;;;;;;64822:719;;64930:542;64822:719;;:::i;:::-;;;;;;;;;;;;;64777:779;;64558:1006;;;;;;;:::o;39481:988::-;39747:22;39797:1;39772:22;39789:4;39772:16;:22::i;:::-;:26;;;;:::i;:::-;39809:18;39830:26;;;:17;:26;;;;;;39747:51;;-1:-1:-1;39963:28:0;;;39959:328;;-1:-1:-1;;;;;40030:18:0;;40008:19;40030:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40081:30;;;;;;:44;;;40198:30;;:17;:30;;;;;:43;;;39959:328;-1:-1:-1;40383:26:0;;;;:17;:26;;;;;;;;40376:33;;;-1:-1:-1;;;;;40427:18:0;;;;;:12;:18;;;;;:34;;;;;;;40420:41;39481:988::o;40764:1079::-;41042:10;:17;41017:22;;41042:21;;41062:1;;41042:21;:::i;:::-;41074:18;41095:24;;;:15;:24;;;;;;41468:10;:26;;41017:46;;-1:-1:-1;41095:24:0;;41017:46;;41468:26;;;;;;:::i;:::-;;;;;;;;;41446:48;;41532:11;41507:10;41518;41507:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41612:28;;;:15;:28;;;;;;;:41;;;41784:24;;;;;41777:31;41819:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40835:1008;;;40764:1079;:::o;38268:221::-;38353:14;38370:20;38387:2;38370:16;:20::i;:::-;-1:-1:-1;;;;;38401:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38446:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38268:221:0:o;29761:382::-;-1:-1:-1;;;;;29841:16:0;;29833:61;;;;-1:-1:-1;;;29833:61:0;;30088:2:1;29833:61:0;;;30070:21:1;;;30107:18;;;30100:30;30166:34;30146:18;;;30139:62;30218:18;;29833:61:0;29886:356:1;29833:61:0;27848:4;27872:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27872:16:0;:30;29905:58;;;;-1:-1:-1;;;29905:58:0;;30449:2:1;29905:58:0;;;30431:21:1;30488:2;30468:18;;;30461:30;30527;30507:18;;;30500:58;30575:18;;29905:58:0;30247:352:1;29905:58:0;29976:45;30005:1;30009:2;30013:7;29976:20;:45::i;:::-;-1:-1:-1;;;;;30034:13:0;;;;;;:9;:13;;;;;:18;;30051:1;;30034:13;:18;;30051:1;;30034:18;:::i;:::-;;;;-1:-1:-1;;30063:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30063:21:0;-1:-1:-1;;;;;30063:21:0;;;;;;;;30102:33;;30063:16;;;30102:33;;30063:16;;30102:33;29761:382;;:::o;51101:237::-;51157:7;;51219:3;51209:13;;;;;:30;;;51236:3;51226:6;:13;;51209:30;51205:103;;;51278:12;51287:3;51278:6;:12;:::i;:::-;51270:26;;51294:2;51270:26;:::i;:::-;51264:32;;:3;:32;:::i;42475:741::-;42675:13;42701:20;42764:2;42777:1;42789;42731:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42701:91;;42908:2;42921:1;42933;42875:60;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;42875:60:0;;;;;;;;;;42833:340;;42985:4;;;;43115:9;;42875:60;42833:340;;:::i;:::-;;;;;;;-1:-1:-1;;42833:340:0;;;;;;;42475:741;-1:-1:-1;;;;;;;42475:741:0:o;43408:1023::-;43543:13;43574:20;43651:2;43664:13;:15;;;43690:13;:15;;;43618:88;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43618:88:0;;;;;;;;;43848:18;;;;43996:24;;;;43618:88;;-1:-1:-1;43758:277:0;;43618:88;;43848:18;;43618:88;43758:277;;:::i;:::-;;;;;;;;;;;;;43728:318;;44122:6;44185:13;:27;;;44266:13;:24;;;44087:301;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;44087:301:0;;;;;;;43408:1023;-1:-1:-1;;;;43408:1023:0:o;44439:723::-;44533:13;44680:2;44811:5;44604:535;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44559:595;;44439:723;;;;:::o;45170:510::-;45240:13;45387:2;45311:346;;;;;;;;:::i;:::-;;;;;;;;;;;;;45266:406;;45170:510;;;:::o;45688:752::-;45843:13;45990:2;46166:5;46235:12;45914:503;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45869:563;;45688:752;;;;;:::o;46657:1127::-;46795:13;46826:20;46946:2;46967:14;:29;;;:72;;;;;;;;;;;;;;;-1:-1:-1;;;46967:72:0;;;;;;;;;;;;;;;;;;;;;;;;47084:17;;47147;;;;;47209:16;;;;;46870:370;;;;;;47084:17;46870:370;;:::i;:::-;;;;;;;;;;;;;46826:425;;47327:6;47352:14;:18;;;:35;;;;;;;;;;;;;;;-1:-1:-1;;;47352:35:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47352:35:0;;;;47406:14;:18;;;:43;;;;;;;;;;;;;;;;;47427:14;:17;;;47406:43;47468:14;:18;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47468:34:0;;;;47521:14;:18;;;:43;;;;;;;;;;;;;;;;;47542:14;:17;;;47521:43;47583:14;:18;;;:59;;;;;;;;;;;;;;;-1:-1:-1;;;47583:59:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47583:59:0;;;;47661:14;:22;;;:42;;;;;;;;;;;;;;;-1:-1:-1;;;47661:42:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47661:42:0;;;;47292:449;;;;;;;;;;;;;;:::i;48621:513::-;48767:13;48926:5;48993:7;49058:6;48838:273;;;;;;;;;;:::i;47792:821::-;47962:13;48205:2;48276:1;48346;48420:4;48105:389;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48105:389:0;;;;;;;;;;48033:557;;48540:4;;48105:389;48033:557;;:::i;:::-;;;;;;;;;;;;;47988:617;;47792:821;;;;;;:::o;50955:138::-;51010:13;51076:2;51050:34;;;;;;;;:::i;49303:266::-;49372:13;49418:143;49452:94;;;;;;;;49461:6;:9;;;49452:94;;;;49472:6;:9;;;49452:94;;;;49483:6;:8;;;49452:94;;;;49493:6;:8;;;49452:94;;;;49503:6;:11;;;49452:94;;;;49516:6;:13;;;49452:94;;;;49531:6;:14;;;49452:94;;;49418:15;:143::i;51729:494::-;51813:13;51978:20;51964:10;:34;;;;;;;;:::i;:::-;;:98;;52028:16;52014:10;:30;;;;;;;;:::i;:::-;;:48;;;;;;;;;;;;;;51964:98;;52014:48;52047:10;;;;;;;;;;;;;;-1:-1:-1;;;52047:10:0;;;:4;:10::i;:::-;51964:98;;;52001:10;;;;;;;;;;;;;;-1:-1:-1;;;52001:10:0;;;:4;:10::i;:::-;52116:19;52126:8;52116:9;:19::i;:::-;51884:316;;;;;;;;;:::i;52765:443::-;52850:13;52896:304;52929:256;;;;;;;;52958:6;:9;;;52929:256;;;;52990:6;:9;;;52929:256;;;;53056:3;53034:18;53043:8;53034;:18::i;:::-;53023:6;:8;;;:29;;;;:::i;:::-;53022:37;;;;:::i;:::-;52929:256;;53082:11;;;;;52929:256;;;;53116:13;;;;-1:-1:-1;52929:256:0;;;53152:14;;;;52929:256;;;52896:14;:304::i;52231:526::-;52320:13;52346;52362:18;52371:8;52362;:18::i;:::-;52346:34;;52411:338;52445:289;;;;;;;;52476:7;:10;;;52445:289;;;;52509:7;:10;;;52445:289;;;;52565:3;52556:5;52543:7;:10;;;:18;;;;:::i;:::-;52542:26;;;;:::i;:::-;52445:289;;;;52614:3;52605:5;52592:7;:10;;;:18;;;;:::i;:::-;52591:26;;;;:::i;:::-;52445:289;;;;52640:7;:12;;;52445:289;;;;52675:7;:14;;;52445:289;;;;;;;;;;;;;;;;;-1:-1:-1;;;52445:289:0;;;;;;52411:15;:338::i;60510:759::-;60573:13;60609:15;60603:2;:21;;;;;;;;:::i;:::-;;60599:643;;;-1:-1:-1;;60641:13:0;;;;;;;;;;;;-1:-1:-1;;;60641:13:0;;;;;60510:759::o;60599:643::-;60682:18;60676:2;:24;;;;;;;;:::i;:::-;;60672:570;;;-1:-1:-1;;60717:16:0;;;;;;;;;;;;-1:-1:-1;;;60717:16:0;;;;;60510:759::o;60672:570::-;60761:25;60755:2;:31;;;;;;;;:::i;:::-;;60751:491;;;-1:-1:-1;;60803:15:0;;;;;;;;;;;;-1:-1:-1;;;60803:15:0;;;;;60510:759::o;60751:491::-;60846:25;60840:2;:31;;;;;;;;:::i;:::-;;60836:406;;;-1:-1:-1;;60888:15:0;;;;;;;;;;;;-1:-1:-1;;;60888:15:0;;;;;60510:759::o;60836:406::-;60931:23;60925:2;:29;;;;;;;;:::i;:::-;;60921:321;;;-1:-1:-1;;60971:16:0;;;;;;;;;;;;-1:-1:-1;;;60971:16:0;;;;;60510:759::o;60921:321::-;61015:21;61009:2;:27;;;;;;;;:::i;:::-;;61005:237;;;-1:-1:-1;;61053:19:0;;;;;;;;;;;;-1:-1:-1;;;61053:19:0;;;;;60510:759::o;61005:237::-;61100:16;61094:2;:22;;;;;;;;:::i;:::-;;61090:152;;;-1:-1:-1;;61133:14:0;;;;;;;;;;;;-1:-1:-1;;;61133:14:0;;;;;60510:759::o;61090:152::-;61175:20;61169:2;:26;;;;;;;;:::i;:::-;;61165:77;;;-1:-1:-1;;61212:18:0;;;;;;;;;;;;-1:-1:-1;;;61212:18:0;;;;;60510:759::o;61165:77::-;-1:-1:-1;;61252:9:0;;;;;;;;;-1:-1:-1;61252:9:0;;;60510:759::o;49762:930::-;49836:13;50072:8;:11;;;50153:8;:11;;;50234:29;50251:8;:11;;;50234:16;:29::i;:::-;49979:350;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50375:29;50392:8;:11;;;50375:16;:29::i;:::-;50460:8;:13;;;50531:8;:15;;;50605:8;:16;;;49907:762;;;;;;;;;;;;:::i;51346:375::-;51431:31;;;;;;;;;:26;:31;;;51405:13;;51431:31;51477:13;;51473:211;;51522:35;51547:8;51522:16;:35::i;:::-;51507:50;;51473:211;;;51634:36;51659:9;51660:8;51659:9;:::i;51634:36::-;51612:59;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:127::-;2749:10;2744:3;2740:20;2737:1;2730:31;2780:4;2777:1;2770:15;2804:4;2801:1;2794:15;2820:963;2995:2;2984:9;2977:21;2958:4;3023:6;3017:13;3056:1;3052:2;3049:9;3039:140;;3101:10;3096:3;3092:20;3089:1;3082:31;3136:4;3133:1;3126:15;3164:4;3161:1;3154:15;3039:140;3215:2;3210;3199:9;3195:18;3188:30;;3265:2;3257:6;3253:15;3247:22;3305:4;3300:2;3289:9;3285:18;3278:32;3333:52;3380:3;3369:9;3365:19;3351:12;3333:52;:::i;:::-;3319:66;;3434:2;3426:6;3422:15;3416:22;3461:2;3457:7;3528:2;3516:9;3508:6;3504:22;3500:31;3495:2;3484:9;3480:18;3473:59;3555:41;3589:6;3573:14;3555:41;:::i;:::-;3541:55;;3645:2;3637:6;3633:15;3627:22;3605:44;;3715:2;3703:9;3695:6;3691:22;3687:31;3680:4;3669:9;3665:20;3658:61;;3736:41;3770:6;3754:14;3736:41;:::i;:::-;3728:49;2820:963;-1:-1:-1;;;;;2820:963:1:o;4041:186::-;4100:6;4153:2;4141:9;4132:7;4128:23;4124:32;4121:52;;;4169:1;4166;4159:12;4121:52;4192:29;4211:9;4192:29;:::i;4232:160::-;4297:20;;4353:13;;4346:21;4336:32;;4326:60;;4382:1;4379;4372:12;4397:254;4462:6;4470;4523:2;4511:9;4502:7;4498:23;4494:32;4491:52;;;4539:1;4536;4529:12;4491:52;4562:29;4581:9;4562:29;:::i;:::-;4552:39;;4610:35;4641:2;4630:9;4626:18;4610:35;:::i;:::-;4600:45;;4397:254;;;;;:::o;4656:180::-;4712:6;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;4804:26;4820:9;4804:26;:::i;4841:127::-;4902:10;4897:3;4893:20;4890:1;4883:31;4933:4;4930:1;4923:15;4957:4;4954:1;4947:15;4973:1138;5068:6;5076;5084;5092;5145:3;5133:9;5124:7;5120:23;5116:33;5113:53;;;5162:1;5159;5152:12;5113:53;5185:29;5204:9;5185:29;:::i;:::-;5175:39;;5233:38;5267:2;5256:9;5252:18;5233:38;:::i;:::-;5223:48;;5318:2;5307:9;5303:18;5290:32;5280:42;;5373:2;5362:9;5358:18;5345:32;5396:18;5437:2;5429:6;5426:14;5423:34;;;5453:1;5450;5443:12;5423:34;5491:6;5480:9;5476:22;5466:32;;5536:7;5529:4;5525:2;5521:13;5517:27;5507:55;;5558:1;5555;5548:12;5507:55;5594:2;5581:16;5616:2;5612;5609:10;5606:36;;;5622:18;;:::i;:::-;5697:2;5691:9;5665:2;5751:13;;-1:-1:-1;;5747:22:1;;;5771:2;5743:31;5739:40;5727:53;;;5795:18;;;5815:22;;;5792:46;5789:72;;;5841:18;;:::i;:::-;5881:10;5877:2;5870:22;5916:2;5908:6;5901:18;5956:7;5951:2;5946;5942;5938:11;5934:20;5931:33;5928:53;;;5977:1;5974;5967:12;5928:53;6033:2;6028;6024;6020:11;6015:2;6007:6;6003:15;5990:46;6078:1;6073:2;6068;6060:6;6056:15;6052:24;6045:35;6099:6;6089:16;;;;;;;4973:1138;;;;;;;:::o;6116:260::-;6184:6;6192;6245:2;6233:9;6224:7;6220:23;6216:32;6213:52;;;6261:1;6258;6251:12;6213:52;6284:29;6303:9;6284:29;:::i;:::-;6274:39;;6332:38;6366:2;6355:9;6351:18;6332:38;:::i;6381:380::-;6460:1;6456:12;;;;6503;;;6524:61;;6578:4;6570:6;6566:17;6556:27;;6524:61;6631:2;6623:6;6620:14;6600:18;6597:38;6594:161;;;6677:10;6672:3;6668:20;6665:1;6658:31;6712:4;6709:1;6702:15;6740:4;6737:1;6730:15;6594:161;;6381:380;;;:::o;8006:413::-;8208:2;8190:21;;;8247:2;8227:18;;;8220:30;8286:34;8281:2;8266:18;;8259:62;-1:-1:-1;;;8352:2:1;8337:18;;8330:47;8409:3;8394:19;;8006:413::o;8836:356::-;9038:2;9020:21;;;9057:18;;;9050:30;9116:34;9111:2;9096:18;;9089:62;9183:2;9168:18;;8836:356::o;9536:127::-;9597:10;9592:3;9588:20;9585:1;9578:31;9628:4;9625:1;9618:15;9652:4;9649:1;9642:15;9668:112;9700:1;9726;9716:35;;9731:18;;:::i;:::-;-1:-1:-1;9765:9:1;;9668:112::o;9785:127::-;9846:10;9841:3;9837:20;9834:1;9827:31;9877:4;9874:1;9867:15;9901:4;9898:1;9891:15;9917:128;9957:3;9988:1;9984:6;9981:1;9978:13;9975:39;;;9994:18;;:::i;:::-;-1:-1:-1;10030:9:1;;9917:128::o;10050:420::-;-1:-1:-1;;;10307:3:1;10300:18;10282:3;10347:6;10341:13;10363:61;10417:6;10413:1;10408:3;10404:11;10397:4;10389:6;10385:17;10363:61;:::i;:::-;10444:16;;;;10462:1;10440:24;;10050:420;-1:-1:-1;;10050:420:1:o;10888:127::-;10949:10;10944:3;10940:20;10937:1;10930:31;10980:4;10977:1;10970:15;11004:4;11001:1;10994:15;11841:418;-1:-1:-1;;;12098:3:1;12091:16;12073:3;12136:6;12130:13;12152:61;12206:6;12202:1;12197:3;12193:11;12186:4;12178:6;12174:17;12152:61;:::i;:::-;12233:16;;;;12251:1;12229:24;;11841:418;-1:-1:-1;;11841:418:1:o;12942:168::-;12982:7;13048:1;13044;13040:6;13036:14;13033:1;13030:21;13025:1;13018:9;13011:17;13007:45;13004:71;;;13055:18;;:::i;:::-;-1:-1:-1;13095:9:1;;12942:168::o;13813:197::-;13851:3;13879:6;13920:2;13913:5;13909:14;13947:2;13938:7;13935:15;13932:41;;;13953:18;;:::i;:::-;14002:1;13989:15;;13813:197;-1:-1:-1;;;13813:197:1:o;14015:135::-;14054:3;-1:-1:-1;;14075:17:1;;14072:43;;;14095:18;;:::i;:::-;-1:-1:-1;14142:1:1;14131:13;;14015:135::o;16144:125::-;16184:4;16212:1;16209;16206:8;16203:34;;;16217:18;;:::i;:::-;-1:-1:-1;16254:9:1;;16144:125::o;16274:470::-;16453:3;16491:6;16485:13;16507:53;16553:6;16548:3;16541:4;16533:6;16529:17;16507:53;:::i;:::-;16623:13;;16582:16;;;;16645:57;16623:13;16582:16;16679:4;16667:17;;16645:57;:::i;:::-;16718:20;;16274:470;-1:-1:-1;;;;16274:470:1:o;16749:120::-;16789:1;16815;16805:35;;16820:18;;:::i;:::-;-1:-1:-1;16854:9:1;;16749:120::o;16874:217::-;16913:4;16942:6;16998:10;;;;16968;;17020:12;;;17017:38;;;17035:18;;:::i;:::-;17072:13;;16874:217;-1:-1:-1;;;16874:217:1:o;17096:414::-;17298:2;17280:21;;;17337:2;17317:18;;;17310:30;17376:34;17371:2;17356:18;;17349:62;-1:-1:-1;;;17442:2:1;17427:18;;17420:48;17500:3;17485:19;;17096:414::o;17515:1432::-;-1:-1:-1;;;18164:55:1;;18242:13;;18146:3;;18264:62;18242:13;18314:2;18305:12;;18298:4;18286:17;;18264:62;:::i;:::-;18390:66;18385:2;18345:16;;;18377:11;;;18370:87;18486:28;18481:2;18473:11;;18466:49;18540:13;;18562:63;18540:13;18611:2;18603:11;;18596:4;18584:17;;18562:63;:::i;:::-;-1:-1:-1;;;18685:2:1;18644:17;;;;18677:11;;;18670:65;18760:13;;18782:63;18760:13;18831:2;18823:11;;18816:4;18804:17;;18782:63;:::i;:::-;-1:-1:-1;;;18905:2:1;18864:17;;;;18897:11;;;18890:24;18938:2;18930:11;;17515:1432;-1:-1:-1;;;;;17515:1432:1:o;18952:448::-;19214:31;19209:3;19202:44;19184:3;19275:6;19269:13;19291:62;19346:6;19341:2;19336:3;19332:12;19325:4;19317:6;19313:17;19291:62;:::i;:::-;19373:16;;;;19391:2;19369:25;;18952:448;-1:-1:-1;;18952:448:1:o;19405:276::-;19536:3;19574:6;19568:13;19590:53;19636:6;19631:3;19624:4;19616:6;19612:17;19590:53;:::i;:::-;19659:16;;;;;19405:276;-1:-1:-1;;19405:276:1:o;19686:136::-;19725:3;19753:5;19743:39;;19762:18;;:::i;:::-;-1:-1:-1;;;19798:18:1;;19686:136::o;20767:179::-;20798:1;20824:6;20857:2;20854:1;20850:10;20879:3;20869:37;;20886:18;;:::i;:::-;20924:10;;20920:20;;;;;20767:179;-1:-1:-1;;20767:179:1:o;20951:489::-;-1:-1:-1;;;;;21220:15:1;;;21202:34;;21272:15;;21267:2;21252:18;;21245:43;21319:2;21304:18;;21297:34;;;21367:3;21362:2;21347:18;;21340:31;;;21145:4;;21388:46;;21414:19;;21406:6;21388:46;:::i;:::-;21380:54;20951:489;-1:-1:-1;;;;;;20951:489:1:o;21445:249::-;21514:6;21567:2;21555:9;21546:7;21542:23;21538:32;21535:52;;;21583:1;21580;21573:12;21535:52;21615:9;21609:16;21634:30;21658:5;21634:30;:::i;21699:112::-;21730:1;21756;21746:35;;21761:18;;:::i;:::-;-1:-1:-1;21795:10:1;;21699:112::o;21816:265::-;21855:3;21883:9;;;21908:10;;-1:-1:-1;;;;;21927:27:1;;;21920:35;;21904:52;21901:78;;;21959:18;;:::i;:::-;-1:-1:-1;;;22006:19:1;;;21999:27;;21991:36;;21988:62;;;22030:18;;:::i;:::-;-1:-1:-1;;22066:9:1;;21816:265::o;22086:267::-;22125:4;22154:9;;;22179:10;;-1:-1:-1;;;22198:19:1;;22191:27;;22175:44;22172:70;;;22222:18;;:::i;:::-;-1:-1:-1;;;;;22269:27:1;;22262:35;;22254:44;;22251:70;;;22301:18;;:::i;:::-;-1:-1:-1;;22338:9:1;;22086:267::o;22358:712::-;22721:66;22716:3;22709:79;22827:24;22822:3;22818:34;22813:2;22808:3;22804:12;22797:56;22691:3;22882:6;22876:13;22898:60;22951:6;22946:2;22941:3;22937:12;22932:2;22924:6;22920:15;22898:60;:::i;:::-;-1:-1:-1;;;23017:2:1;22977:16;;;;23009:11;;;23002:35;-1:-1:-1;23061:2:1;23053:11;;22358:712;-1:-1:-1;22358:712:1:o;23075:617::-;-1:-1:-1;;;23426:47:1;;23496:13;;23408:3;;23518:62;23496:13;23568:2;23559:12;;23552:4;23540:17;;23518:62;:::i;:::-;-1:-1:-1;;;23639:2:1;23599:16;;;;23631:11;;;23624:35;-1:-1:-1;23683:2:1;23675:11;;23075:617;-1:-1:-1;23075:617:1:o;23697:1767::-;24212:3;24250:6;24244:13;24266:53;24312:6;24307:3;24300:4;24292:6;24288:17;24266:53;:::i;:::-;24350:6;24344:13;24366:68;24425:8;24416:6;24411:3;24407:16;24400:4;24392:6;24388:17;24366:68;:::i;:::-;24512:13;;24460:16;;;24456:31;;24534:57;24512:13;24456:31;24568:4;24556:17;;24534:57;:::i;:::-;24622:6;24616:13;24638:72;24701:8;24690;24683:5;24679:20;24672:4;24664:6;24660:17;24638:72;:::i;:::-;24792:13;;24736:20;;;;24732:35;;24814:57;24792:13;24732:35;24848:4;24836:17;;24814:57;:::i;:::-;24902:6;24896:13;24918:72;24981:8;24970;24963:5;24959:20;24952:4;24944:6;24940:17;24918:72;:::i;:::-;25072:13;;25016:20;;;;25012:35;;25094:57;25072:13;25012:35;25128:4;25116:17;;25094:57;:::i;:::-;25182:6;25176:13;25198:72;25261:8;25250;25243:5;25239:20;25232:4;25224:6;25220:17;25198:72;:::i;:::-;25349:13;;25293:20;;;;25289:35;;25371:54;25349:13;25289:35;25405:4;25393:17;;25371:54;:::i;:::-;25441:17;;23697:1767;-1:-1:-1;;;;;;;;;;;23697:1767:1:o;25469:1449::-;25888:3;25926:6;25920:13;25952:4;25965:51;26009:6;26004:3;25999:2;25991:6;25987:15;25965:51;:::i;:::-;26079:13;;26038:16;;;;26101:55;26079:13;26038:16;26123:15;;;26101:55;:::i;:::-;26223:13;;26178:20;;;26245:55;26223:13;26178:20;26267:15;;;26245:55;:::i;:::-;26367:13;;26322:20;;;26389:55;26367:13;26322:20;26411:15;;;26389:55;:::i;:::-;26511:13;;26466:20;;;26533:55;26511:13;26466:20;26555:15;;;26533:55;:::i;:::-;26655:13;;26610:20;;;26677:55;26655:13;26610:20;26699:15;;;26677:55;:::i;:::-;26799:13;;26754:20;;;26821:55;26799:13;26754:20;26843:15;;;26821:55;:::i;:::-;26892:20;;;;;25469:1449;-1:-1:-1;;;;;;;;;;25469:1449:1:o;26923:444::-;27155:3;27193:6;27187:13;27209:53;27255:6;27250:3;27243:4;27235:6;27231:17;27209:53;:::i;:::-;-1:-1:-1;;;27284:16:1;;27309:23;;;-1:-1:-1;27359:1:1;27348:13;;26923:444;-1:-1:-1;26923:444:1:o;27372:1755::-;28099:3;28137:6;28131:13;28153:53;28199:6;28194:3;28187:4;28179:6;28175:17;28153:53;:::i;:::-;-1:-1:-1;;;28228:16:1;;;28253:47;;;28325:13;;28347:66;28325:13;28399:2;28388:14;;28381:4;28369:17;;28347:66;:::i;:::-;-1:-1:-1;;;28476:2:1;28432:20;;;;28468:11;;;28461:65;28551:13;;28573:63;28551:13;28622:2;28614:11;;28607:4;28595:17;;28573:63;:::i;:::-;-1:-1:-1;;;28696:2:1;28655:17;;;;28688:11;;;28681:57;28763:13;;28785:63;28763:13;28834:2;28826:11;;28819:4;28807:17;;28785:63;:::i;:::-;-1:-1:-1;;;28908:2:1;28867:17;;;;28900:11;;;28893:76;28994:13;;29016:63;28994:13;29065:2;29057:11;;29050:4;29038:17;;29016:63;:::i;:::-;29099:17;29118:2;29095:26;;27372:1755;-1:-1:-1;;;;;;;27372:1755:1:o;29132:617::-;-1:-1:-1;;;29483:47:1;;29553:13;;29465:3;;29575:62;29553:13;29625:2;29616:12;;29609:4;29597:17;;29575:62;:::i;:::-;-1:-1:-1;;;29696:2:1;29656:16;;;;29688:11;;;29681:35;-1:-1:-1;29740:2:1;29732:11;;29132:617;-1:-1:-1;29132:617:1:o;29754:127::-;29815:10;29810:3;29806:20;29803:1;29796:31;29846:4;29843:1;29836:15;29870:4;29867:1;29860:15;30604:1147;-1:-1:-1;;;31152:49:1;;31224:13;;31134:3;;31246:62;31224:13;31296:2;31287:12;;31280:4;31268:17;;31246:62;:::i;:::-;-1:-1:-1;;;31367:2:1;31327:16;;;31359:11;;;31352:43;31420:13;;31442:63;31420:13;31491:2;31483:11;;31476:4;31464:17;;31442:63;:::i;:::-;-1:-1:-1;;;31565:2:1;31524:17;;;;31557:11;;;31550:43;31618:13;;31640:63;31618:13;31689:2;31681:11;;31674:4;31662:17;;31640:63;:::i;:::-;31723:17;31742:2;31719:26;;30604:1147;-1:-1:-1;;;;;30604:1147:1:o;31756:1579::-;32435:3;32473:6;32467:13;32489:53;32535:6;32530:3;32523:4;32515:6;32511:17;32489:53;:::i;:::-;-1:-1:-1;;;32564:16:1;;;32589:45;;;32659:13;;32681:65;32659:13;32733:1;32722:13;;32715:4;32703:17;;32681:65;:::i;:::-;-1:-1:-1;;;32809:1:1;32765:20;;;;32801:10;;;32794:52;32871:13;;32893:63;32871:13;32942:2;32934:11;;32927:4;32915:17;;32893:63;:::i;:::-;33021:66;33016:2;32975:17;;;;33008:11;;;33001:87;33113:13;;33135:63;33113:13;33184:2;33176:11;;33169:4;33157:17;;33135:63;:::i;:::-;-1:-1:-1;;;33258:2:1;33217:17;;;;33250:11;;;33243:59;33326:2;33318:11;;31756:1579;-1:-1:-1;;;;;;31756:1579:1:o;33340:1378::-;33918:3;33956:6;33950:13;33972:53;34018:6;34013:3;34006:4;33998:6;33994:17;33972:53;:::i;:::-;-1:-1:-1;;;34047:16:1;;;34072:45;;;34142:13;;34164:65;34142:13;34216:1;34205:13;;34198:4;34186:17;;34164:65;:::i;:::-;-1:-1:-1;;;34292:1:1;34248:20;;;;34284:10;;;34277:52;34354:13;;34376:63;34354:13;34425:2;34417:11;;34410:4;34398:17;;34376:63;:::i;:::-;-1:-1:-1;;;34499:2:1;34458:17;;;;34491:11;;;34484:76;34585:13;;34607:63;34585:13;34656:2;34648:11;;34641:4;34629:17;;34607:63;:::i;:::-;34690:17;34709:2;34686:26;;33340:1378;-1:-1:-1;;;;;;33340:1378:1:o;34723:1338::-;35253:3;35291:6;35285:13;35307:53;35353:6;35348:3;35341:4;35333:6;35329:17;35307:53;:::i;:::-;-1:-1:-1;;;35382:16:1;;;35407:61;;;35493:13;;35515:66;35493:13;35567:2;35556:14;;35549:4;35537:17;;35515:66;:::i;:::-;-1:-1:-1;;;35644:2:1;35600:20;;;;35636:11;;;35629:61;35715:13;;35737:63;35715:13;35786:2;35778:11;;35771:4;35759:17;;35737:63;:::i;:::-;35865:66;35860:2;35819:17;;;;35852:11;;;35845:87;35961:66;35956:2;35948:11;;35941:87;36052:2;36044:11;;34723:1338;-1:-1:-1;;;;;34723:1338:1:o;36066:2011::-;-1:-1:-1;;;36566:49:1;;36638:13;;36548:3;;36660:62;36638:13;36710:2;36701:12;;36694:4;36682:17;;36660:62;:::i;:::-;36786:66;36781:2;36741:16;;;36773:11;;;36766:87;36882:66;36877:2;36869:11;;36862:87;-1:-1:-1;;;36973:2:1;36965:11;;36958:67;37050:13;;37072:63;37050:13;37121:2;37113:11;;37106:4;37094:17;;37072:63;:::i;:::-;37200:66;37195:2;37154:17;;;;37187:11;;;37180:87;37297:66;37291:3;37283:12;;37276:88;37394:66;37388:3;37380:12;;37373:88;37491:66;37485:3;37477:12;;37470:88;37588:66;37582:3;37574:12;;37567:88;37685:66;37679:3;37671:12;;37664:88;37782:66;37776:3;37768:12;;37761:88;37879:66;37873:3;37865:12;;37858:88;37976:66;37970:3;37962:12;;37955:88;38067:3;38059:12;;36066:2011;-1:-1:-1;;;;36066:2011:1:o;38082:1252::-;-1:-1:-1;;;38433:49:1;;38505:13;;38415:3;;38527:62;38505:13;38577:2;38568:12;;38561:4;38549:17;;38527:62;:::i;:::-;38653:66;38648:2;38608:16;;;;38640:11;;;38633:87;-1:-1:-1;38749:66:1;38744:2;38736:11;;38729:87;38845:66;38840:2;38832:11;;38825:87;38942:66;38936:3;38928:12;;38921:88;39039:66;39033:3;39025:12;;39018:88;39136:66;39130:3;39122:12;;39115:88;39233:66;39227:3;39219:12;;39212:88;39324:3;39316:12;;38082:1252;-1:-1:-1;38082:1252:1:o;39339:2016::-;-1:-1:-1;;;39988:49:1;;40060:13;;39970:3;;40082:62;40060:13;40132:2;40123:12;;40116:4;40104:17;;40082:62;:::i;:::-;40208:66;40203:2;40163:16;;;40195:11;;;40188:87;40304:66;40299:2;40291:11;;40284:87;40400:66;40395:2;40387:11;;40380:87;40497:66;40491:3;40483:12;;40476:88;40589:13;;40611:64;40589:13;40660:3;40652:12;;40645:4;40633:17;;40611:64;:::i;:::-;-1:-1:-1;;;40735:3:1;40694:17;;;;40727:12;;;40720:66;40811:13;;40833:64;40811:13;40882:3;40874:12;;40867:4;40855:17;;40833:64;:::i;:::-;40963:66;40957:3;40916:17;;;;40949:12;;;40942:88;41060:66;41054:3;41046:12;;41039:88;41157:66;41151:3;41143:12;;41136:88;41254:66;41248:3;41240:12;;41233:88;41345:3;41337:12;;39339:2016;-1:-1:-1;;;;;39339:2016:1:o;41360:1705::-;-1:-1:-1;;;42105:64:1;;42192:13;;42087:3;;42214:62;42192:13;42264:2;42255:12;;42248:4;42236:17;;42214:62;:::i;:::-;42336:13;;42295:16;;;;42358:63;42336:13;42407:2;42399:11;;42392:4;42380:17;;42358:63;:::i;:::-;-1:-1:-1;;;42481:2:1;42440:17;;;;42473:11;;;42466:43;42534:13;;42556:63;42534:13;42605:2;42597:11;;42590:4;42578:17;;42556:63;:::i;:::-;-1:-1:-1;;;42679:2:1;42638:17;;;;42671:11;;;42664:45;42734:13;;42756:63;42734:13;42805:2;42797:11;;42790:4;42778:17;;42756:63;:::i;:::-;-1:-1:-1;;;42879:2:1;42838:17;;;;42871:11;;;42864:43;42932:13;;42954:63;42932:13;43003:2;42995:11;;42988:4;42976:17;;42954:63;:::i;:::-;43037:17;43056:2;43033:26;;41360:1705;-1:-1:-1;;;;;;;41360:1705:1:o;43070:1623::-;43590:3;43628:6;43622:13;43654:4;43667:51;43711:6;43706:3;43701:2;43693:6;43689:15;43667:51;:::i;:::-;43781:13;;43740:16;;;;43803:55;43781:13;43740:16;43825:15;;;43803:55;:::i;:::-;43925:13;;43880:20;;;43947:55;43925:13;43880:20;43969:15;;;43947:55;:::i;:::-;44069:13;;44024:20;;;44091:55;44069:13;44024:20;44113:15;;;44091:55;:::i;:::-;44213:13;;44168:20;;;44235:55;44213:13;44168:20;44257:15;;;44235:55;:::i;:::-;44357:13;;44312:20;;;44379:55;44357:13;44312:20;44401:15;;;44379:55;:::i;:::-;44501:13;;44456:20;;;44523:55;44501:13;44456:20;44545:15;;;44523:55;:::i;:::-;-1:-1:-1;;;44600:20:1;;44629:29;;;-1:-1:-1;44685:1:1;44674:13;;43070:1623;-1:-1:-1;;;;;;;;;43070:1623:1:o;44698:1350::-;45359:66;45354:3;45347:79;45329:3;45455:6;45449:13;45471:62;45526:6;45521:2;45516:3;45512:12;45505:4;45497:6;45493:17;45471:62;:::i;:::-;-1:-1:-1;;;45592:2:1;45552:16;;;45584:11;;;45577:37;45639:13;;45661:63;45639:13;45710:2;45702:11;;45695:4;45683:17;;45661:63;:::i;:::-;-1:-1:-1;;;45784:2:1;45743:17;;;;45776:11;;;45769:53;45847:13;;45869:63;45847:13;45918:2;45910:11;;45903:4;45891:17;;45869:63;:::i;:::-;-1:-1:-1;;;45992:2:1;45951:17;;;;45984:11;;;45977:38;46039:2;46031:11;;44698:1350;-1:-1:-1;;;;;44698:1350:1:o;46053:1701::-;-1:-1:-1;;;46851:64:1;;46938:13;;46833:3;;46960:62;46938:13;47010:2;47001:12;;46994:4;46982:17;;46960:62;:::i;:::-;-1:-1:-1;;;47081:2:1;47041:16;;;47073:11;;;47066:43;47134:13;;47156:63;47134:13;47205:2;47197:11;;47190:4;47178:17;;47156:63;:::i;:::-;-1:-1:-1;;;47279:2:1;47238:17;;;;47271:11;;;47264:43;47332:13;;47354:63;47332:13;47403:2;47395:11;;47388:4;47376:17;;47354:63;:::i;:::-;-1:-1:-1;;;47477:2:1;47436:17;;;;47469:11;;;47462:51;47538:13;;47560:63;47538:13;47609:2;47601:11;;47594:4;47582:17;;47560:63;:::i;:::-;-1:-1:-1;;;47683:2:1;47642:17;;;;47675:11;;;47668:53;47745:2;47737:11;;46053:1701;-1:-1:-1;;;;;;46053:1701:1:o;47759:644::-;48039:3;48077:6;48071:13;48093:53;48139:6;48134:3;48127:4;48119:6;48115:17;48093:53;:::i;:::-;48209:13;;48168:16;;;;48231:57;48209:13;48168:16;48265:4;48253:17;;48231:57;:::i;:::-;-1:-1:-1;;;48310:20:1;;48339:29;;;48395:1;48384:13;;47759:644;-1:-1:-1;;;;47759:644:1:o;48408:576::-;-1:-1:-1;;;48766:3:1;48759:20;48741:3;48808:6;48802:13;48824:61;48878:6;48874:1;48869:3;48865:11;48858:4;48850:6;48846:17;48824:61;:::i;:::-;-1:-1:-1;;;48944:1:1;48904:16;;;;48936:10;;;48929:23;-1:-1:-1;48976:1:1;48968:10;;48408:576;-1:-1:-1;48408:576:1:o;48989:1015::-;-1:-1:-1;;;49489:57:1;;49569:13;;49471:3;;49591:62;49569:13;49641:2;49632:12;;49625:4;49613:17;;49591:62;:::i;:::-;-1:-1:-1;;;49712:2:1;49672:16;;;49704:11;;;49697:45;49767:13;;49789:63;49767:13;49838:2;49830:11;;49823:4;49811:17;;49789:63;:::i;:::-;-1:-1:-1;;;49912:2:1;49871:17;;;;49904:11;;;49897:74;49995:2;49987:11;;48989:1015;-1:-1:-1;;;;48989:1015:1:o;50009:1329::-;-1:-1:-1;;;50658:51:1;;50732:13;;50640:3;;50754:62;50732:13;50804:2;50795:12;;50788:4;50776:17;;50754:62;:::i;:::-;-1:-1:-1;;;50875:2:1;50835:16;;;50867:11;;;50860:45;50930:13;;50952:63;50930:13;51001:2;50993:11;;50986:4;50974:17;;50952:63;:::i;:::-;-1:-1:-1;;;51075:2:1;51034:17;;;;51067:11;;;51060:45;51130:13;;51152:63;51130:13;51201:2;51193:11;;51186:4;51174:17;;51152:63;:::i;:::-;-1:-1:-1;;;51275:2:1;51234:17;;;;51267:11;;;51260:45;51329:2;51321:11;;50009:1329;-1:-1:-1;;;;;50009:1329:1:o;51343:1721::-;52070:3;52108:6;52102:13;52124:53;52170:6;52165:3;52158:4;52150:6;52146:17;52124:53;:::i;:::-;52240:13;;52199:16;;;;52262:57;52240:13;52199:16;52296:4;52284:17;;52262:57;:::i;:::-;-1:-1:-1;;;52341:20:1;;52370:43;;;52438:13;;52460:65;52438:13;52512:1;52501:13;;52494:4;52482:17;;52460:65;:::i;:::-;-1:-1:-1;;;52588:1:1;52544:20;;;;52580:10;;;52573:52;52650:13;;52672:63;52650:13;52721:2;52713:11;;52706:4;52694:17;;52672:63;:::i;:::-;-1:-1:-1;;;52795:2:1;52754:17;;;;52787:11;;;52780:55;52860:13;;52882:63;52860:13;52931:2;52923:11;;52916:4;52904:17;;52882:63;:::i;:::-;-1:-1:-1;;;53005:2:1;52964:17;;;;52997:11;;;52990:41;53055:2;53047:11;;51343:1721;-1:-1:-1;;;;;;;51343:1721:1:o;53069:136::-;53104:3;-1:-1:-1;;;53125:22:1;;53122:48;;;53150:18;;:::i;:::-;-1:-1:-1;53190:1:1;53186:13;;53069:136::o;53210:418::-;-1:-1:-1;;;53467:3:1;53460:16;53442:3;53505:6;53499:13;53521:61;53575:6;53571:1;53566:3;53562:11;53555:4;53547:6;53543:17;53521:61;:::i

Swarm Source

ipfs://da0310f70aadf921a1c99d85a02222088d2df875c139cabbba7ff976c9433555
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.