ETH Price: $2,627.14 (+1.62%)
Gas: 1 Gwei

Token

Morse Code NFT (MORSECODE)
 

Overview

Max Total Supply

2 MORSECODE

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jakopo.eth
Balance
1 MORSECODE
0x99A5A6010e81d3Efa13d5832043E9C3B6c11Ef3d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MorseCodeNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-14
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

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





/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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














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

//developed by @jacmos3
contract MorseCodeNFT is ERC721Enumerable, ReentrancyGuard, Ownable {

    string constant private ERR_MINTING_PAUSED = "Minting paused";
    string constant private ERR_ALREADY_MINTED = "Someone already minted this text";
    string constant private ERR_INSERT_EXACT = "Exact value required";
    string constant private ERR_NUMBER_OUT = "Number out of range";
    string constant private ERR_COLOR = "Color not valid or same colors";
    string constant private ERR_COLOR_SIZE = "Color size wrong";
    string constant private ERR_NOT_EXISTS = "Selected tokenId does not exist";
    string constant private ERR_INPUT_NOT_VALID = "Input not valid. Remove not valid chars";
    string constant private ERR_TOO_MANY = "Too many inputs";

    struct Detail{
        string text;
        address mintedBy;
        Personalization personalization;
    }

    struct Personalization{
        string colorOff;
        string colorOn;
        uint32 unit;
        uint32 height;
        uint32 width;
        uint8 level;
    }

    struct Status{
        uint32 mintingThreshold;
        uint32 maxLen;
        uint256 editsPrice;
        uint256 mintPriceOverThreshold;
        address treasurer;
        bool paused;
        string externalUrl;
    }

    Status public status;

    mapping (uint256 => Detail) public details;
    mapping(string => string) public charsMapping;
    event Minting(address indexed sender, uint256 indexed tokenId, uint256 msgValue);
    event Withdraw(address indexed owner, address indexed trasurer, uint256 amount);
    event NewTreasurer(address indexed oldTreasurer, address indexed newTreasurer);
    event Paused(bool paused);
    event mappingModified(string[] newLetters, string[] newTranslations);
    event letterDeleted(string letter, string indexed translation);
    event requirementsChanged(uint256 indexed editPrices, uint256 indexed mintingThreshold, uint256 indexed mintPriceOverThreshold);
    event colorChanged(uint256[] indexed tokenIdArray, string colorOn, string colorOff);
    event unitChanged(uint256[] indexed tokenIdArray, uint256 unit);
    event sizeChanged(uint256[] indexed tokenIdArray, uint256 height, uint256 width);
    event externalUrlChanged(string indexed externalUrl);

    constructor() ERC721("Morse Code NFT", "MORSECODE") Ownable(){
        status = Status({editsPrice: 10**16, mintPriceOverThreshold: 10**15, treasurer: msg.sender, paused: false, mintingThreshold: 15, maxLen: 100, externalUrl:""});
        charsMapping["a"] = ".-";
        charsMapping["b"] = "-...";
        charsMapping["c"] = "-.-.";
        charsMapping["d"] = "-..";
        charsMapping["e"] = ".";
        charsMapping["f"] = "..-.";
        charsMapping["g"] = "--.";
        charsMapping["h"] = "....";
        charsMapping["i"] = "..";
        charsMapping["j"] = ".---";
        charsMapping["k"] = "-.-";
        charsMapping["l"] = ".-..";
        charsMapping["m"] = "--";
        charsMapping["n"] = "-.";
        charsMapping["o"] = "---";
        charsMapping["p"] = ".--.";
        charsMapping["q"] = "--.-";
        charsMapping["r"] = ".-.";
        charsMapping["s"] = "...";
        charsMapping["t"] = "-";
        charsMapping["u"] = "..-";
        charsMapping["v"] = "...-";
        charsMapping["w"] = ".--";
        charsMapping["x"] = "-..-";
        charsMapping["y"] = "-.--";
        charsMapping["z"] = "--..";
        charsMapping[" "] = "/";
        charsMapping["0"] = "-----";
        charsMapping["1"] = ".----";
        charsMapping["2"] = "..---";
        charsMapping["3"] = "...--";
        charsMapping["4"] = "....-";
        charsMapping["5"] = ".....";
        charsMapping["6"] = "-....";
        charsMapping["7"] = "--...";
        charsMapping["8"] = "---..";
        charsMapping["9"] = "----.";
        charsMapping["."] = ".-.-.-";
        charsMapping[","] = "--..--";
        charsMapping["?"] = "..--..";
        charsMapping["!"] = "-.-.--";
        charsMapping["-"] = "-....-";
        charsMapping["/"] = "-..-.";
        charsMapping["@"] = ".--.-.";
        charsMapping["("] = "-.--.";
        charsMapping[")"] = "-.--.-";
        charsMapping[":"] = "---...";
        charsMapping[";"] = "-.-.-.";
        charsMapping["="] = "-...-";
        charsMapping["+"] = ".-.-.";
        charsMapping["_"] = "..--.-";
        charsMapping["$"] = "...-..-";
        charsMapping["'"] = ".----.";
        charsMapping["\""] = ".-..-.";
        charsMapping["*"] = "-..-";
        charsMapping["#"] = "...-.-";
    }

    function claimByOwner(string memory _text) external onlyOwner nonReentrant{
        process(_text, true);
    }

    function claimByPatrons(string memory _text) external payable nonReentrant {
        process(_text, false);
    }

    function translate (string memory _text) public view returns (string memory) {
        string memory traduction = "";
        bytes memory b = bytes(_toLower(_text));
        for (uint i; i < b.length; i++) {
            traduction =  string.concat(traduction, charsMapping[string(abi.encodePacked(b[i]))], " " );
        }
        return traduction;
    }

    function buildSVGAnimation (uint256 _tokenId, string memory _translation) public view returns (string memory){
        Personalization memory personalization = details[_tokenId].personalization;
        uint32 unit = personalization.unit;
        uint32 duration = 0;
        bytes memory b = bytes(_translation);

        uint32 delay = 0;
        uint32 count = 0;
        uint32 i = 0;
        uint32 len = b.length < status.maxLen ? uint32(b.length) : status.maxLen;
        string memory middle = "";
        for (uint32 j = 1; j <= len; j++) {
            i = j % len;

            if (keccak256(abi.encodePacked(b[i])) == keccak256("-")){
                duration = unit * 3;
                count++;
            }
            else
            if (keccak256(abi.encodePacked(b[i])) == keccak256(".")){
                duration = unit * 1;
                count++;
            }
            else
            if (keccak256(abi.encodePacked(b[i])) == keccak256("/")){
                duration = unit * 1;
                delay += duration;
                continue;
            }
            else
            if (keccak256(abi.encodePacked(b[i])) == keccak256(" ")){
                duration = unit * 3;
                delay += duration;
                continue;
            }

            string memory slice1 = string.concat("<animate attributeName='fill' ","values='",personalization.colorOn,"' dur='",toString(duration),"ms' begin='");
            string memory slice2 = "";
            if (i == 0){
                slice2 = string.concat(toString(unit),"ms;a",toString(count - 1),".end+",toString(unit * 14 + delay),"ms' id='a0'/>");
                middle = string.concat(slice1, slice2, middle);
            }
            else{
                slice2 = string.concat("a",toString(count-1),".end+",toString(unit + delay),"ms' id='a",toString(count),"'/>");
                middle = string.concat(middle, slice1, slice2);
            }

            delay = 0;
        }

        return compose(middle, personalization);
    }

    function compose(string memory middle, Personalization memory personalization) pure internal returns (string memory){
        string memory begin = string.concat("<svg data-v-20872046='' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 "
        ,toString(personalization.width)
        ," "
        ,toString(personalization.height)
        ,"' xml:space='preserve' id='drawing'><rect x='0' y='0' width='"
        ,toString(personalization.width)
        ,"' height='"
        ,toString(personalization.height)
        ,"' fill='"
        ,personalization.colorOff
        ,"' >");
        string memory end = "</rect></svg>";
        return string.concat(begin, middle, end);
    }

    function process(string memory _text, bool _owner) internal {
        require(!status.paused, ERR_MINTING_PAUSED);
        for (uint256 i = 1; i <= totalSupply(); i++){
            require(keccak256(abi.encodePacked(details[i].text)) != keccak256(abi.encodePacked(_text)), ERR_ALREADY_MINTED);
        }
        uint256 _len = bytes(_text).length;
        require (_len > 0 && _len < status.maxLen);
        uint256 _tokenId = totalSupply() + 1;
        address _sender = _msgSender();
        require(tx.origin == _sender);
        uint256 _msgValue = msg.value;


        if (_len > status.mintingThreshold && !_owner ){
            require(_msgValue == _len * status.mintPriceOverThreshold, ERR_INSERT_EXACT);
        }

        require (sanitize(_text),ERR_INPUT_NOT_VALID);

        details[_tokenId] = Detail({text: _text, mintedBy: _sender, personalization: Personalization({colorOff:"white", colorOn: "black", unit: 200, height: 350, width: 350, level: 0})});

        emit Minting(_sender, _tokenId, _msgValue);
        _safeMint(_sender, _tokenId);
    }

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        require(_tokenId <= totalSupply(), ERR_NOT_EXISTS);
        string memory text = details[_tokenId].text;
        string memory translation = translate(text);
        string memory svg = buildSVGAnimation(_tokenId, translation);
        string memory url = "";
        if (keccak256(abi.encodePacked(status.externalUrl)) != keccak256("")){
            url = string.concat('"external_url" : {"type": "string", "description":"',status.externalUrl,'/',toString(_tokenId),'"},');
        }
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{','"title": "Morse Code #', toString(_tokenId), '", "type": "object", "properties": {',url,'"name":{"type":"string", "description":"',text,'"},"description":{"type":"string", "description":"Morse code: ',translation,'"},"image":{ "type":"string", "description":"data:image/svg+xml;base64,', Base64.encode(bytes(svg)), '"}', attributes(_tokenId)))));

        return string(abi.encodePacked('data:application/json;base64,', json));
    }

    function attributes(uint256 _tokenId) internal view returns (string memory){
        Personalization memory personalization = details[_tokenId].personalization;
        string[3] memory parts;
        parts[0] = string.concat('{"trait_type":"Slash", "value":',toString(personalization.unit * 7),', "display_type":"number"}, {"trait_type":"Dit", "value":',toString(personalization.unit * 1),', "display_type":"number"}, {"trait_type":"Dah", "value":',toString(personalization.unit * 3),', "display_type":"number"}');
        parts[1] = string.concat(',{"trait_type":"Color OFF", "value":"',personalization.colorOff,'"}, {"trait_type":"Color ON", "value":"',personalization.colorOn,'"}, {"trait_type":"height", "value":',toString(personalization.height),', "display_type":"number"}, {"trait_type":"width", "value":',toString(personalization.width),', "display_type":"number"}');
        parts[2] = string.concat(',{"trait_type":"ID","value":',toString(_tokenId),', "display_type":"number"}, {"trait_type":"Length","value":',toString(bytes(details[_tokenId].text).length),', "display_type":"number"}, {"trait_type":"Level","value":',toString(personalization.level),', "display_type":"number"}, {"trait_type":"Minted by","value":"',toAsciiString(details[_tokenId].mintedBy),'"}');

        return string.concat(',"attributes":[',parts[0],parts[1],parts[2],']}}');
    }

    function validateColor(string memory color) pure internal returns (bool){
        uint8 allowedChars = 0;
        bytes memory allowed = bytes("abcdefABCDEF0123456789");
        bytes memory byteString = bytes(color);
        require (byteString.length == 7, ERR_COLOR_SIZE);

        for(uint256 i = 1; i < byteString.length; i++){
           for(uint8 j=0; j < allowed.length; j++){
              if(byteString[i] == allowed[j]){
                allowedChars++;
                break;
              }
           }
        }

        return allowedChars == byteString.length -1;
    }

    function changeHexColors(uint256[] memory _tokenIdArray, string memory _colorOn, string memory _colorOff) external payable {
        require(!status.paused, ERR_MINTING_PAUSED);
        require(msg.value == _tokenIdArray.length * status.editsPrice, ERR_INSERT_EXACT);
        require(keccak256(abi.encodePacked(_colorOn)) != keccak256(abi.encodePacked(_colorOff)) && validateColor(_colorOn) && validateColor(_colorOff), ERR_COLOR);

        for (uint256 i = 0; i < _tokenIdArray.length; i++){
            uint256 tokenId = _tokenIdArray[i];
            if (ownerOf(tokenId) == msg.sender){
                details[tokenId].personalization.colorOff = _colorOff;
                details[tokenId].personalization.colorOn = _colorOn;
                details[tokenId].personalization.level += 10;
            }
        }

        emit colorChanged(_tokenIdArray, _colorOn, _colorOff);
    }

    function changeUnit(uint256[] memory _tokenIdArray, uint32 _unit) external payable {
        require(!status.paused, ERR_MINTING_PAUSED);
        require(msg.value == _tokenIdArray.length * status.editsPrice, ERR_INSERT_EXACT);
        require (_unit > 0 && _unit < 100000, ERR_NUMBER_OUT);
        for (uint256 i = 0; i < _tokenIdArray.length; i++){
            uint256 tokenId = _tokenIdArray[i];
            if (ownerOf(tokenId) == msg.sender){
                details[tokenId].personalization.unit = _unit;
                details[tokenId].personalization.level++;
            }
        }
        emit unitChanged(_tokenIdArray, _unit);
    }

    function changeSize(uint256[] memory _tokenIdArray, uint32 _height, uint32 _width) external payable {
        require(!status.paused, ERR_MINTING_PAUSED);
        require(_height > 100 && _height < 100000 && _width > 100 && _width < 100000 &&_tokenIdArray.length > 0, ERR_NUMBER_OUT);
        require(msg.value == (_tokenIdArray.length * _height * _width * status.editsPrice) / 10000, ERR_INSERT_EXACT);
        for (uint256 i = 0; i < _tokenIdArray.length; i++){
            uint256 tokenId = _tokenIdArray[i];
            if (ownerOf(tokenId) == msg.sender){
                details[tokenId].personalization.height = _height;
                details[tokenId].personalization.width = _width;
                details[tokenId].personalization.level += 100;
            }
        }
        emit sizeChanged(_tokenIdArray, _height, _width);
    }

    function withdraw() external onlyOwner {
        uint256 amount = address(this).balance;
        payable(status.treasurer).transfer(amount);
        emit Withdraw(msg.sender, status.treasurer, amount);
    }

    function setTreasurer(address _newAddress) external onlyOwner{
        emit NewTreasurer(status.treasurer, _newAddress);
        status.treasurer = _newAddress;
    }

    function pauseUnpause() external onlyOwner{
        status.paused = !status.paused;
        emit Paused(status.paused);
    }

    function changeExternalUrl(string memory _externalUrl) external onlyOwner{
        status.externalUrl = _externalUrl;
        emit externalUrlChanged(_externalUrl);
    }

    function changeRequirements(uint256 _editsPrice, uint32 _mintingThreshold, uint256 _mintPriceOverThreshold, uint32 _maxLen) external onlyOwner{
        // if ALL of them are 0 then consider it
        if( _editsPrice == 0 && _mintingThreshold == 0 && _mintPriceOverThreshold == 0 && _maxLen == 0){
            status.editsPrice = 0;
            status.mintingThreshold = 0;
            status.mintPriceOverThreshold = 0;
            status.maxLen = 0;
        }
        else{
            //elseif only consider the non-zero values
            if (_editsPrice > 0){
                status.editsPrice = _editsPrice;
            }
            if (_mintingThreshold > 0){
                status.mintingThreshold = _mintingThreshold;
            }
            if (_mintPriceOverThreshold > 0){
                status.mintPriceOverThreshold = _mintPriceOverThreshold;
            }
            if (_maxLen > 0){
                status.maxLen = _maxLen;
            }
        }

        emit requirementsChanged(_editsPrice, _mintingThreshold, _mintPriceOverThreshold);
    }

    function sanitize(string memory input) internal view returns(bool){
        bytes memory byteString = bytes(input);
        for(uint8 i=0; i < byteString.length; i++){
             if( keccak256(abi.encodePacked("")) == keccak256(abi.encodePacked(charsMapping[_toLower(string(abi.encodePacked(byteString[i])))]))){
                return false;
             }
        }
        return true;
    }

    function modifyMapping(string[] memory letters, string[] memory translations) external onlyOwner {
        require (letters.length == translations.length);
        for (uint i = 0; i < letters.length; i++) {
            charsMapping[letters[i]] = translations[i];
        }
        emit mappingModified(letters, translations);
    }

    // if some char needs to be deleted
    function deleteLetter(string memory letter) external onlyOwner {
        emit letterDeleted(letter, charsMapping[letter]);
        delete charsMapping[letter];
    }

    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);
        }
        return string(s);
    }

    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }

    function _toLower(string memory str) internal pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint i = 0; i < bStr.length; i++) {
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }
}

/// [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":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"Minting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTreasurer","type":"address"},{"indexed":true,"internalType":"address","name":"newTreasurer","type":"address"}],"name":"NewTreasurer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"trasurer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[]","name":"tokenIdArray","type":"uint256[]"},{"indexed":false,"internalType":"string","name":"colorOn","type":"string"},{"indexed":false,"internalType":"string","name":"colorOff","type":"string"}],"name":"colorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"externalUrl","type":"string"}],"name":"externalUrlChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"letter","type":"string"},{"indexed":true,"internalType":"string","name":"translation","type":"string"}],"name":"letterDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"newLetters","type":"string[]"},{"indexed":false,"internalType":"string[]","name":"newTranslations","type":"string[]"}],"name":"mappingModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"editPrices","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"mintingThreshold","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"mintPriceOverThreshold","type":"uint256"}],"name":"requirementsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[]","name":"tokenIdArray","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"height","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"width","type":"uint256"}],"name":"sizeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256[]","name":"tokenIdArray","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"unit","type":"uint256"}],"name":"unitChanged","type":"event"},{"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"},{"internalType":"string","name":"_translation","type":"string"}],"name":"buildSVGAnimation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_externalUrl","type":"string"}],"name":"changeExternalUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdArray","type":"uint256[]"},{"internalType":"string","name":"_colorOn","type":"string"},{"internalType":"string","name":"_colorOff","type":"string"}],"name":"changeHexColors","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editsPrice","type":"uint256"},{"internalType":"uint32","name":"_mintingThreshold","type":"uint32"},{"internalType":"uint256","name":"_mintPriceOverThreshold","type":"uint256"},{"internalType":"uint32","name":"_maxLen","type":"uint32"}],"name":"changeRequirements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdArray","type":"uint256[]"},{"internalType":"uint32","name":"_height","type":"uint32"},{"internalType":"uint32","name":"_width","type":"uint32"}],"name":"changeSize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIdArray","type":"uint256[]"},{"internalType":"uint32","name":"_unit","type":"uint32"}],"name":"changeUnit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"charsMapping","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_text","type":"string"}],"name":"claimByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_text","type":"string"}],"name":"claimByPatrons","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"letter","type":"string"}],"name":"deleteLetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"details","outputs":[{"internalType":"string","name":"text","type":"string"},{"internalType":"address","name":"mintedBy","type":"address"},{"components":[{"internalType":"string","name":"colorOff","type":"string"},{"internalType":"string","name":"colorOn","type":"string"},{"internalType":"uint32","name":"unit","type":"uint32"},{"internalType":"uint32","name":"height","type":"uint32"},{"internalType":"uint32","name":"width","type":"uint32"},{"internalType":"uint8","name":"level","type":"uint8"}],"internalType":"struct MorseCodeNFT.Personalization","name":"personalization","type":"tuple"}],"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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"letters","type":"string[]"},{"internalType":"string[]","name":"translations","type":"string[]"}],"name":"modifyMapping","outputs":[],"stateMutability":"nonpayable","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":"pauseUnpause","outputs":[],"stateMutability":"nonpayable","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setTreasurer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint32","name":"mintingThreshold","type":"uint32"},{"internalType":"uint32","name":"maxLen","type":"uint32"},{"internalType":"uint256","name":"editsPrice","type":"uint256"},{"internalType":"uint256","name":"mintPriceOverThreshold","type":"uint256"},{"internalType":"address","name":"treasurer","type":"address"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"string","name":"externalUrl","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"string","name":"_text","type":"string"}],"name":"translate","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020016d135bdc9cd94810dbd9194813919560921b815250604051806040016040528060098152602001684d4f525345434f444560b81b81525081600090816200006c919062001175565b5060016200007b828262001175565b50506001600a55506200008e336200107e565b6040805160e081018252600f80825260646020808401918252662386f26fc1000084860190815266038d7ea4c68000606086019081523360808701908152600060a088018181528951958601909952845260c087018490528651600c8054965163ffffffff908116640100000000026001600160401b03199098169216919091179590951785559151600d5551600e5551835495511515600160a01b026001600160a81b03199096166001600160a01b0391909116179490941790915590916010906200015c908262001175565b505060408051808201825260028152612e2d60f01b60208201528151606160f81b8152601260018201529151918290036021019091209150620001a0908262001175565b5060408051808201825260048152631697171760e11b60208201528151603160f91b81526012600182015291519182900360210190912090620001e4908262001175565b5060408051808201825260048152631697169760e11b60208201528151606360f81b8152601260018201529151918290036021019091209062000228908262001175565b50604080518082018252600381526216971760e91b60208201528151601960fa1b815260126001820152915191829003602101909120906200026b908262001175565b50604051806040016040528060018152602001601760f91b81525060126040516200029d90606560f81b815260010190565b90815260200160405180910390209081620002b9919062001175565b5060408051808201825260048152631717169760e11b60208201528151603360f91b81526012600182015291519182900360210190912090620002fd908262001175565b50604080518082018252600381526216969760e91b60208201528151606760f81b8152601260018201529151918290036021019091209062000340908262001175565b5060408051808201825260048152631717171760e11b60208201528151600d60fb1b8152601260018201529151918290036021019091209062000384908262001175565b506040805180820182526002815261171760f11b60208201528151606960f81b81526012600182015291519182900360210190912090620003c6908262001175565b5060408051808201825260048152632e2d2d2d60e01b60208201528151603560f91b815260126001820152915191829003602101909120906200040a908262001175565b5060408051808201825260038152622d2e2d60e81b60208201528151606b60f81b815260126001820152915191829003602101909120906200044d908262001175565b5060408051808201825260048152631716971760e11b60208201528151601b60fa1b8152601260018201529151918290036021019091209062000491908262001175565b5060408051808201825260028152612d2d60f01b60208201528151606d60f81b81526012600182015291519182900360210190912090620004d3908262001175565b506040805180820182526002815261169760f11b60208201528151603760f91b8152601260018201529151918290036021019091209062000515908262001175565b5060408051808201825260038152622d2d2d60e81b60208201528151606f60f81b8152601260018201529151918290036021019091209062000558908262001175565b5060408051808201825260048152631716969760e11b60208201528151600760fc1b815260126001820152915191829003602101909120906200059c908262001175565b5060408051808201825260048152632d2d2e2d60e01b60208201528151607160f81b81526012600182015291519182900360210190912090620005e0908262001175565b50604080518082018252600381526217169760e91b60208201528151603960f91b8152601260018201529151918290036021019091209062000623908262001175565b50604080518082018252600381526217171760e91b60208201528151607360f81b8152601260018201529151918290036021019091209062000666908262001175565b50604051806040016040528060018152602001602d60f81b81525060126040516200069890601d60fa1b815260010190565b90815260200160405180910390209081620006b4919062001175565b5060408051808201825260038152622e2e2d60e81b60208201528151607560f81b81526012600182015291519182900360210190912090620006f7908262001175565b5060408051808201825260048152632e2e2e2d60e01b60208201528151603b60f91b815260126001820152915191829003602101909120906200073b908262001175565b5060408051808201825260038152622e2d2d60e81b60208201528151607760f81b815260126001820152915191829003602101909120906200077e908262001175565b5060408051808201825260048152632d2e2e2d60e01b60208201528151600f60fb1b81526012600182015291519182900360210190912090620007c2908262001175565b5060408051808201825260048152632d2e2d2d60e01b60208201528151607960f81b8152601260018201529151918290036021019091209062000806908262001175565b5060408051808201825260048152631696971760e11b60208201528151603d60f91b815260126001820152915191829003602101909120906200084a908262001175565b50604051806040016040528060018152602001602f60f81b81525060126040516200087c90600160fd1b815260010190565b9081526020016040518091039020908162000898919062001175565b5060408051808201825260058152642d2d2d2d2d60d81b60208201528151600360fc1b81526012600182015291519182900360210190912090620008dd908262001175565b5060408051808201825260058152642e2d2d2d2d60d81b60208201528151603160f81b8152601260018201529151918290036021019091209062000922908262001175565b5060408051808201825260058152642e2e2d2d2d60d81b60208201528151601960f91b8152601260018201529151918290036021019091209062000967908262001175565b5060408051808201825260058152642e2e2e2d2d60d81b60208201528151603360f81b81526012600182015291519182900360210190912090620009ac908262001175565b5060408051808201825260058152642e2e2e2e2d60d81b60208201528151600d60fa1b81526012600182015291519182900360210190912090620009f1908262001175565b506040805180820182526005815264171717171760d91b60208201528151603560f81b8152601260018201529151918290036021019091209062000a36908262001175565b506040805180820182526005815264169717171760d91b60208201528151601b60f91b8152601260018201529151918290036021019091209062000a7b908262001175565b506040805180820182526005815264169697171760d91b60208201528151603760f81b8152601260018201529151918290036021019091209062000ac0908262001175565b506040805180820182526005815264169696971760d91b60208201528151600760fb1b8152601260018201529151918290036021019091209062000b05908262001175565b506040805180820182526005815264169696969760d91b60208201528151603960f81b8152601260018201529151918290036021019091209062000b4a908262001175565b5060408051808201825260068152652e2d2e2d2e2d60d01b60208201528151601760f91b8152601260018201529151918290036021019091209062000b90908262001175565b5060408051808201825260068152652d2d2e2e2d2d60d01b60208201528151600b60fa1b8152601260018201529151918290036021019091209062000bd6908262001175565b50604080518082018252600681526517171696971760d11b60208201528151603f60f81b8152601260018201529151918290036021019091209062000c1c908262001175565b5060408051808201825260068152652d2e2d2e2d2d60d01b60208201528151602160f81b8152601260018201529151918290036021019091209062000c62908262001175565b5060408051808201825260068152652d2e2e2e2e2d60d01b60208201528151602d60f81b8152601260018201529151918290036021019091209062000ca8908262001175565b506040805180820182526005815264169717169760d91b60208201528151602f60f81b8152601260018201529151918290036021019091209062000ced908262001175565b50604080518082018252600681526517169697169760d11b60208201528151600160fe1b8152601260018201529151918290036021019091209062000d33908262001175565b506040805180820182526005815264169716969760d91b60208201528151600560fb1b8152601260018201529151918290036021019091209062000d78908262001175565b5060408051808201825260068152652d2e2d2d2e2d60d01b60208201528151602960f81b8152601260018201529151918290036021019091209062000dbe908262001175565b50604080518082018252600681526516969697171760d11b60208201528151601d60f91b8152601260018201529151918290036021019091209062000e04908262001175565b50604080518082018252600681526516971697169760d11b60208201528151603b60f81b8152601260018201529151918290036021019091209062000e4a908262001175565b5060408051808201825260058152642d2e2e2e2d60d81b60208201528151603d60f81b8152601260018201529151918290036021019091209062000e8f908262001175565b506040805180820182526005815264171697169760d91b60208201528151602b60f81b8152601260018201529151918290036021019091209062000ed4908262001175565b5060408051808201825260068152652e2e2d2d2e2d60d01b60208201528151605f60f81b8152601260018201529151918290036021019091209062000f1a908262001175565b5060408051808201825260078152662e2e2e2d2e2e2d60c81b60208201528151600960fa1b8152601260018201529151918290036021019091209062000f61908262001175565b50604080518082018252600681526517169696969760d11b60208201528151602760f81b8152601260018201529151918290036021019091209062000fa7908262001175565b50604080518082018252600681526517169717169760d11b60208201528151601160f91b8152601260018201529151918290036021019091209062000fed908262001175565b5060408051808201825260048152632d2e2e2d60e01b60208201528151601560f91b8152601260018201529151918290036021019091209062001031908262001175565b5060408051808201825260068152652e2e2e2d2e2d60d01b60208201528151602360f81b8152601260018201529151918290036021019091209062001077908262001175565b5062001241565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620010fb57607f821691505b6020821081036200111c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200117057600081815260208120601f850160051c810160208610156200114b5750805b601f850160051c820191505b818110156200116c5782815560010162001157565b5050505b505050565b81516001600160401b03811115620011915762001191620010d0565b620011a981620011a28454620010e6565b8462001122565b602080601f831160018114620011e15760008415620011c85750858301515b600019600386901b1c1916600185901b1785556200116c565b600085815260208120601f198616915b828110156200121257888601518255948401946001909101908401620011f1565b5085821015620012315787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6158c080620012516000396000f3fe60806040526004361061020f5760003560e01c806359943d741161011857806395d89b41116100a0578063c5f12b851161006f578063c5f12b85146105e4578063c87b56dd146105f9578063d2bc64c714610619578063e985e9c514610639578063f2fde38b1461068257600080fd5b806395d89b4114610560578063a005ec7a14610575578063a22cb465146105a4578063b88d4fde146105c457600080fd5b8063671d6429116100e7578063671d6429146104da57806370a08231146104fa578063715018a61461051a5780638da5cb5b1461052f5780638e9706de1461054d57600080fd5b806359943d74146104745780635b5547dd146104875780636352211e146104a757806364c57d28146104c757600080fd5b8063200d2ed21161019b5780633a2235731161016a5780633a223573146103ec5780633ccfd60b1461040c57806342842e0e146104215780634f6ccce71461044157806355f54c7a1461046157600080fd5b8063200d2ed21461036457806320575d961461038c57806323b872dd146103ac5780632f745c59146103cc57600080fd5b80630cb2ddad116101e25780630cb2ddad146102c55780631126cb71146102e5578063164fbf241461030557806318160ddd146103255780631e20478f1461034457600080fd5b806301ffc9a71461021457806306fdde0314610249578063081812fc1461026b578063095ea7b3146102a3575b600080fd5b34801561022057600080fd5b5061023461022f366004613f65565b6106a2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106cd565b6040516102409190613fd9565b34801561027757600080fd5b5061028b610286366004613fec565b61075f565b6040516001600160a01b039091168152602001610240565b3480156102af57600080fd5b506102c36102be36600461401c565b6107f9565b005b3480156102d157600080fd5b506102c36102e0366004614103565b61090e565b3480156102f157600080fd5b506102c3610300366004614103565b610986565b34801561031157600080fd5b506102c36103203660046141e9565b610a44565b34801561033157600080fd5b506008545b604051908152602001610240565b34801561035057600080fd5b5061025e61035f366004614103565b610b36565b34801561037057600080fd5b50610379610bdb565b604051610240979695949392919061424c565b34801561039857600080fd5b5061025e6103a73660046142a7565b610ca3565b3480156103b857600080fd5b506102c36103c73660046142e3565b61123b565b3480156103d857600080fd5b506103366103e736600461401c565b61126c565b3480156103f857600080fd5b506102c3610407366004614103565b611302565b34801561041857600080fd5b506102c3611396565b34801561042d57600080fd5b506102c361043c3660046142e3565b611442565b34801561044d57600080fd5b5061033661045c366004613fec565b61145d565b6102c361046f366004614103565b6114f0565b6102c361048236600461437a565b611552565b34801561049357600080fd5b506102c36104a2366004614415565b6117f9565b3480156104b357600080fd5b5061028b6104c2366004613fec565b61191a565b6102c36104d536600461445b565b611991565b3480156104e657600080fd5b506102c36104f53660046144b8565b611c4a565b34801561050657600080fd5b506103366105153660046144b8565b611cd0565b34801561052657600080fd5b506102c3611d57565b34801561053b57600080fd5b50600b546001600160a01b031661028b565b6102c361055b3660046144d3565b611d8d565b34801561056c57600080fd5b5061025e611fab565b34801561058157600080fd5b50610595610590366004613fec565b611fba565b60405161024093929190614520565b3480156105b057600080fd5b506102c36105bf3660046145bf565b6121e3565b3480156105d057600080fd5b506102c36105df3660046145fb565b6122a7565b3480156105f057600080fd5b506102c36122df565b34801561060557600080fd5b5061025e610614366004613fec565b61236f565b34801561062557600080fd5b5061025e610634366004614103565b61258b565b34801561064557600080fd5b50610234610654366004614676565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068e57600080fd5b506102c361069d3660046144b8565b61264c565b60006001600160e01b0319821663780e9d6360e01b14806106c757506106c7826126e4565b92915050565b6060600080546106dc906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610708906146a0565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108048261191a565b9050806001600160a01b0316836001600160a01b0316036108715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107d4565b336001600160a01b038216148061088d575061088d8133610654565b6108ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d4565b6109098383612734565b505050565b600b546001600160a01b031633146109385760405162461bcd60e51b81526004016107d4906146da565b60106109448282614755565b50806040516109539190614830565b604051908190038120907f3ca519b5f9974fa91529844bd315366abd3f57da732f3a667fbc8e9929e8256790600090a250565b600b546001600160a01b031633146109b05760405162461bcd60e51b81526004016107d4906146da565b6012816040516109c09190614830565b9081526040519081900360200181206109d8916148bf565b60405180910390207f3dadfeac7ff245f4435c42601c691af2c7ffba8510f41ef80714c18e1424fca382604051610a0f9190613fd9565b60405180910390a2601281604051610a279190614830565b90815260200160405180910390206000610a419190613ed5565b50565b600b546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016107d4906146da565b8051825114610a7c57600080fd5b60005b8251811015610af857818181518110610a9a57610a9a6148cb565b60200260200101516012848381518110610ab657610ab66148cb565b6020026020010151604051610acb9190614830565b90815260200160405180910390209081610ae59190614755565b5080610af0816148f7565b915050610a7f565b507fa8da387e8f844fbfabd27be5d2ddcac95da6d8d95438fe8f778c36bf7863a1aa8282604051610b2a929190614965565b60405180910390a15050565b805160208183018101805160128252928201919093012091528054610b5a906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906146a0565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081565b600c8054600d54600e54600f546010805463ffffffff80871697600160201b90970416956001600160a01b03841693600160a01b900460ff16929091610c20906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c906146a0565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b5050505050905087565b60606000601160008581526020019081526020016000206002016040518060c0016040529081600082018054610cd8906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d04906146a0565b8015610d515780601f10610d2657610100808354040283529160200191610d51565b820191906000526020600020905b815481529060010190602001808311610d3457829003601f168201915b50505050508152602001600182018054610d6a906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d96906146a0565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b8083048216604080860191909152600160401b840483166060860152600160601b90930460ff1660809094019390935290830151600c548751949550909360009388938593849384938493920490911611610e6e57600c54600160201b900463ffffffff16610e71565b84515b60408051602081019091526000815290915060015b8263ffffffff168163ffffffff161161122057610ea383826149a9565b93507fd3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561878563ffffffff1681518110610ede57610ede6148cb565b602001015160f81c60f81b604051602001610ef991906149cc565b6040516020818303038152906040528051906020012003610f3357610f1f8960036149e1565b975084610f2b81614a09565b9550506110b4565b7f6f010af653ebe3cb07d297a4ef13366103d392ceffa68dd48232e6e9ff2187bf878563ffffffff1681518110610f6c57610f6c6148cb565b602001015160f81c60f81b604051602001610f8791906149cc565b6040516020818303038152906040528051906020012003610fad57610f1f8960016149e1565b7ffba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527878563ffffffff1681518110610fe657610fe66148cb565b602001015160f81c60f81b60405160200161100191906149cc565b604051602081830303815290604052805190602001200361103a576110278960016149e1565b97506110338887614a2c565b955061120e565b7f681afa780d17da29203322b473d3f210a7d621259a4e6ce9e403f5a266ff719a878563ffffffff1681518110611073576110736148cb565b602001015160f81c60f81b60405160200161108e91906149cc565b60405160208183030381529060405280519060200120036110b4576110278960036149e1565b60008a602001516110ca8a63ffffffff166127a2565b6040516020016110db929190614a49565b60408051601f1981840301815260208301909152600080835290925063ffffffff87169003611193576111138b63ffffffff166127a2565b61112c61112160018a614add565b63ffffffff166127a2565b6111458a61113b8f600e6149e1565b6111219190614a2c565b60405160200161115793929190614afa565b604051602081830303815290604052905081818560405160200161117d93929190614b7a565b6040516020818303038152906040529350611207565b6111a1611121600189614add565b6111ae6111218a8e614a2c565b6111bd8963ffffffff166127a2565b6040516020016111cf93929190614bbd565b60405160208183030381529060405290508382826040516020016111f593929190614b7a565b60405160208183030381529060405293505b6000975050505b8061121881614a09565b915050610e86565b5061122b818a6128aa565b9c9b505050505050505050505050565b611245338261296e565b6112615760405162461bcd60e51b81526004016107d490614c45565b610909838383612a61565b600061127783611cd0565b82106112d95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107d4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b0316331461132c5760405162461bcd60e51b81526004016107d4906146da565b6002600a540361137e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d4565b6002600a5561138e816001612c0c565b506001600a55565b600b546001600160a01b031633146113c05760405162461bcd60e51b81526004016107d4906146da565b600f5460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156113fa573d6000803e3d6000fd5b50600f546040518281526001600160a01b039091169033907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a350565b610909838383604051806020016040528060008152506122a7565b600061146860085490565b82106114cb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107d4565b600882815481106114de576114de6148cb565b90600052602060002001549050919050565b6002600a54036115425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d4565b6002600a5561138e816000612c0c565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156115a35760405162461bcd60e51b81526004016107d49190613fd9565b50600d5483516115b39190614c96565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b815250906116005760405162461bcd60e51b81526004016107d49190613fd9565b50806040516020016116129190614830565b60405160208183030381529060405280519060200120826040516020016116399190614830565b6040516020818303038152906040528051906020012014158015611661575061166182612ff6565b8015611671575061167181612ff6565b6040518060400160405280601e81526020017f436f6c6f72206e6f742076616c6964206f722073616d6520636f6c6f72730000815250906116c55760405162461bcd60e51b81526004016107d49190613fd9565b5060005b83518110156117a45760008482815181106116e6576116e66148cb565b60200260200101519050336001600160a01b03166117038261191a565b6001600160a01b03160361179157600081815260116020526040902060020161172c8482614755565b5060008181526011602052604090206003016117488582614755565b5060008181526011602052604090206004018054600a9190600c90611778908490600160601b900460ff16614cad565b92506101000a81548160ff021916908360ff1602179055505b508061179c816148f7565b9150506116c9565b50826040516117b39190614cc6565b60405180910390207f14258cbcd4a79b28b7136c1ac0431c7f442b4f77330555943e79b095b78f6dc783836040516117ec929190614cfc565b60405180910390a2505050565b600b546001600160a01b031633146118235760405162461bcd60e51b81526004016107d4906146da565b83158015611835575063ffffffff8316155b801561183f575081155b801561184f575063ffffffff8116155b15611879576000600d819055600c8054600e9290925567ffffffffffffffff1990911690556118df565b831561188557600d8490555b63ffffffff8316156118a757600c805463ffffffff191663ffffffff85161790555b81156118b357600e8290555b63ffffffff8116156118df57600c805467ffffffff000000001916600160201b63ffffffff8416021790555b818363ffffffff16857f4a4acf8ea90af2cd0d30fdb0d10b6f0b1f55a72833c5dc5c4dde877ff4dc247f60405160405180910390a450505050565b6000818152600260205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107d4565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156119e25760405162461bcd60e51b81526004016107d49190613fd9565b5060648263ffffffff16118015611a015750620186a08263ffffffff16105b8015611a13575060648163ffffffff16115b8015611a275750620186a08163ffffffff16105b8015611a34575060008351115b604051806040016040528060138152602001724e756d626572206f7574206f662072616e676560681b81525090611a7e5760405162461bcd60e51b81526004016107d49190613fd9565b50612710600c600101548263ffffffff168463ffffffff168651611aa29190614c96565b611aac9190614c96565b611ab69190614c96565b611ac09190614d21565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611b0d5760405162461bcd60e51b81526004016107d49190613fd9565b5060005b8351811015611bf7576000848281518110611b2e57611b2e6148cb565b60200260200101519050336001600160a01b0316611b4b8261191a565b6001600160a01b031603611be4576000818152601160205260409020600401805463ffffffff858116600160401b026bffffffff000000000000000019918816600160201b02919091166bffffffffffffffff0000000019909216919091171780825560649190600c90611bcb90849060ff600160601b90910416614cad565b92506101000a81548160ff021916908360ff1602179055505b5080611bef816148f7565b915050611b11565b5082604051611c069190614cc6565b6040805191829003822063ffffffff808616845284166020840152917f881837717b8b8cf1e0c9819053d562402dff4a9bc1f2036c52de95b1940c3c3391016117ec565b600b546001600160a01b03163314611c745760405162461bcd60e51b81526004016107d4906146da565b600f546040516001600160a01b038084169216907f44480e2c785a901cfd7e220e53f3940931d9f14c088297d4316bd5b3c8ae216f90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611d3b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107d4565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314611d815760405162461bcd60e51b81526004016107d4906146da565b611d8b6000613142565b565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615611dde5760405162461bcd60e51b81526004016107d49190613fd9565b50600d548251611dee9190614c96565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611e3b5760405162461bcd60e51b81526004016107d49190613fd9565b5060008163ffffffff16118015611e5a5750620186a08163ffffffff16105b604051806040016040528060138152602001724e756d626572206f7574206f662072616e676560681b81525090611ea45760405162461bcd60e51b81526004016107d49190613fd9565b5060005b8251811015611f58576000838281518110611ec557611ec56148cb565b60200260200101519050336001600160a01b0316611ee28261191a565b6001600160a01b031603611f45576000818152601160205260409020600401805463ffffffff191663ffffffff851617808255600160601b900460ff1690600c611f2b83614d35565b91906101000a81548160ff021916908360ff160217905550505b5080611f50816148f7565b915050611ea8565b5081604051611f679190614cc6565b60405190819003812063ffffffff83168252907fceebd377146b43b88445c95c0c3e79b10594127ee081be5f420087ea6b58a6ea9060200160405180910390a25050565b6060600180546106dc906146a0565b601160205260009081526040902080548190611fd5906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054612001906146a0565b801561204e5780601f106120235761010080835404028352916020019161204e565b820191906000526020600020905b81548152906001019060200180831161203157829003601f168201915b5050505050908060010160009054906101000a90046001600160a01b031690806002016040518060c001604052908160008201805461208c906146a0565b80601f01602080910402602001604051908101604052809291908181526020018280546120b8906146a0565b80156121055780601f106120da57610100808354040283529160200191612105565b820191906000526020600020905b8154815290600101906020018083116120e857829003601f168201915b5050505050815260200160018201805461211e906146a0565b80601f016020809104026020016040519081016040528092919081815260200182805461214a906146a0565b80156121975780601f1061216c57610100808354040283529160200191612197565b820191906000526020600020905b81548152906001019060200180831161217a57829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b820481166040840152600160401b8204166060830152600160601b900460ff16608090910152905083565b336001600160a01b0383160361223b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d4565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6122b1338361296e565b6122cd5760405162461bcd60e51b81526004016107d490614c45565b6122d984848484613194565b50505050565b600b546001600160a01b031633146123095760405162461bcd60e51b81526004016107d4906146da565b600f805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2936123659390049091161515815260200190565b60405180910390a1565b606061237a60085490565b8211156040518060400160405280601f81526020017f53656c656374656420746f6b656e496420646f6573206e6f7420657869737400815250906123d15760405162461bcd60e51b81526004016107d49190613fd9565b50600082815260116020526040812080546123eb906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054612417906146a0565b80156124645780601f1061243957610100808354040283529160200191612464565b820191906000526020600020905b81548152906001019060200180831161244757829003601f168201915b5050505050905060006124768261258b565b905060006124848583610ca3565b6040805160208082018352600082529151929350917fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470916124c891601091016148bf565b60405160208183030381529060405280519060200120146125115760106124ee876127a2565b6040516020016124ff929190614d54565b60405160208183030381529060405290505b600061255d61251f886127a2565b83878761252b886131c7565b6125348d613330565b60405160200161254996959493929190614dd8565b6040516020818303038152906040526131c7565b9050806040516020016125709190614fa1565b60405160208183030381529060405295505050505050919050565b60408051602081019091526000808252606091906125a884613632565b905060005b8151811015612643578260128383815181106125cb576125cb6148cb565b602001015160f81c60f81b6040516020016125e691906149cc565b60408051601f198184030181529082905261260091614830565b908152602001604051809103902060405160200161261f929190614fe6565b6040516020818303038152906040529250808061263b906148f7565b9150506125ad565b50909392505050565b600b546001600160a01b031633146126765760405162461bcd60e51b81526004016107d4906146da565b6001600160a01b0381166126db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d4565b610a4181613142565b60006001600160e01b031982166380ac58cd60e01b148061271557506001600160e01b03198216635b5e139f60e01b145b806106c757506301ffc9a760e01b6001600160e01b03198316146106c7565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127698261191a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816000036127c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f357806127dd816148f7565b91506127ec9050600a83614d21565b91506127cd565b6000816001600160401b0381111561280d5761280d614046565b6040519080825280601f01601f191660200182016040528015612837576020820181803683370190505b5090505b84156128a25761284c600183615017565b9150612859600a8661502a565b61286490603061503e565b60f81b818381518110612879576128796148cb565b60200101906001600160f81b031916908160001a90535061289b600a86614d21565b945061283b565b949350505050565b606060006128c1836080015163ffffffff166127a2565b6128d4846060015163ffffffff166127a2565b6128e7856080015163ffffffff166127a2565b6128fa866060015163ffffffff166127a2565b8651604051612910959493929190602001615051565b60408051601f198184030181528282018252600d83526c1e17b932b1ba1f1e17b9bb339f60991b60208481019190915291519093506129559184918891859101614b7a565b6040516020818303038152906040529250505092915050565b6000818152600260205260408120546001600160a01b03166129e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107d4565b60006129f28361191a565b9050806001600160a01b0316846001600160a01b03161480612a2d5750836001600160a01b0316612a228461075f565b6001600160a01b0316145b806128a257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166128a2565b826001600160a01b0316612a748261191a565b6001600160a01b031614612adc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107d4565b6001600160a01b038216612b3e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107d4565b612b49838383613794565b612b54600082612734565b6001600160a01b0383166000908152600360205260408120805460019290612b7d908490615017565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bab90849061503e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615612c5d5760405162461bcd60e51b81526004016107d49190613fd9565b5060015b6008548111612d2c5782604051602001612c7b9190614830565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612cad9291016148bf565b6040516020818303038152906040528051906020012014156040518060400160405280602081526020017f536f6d656f6e6520616c7265616479206d696e7465642074686973207465787481525090612d195760405162461bcd60e51b81526004016107d49190613fd9565b5080612d24816148f7565b915050612c61565b5081518015801590612d4c5750600c54600160201b900463ffffffff1681105b612d5557600080fd5b6000612d6060085490565b612d6b90600161503e565b905033328114612d7a57600080fd5b600c54349063ffffffff1684118015612d91575084155b15612df257600e54612da39085614c96565b811460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090612df05760405162461bcd60e51b81526004016107d49190613fd9565b505b612dfb8661384c565b6040518060600160405280602781526020016158246027913990612e325760405162461bcd60e51b81526004016107d49190613fd9565b5060408051606080820183528882526001600160a01b038516602080840191909152835161010081018552600560c0820181815264776869746560d81b60e084015282528551808701875290815264626c61636b60d81b818401528183015260c88186015261015e9281018390526080810192909252600060a0830181905283850192909252868252601190529190912081518190612ed19082614755565b5060208201516001820180546001600160a01b0319166001600160a01b039092169190911790556040820151805160028301908190612f109082614755565b5060208201516001820190612f259082614755565b50604082810151600290920180546060850151608086015160a09096015160ff16600160601b0260ff60601b1963ffffffff978816600160401b02166cffffffffff000000000000000019928816600160201b0267ffffffffffffffff199094169790961696909617919091171692909217929092179055518592506001600160a01b03851691507f2e73cf09b9c19e4e10c745d6b27e0c27a3f1e88c90fd9fdb7b12590dcadbae2590612fdc9085815260200190565b60405180910390a3612fee8284613923565b505050505050565b600080600090506000604051806040016040528060168152602001756162636465664142434445463031323334353637383960501b8152509050600084905080516007146040518060400160405280601081526020016f436f6c6f722073697a652077726f6e6760801b815250906130815760405162461bcd60e51b81526004016107d49190613fd9565b5060015b81518110156131245760005b83518160ff16101561311157838160ff16815181106130b2576130b26148cb565b602001015160f81c60f81b6001600160f81b0319168383815181106130d9576130d96148cb565b01602001516001600160f81b031916036130ff57846130f781614d35565b955050613111565b8061310981614d35565b915050613091565b508061311c816148f7565b915050613085565b50600181516131339190615017565b8360ff16149350505050919050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61319f848484612a61565b6131ab84848484613941565b6122d95760405162461bcd60e51b81526004016107d4906151f2565b805160609060008190036131eb575050604080516020810190915260008152919050565b600060036131fa83600261503e565b6132049190614d21565b61320f906004614c96565b9050600061321e82602061503e565b6001600160401b0381111561323557613235614046565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600060405180606001604052806040815260200161584b604091399050600181016020830160005b868110156132eb576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161328a565b506003860660018114613305576002811461331657613322565b613d3d60f01b600119830152613322565b603d60f81b6000198301525b505050918152949350505050565b60606000601160008481526020019081526020016000206002016040518060c0016040529081600082018054613365906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054613391906146a0565b80156133de5780601f106133b3576101008083540402835291602001916133de565b820191906000526020600020905b8154815290600101906020018083116133c157829003601f168201915b505050505081526020016001820180546133f7906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054613423906146a0565b80156134705780601f1061344557610100808354040283529160200191613470565b820191906000526020600020905b81548152906001019060200180831161345357829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b820481166040840152600160401b8204166060830152600160601b900460ff1660809091015290506134c1613f0f565b6134d58260400151600761112191906149e1565b6134e98360400151600161112191906149e1565b6134fd8460400151600361112191906149e1565b60405160200161350f93929190615244565b60408051808303601f19018152919052815281516020830151606084015161353c9063ffffffff166127a2565b61354f856080015163ffffffff166127a2565b6040516020016135629493929190615359565b60408051808303601f190181529190526020820152613580846127a2565b600085815260116020526040902080546135a5919061359e906146a0565b90506127a2565b6135b58460a0015160ff166127a2565b6000878152601160205260409020600101546135d9906001600160a01b0316613a42565b6040516020016135ec94939291906154c6565b60408051808303601f190181529181528281018290528251602080850151925161361a9492939291016155f7565b60405160208183030381529060405292505050919050565b60606000829050600081516001600160401b0381111561365457613654614046565b6040519080825280601f01601f19166020018201604052801561367e576020820181803683370190505b50905060005b825181101561378c5760418382815181106136a1576136a16148cb565b016020015160f81c108015906136d15750605a8382815181106136c6576136c66148cb565b016020015160f81c11155b15613733578281815181106136e8576136e86148cb565b602001015160f81c60f81b60f81c60206137029190614cad565b60f81b828281518110613717576137176148cb565b60200101906001600160f81b031916908160001a90535061377a565b828181518110613745576137456148cb565b602001015160f81c60f81b828281518110613762576137626148cb565b60200101906001600160f81b031916908160001a9053505b80613784816148f7565b915050613684565b509392505050565b6001600160a01b0383166137ef576137ea81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613812565b816001600160a01b0316836001600160a01b031614613812576138128382613b89565b6001600160a01b0382166138295761090981613c26565b826001600160a01b0316826001600160a01b031614610909576109098282613cd5565b600081815b81518160ff1610156139195760126138a6838360ff1681518110613877576138776148cb565b602001015160f81c60f81b60405160200161389291906149cc565b604051602081830303815290604052613632565b6040516138b39190614830565b90815260200160405180910390206040516020016138d191906148bf565b60408051601f19818403018152828252805160209182012060008452908301918290529151902003613907575060009392505050565b8061391181614d35565b915050613851565b5060019392505050565b61393d828260405180602001604052806000815250613d19565b5050565b60006001600160a01b0384163b15613a3757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061398590339089908890889060040161566c565b6020604051808303816000875af19250505080156139c0575060408051601f3d908101601f191682019092526139bd918101906156a9565b60015b613a1d573d8080156139ee576040519150601f19603f3d011682016040523d82523d6000602084013e6139f3565b606091505b508051600003613a155760405162461bcd60e51b81526004016107d4906151f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128a2565b506001949350505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015613b82576000613a7f826013615017565b613a8a906008614c96565b613a959060026157aa565b613aa8906001600160a01b038716614d21565b60f81b9050600060108260f81c613abf91906157b6565b60f81b905060008160f81c6010613ad691906157d8565b8360f81c613ae491906157f4565b60f81b9050613af282613d4c565b85613afe866002614c96565b81518110613b0e57613b0e6148cb565b60200101906001600160f81b031916908160001a905350613b2e81613d4c565b85613b3a866002614c96565b613b4590600161503e565b81518110613b5557613b556148cb565b60200101906001600160f81b031916908160001a9053505050508080613b7a906148f7565b915050613a69565b5092915050565b60006001613b9684611cd0565b613ba09190615017565b600083815260076020526040902054909150808214613bf3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613c3890600190615017565b60008381526009602052604081205460088054939450909284908110613c6057613c606148cb565b906000526020600020015490508060088381548110613c8157613c816148cb565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613cb957613cb961580d565b6001900381819060005260206000200160009055905550505050565b6000613ce083611cd0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b613d238383613d87565b613d306000848484613941565b6109095760405162461bcd60e51b81526004016107d4906151f2565b6000600a60f883901c1015613d7357613d6a60f883901c6030614cad565b60f81b92915050565b613d6a60f883901c6057614cad565b919050565b6001600160a01b038216613ddd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d4565b6000818152600260205260409020546001600160a01b031615613e425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d4565b613e4e60008383613794565b6001600160a01b0382166000908152600360205260408120805460019290613e7790849061503e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054613ee1906146a0565b6000825580601f10613ef1575050565b601f016020900490600052602060002090810190610a419190613f36565b60405180606001604052806003905b6060815260200190600190039081613f1e5790505090565b5b80821115613f4b5760008155600101613f37565b5090565b6001600160e01b031981168114610a4157600080fd5b600060208284031215613f7757600080fd5b8135613f8281613f4f565b9392505050565b60005b83811015613fa4578181015183820152602001613f8c565b50506000910152565b60008151808452613fc5816020860160208601613f89565b601f01601f19169290920160200192915050565b602081526000613f826020830184613fad565b600060208284031215613ffe57600080fd5b5035919050565b80356001600160a01b0381168114613d8257600080fd5b6000806040838503121561402f57600080fd5b61403883614005565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561408457614084614046565b604052919050565b60006001600160401b038311156140a5576140a5614046565b6140b8601f8401601f191660200161405c565b90508281528383830111156140cc57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126140f457600080fd5b613f828383356020850161408c565b60006020828403121561411557600080fd5b81356001600160401b0381111561412b57600080fd5b6128a2848285016140e3565b60006001600160401b0382111561415057614150614046565b5060051b60200190565b600082601f83011261416b57600080fd5b8135602061418061417b83614137565b61405c565b82815260059290921b8401810191818101908684111561419f57600080fd5b8286015b848110156141de5780356001600160401b038111156141c25760008081fd5b6141d08986838b01016140e3565b8452509183019183016141a3565b509695505050505050565b600080604083850312156141fc57600080fd5b82356001600160401b038082111561421357600080fd5b61421f8683870161415a565b9350602085013591508082111561423557600080fd5b506142428582860161415a565b9150509250929050565b63ffffffff88811682528716602082015260408101869052606081018590526001600160a01b038416608082015282151560a082015260e060c0820181905260009061429a90830184613fad565b9998505050505050505050565b600080604083850312156142ba57600080fd5b8235915060208301356001600160401b038111156142d757600080fd5b614242858286016140e3565b6000806000606084860312156142f857600080fd5b61430184614005565b925061430f60208501614005565b9150604084013590509250925092565b600082601f83011261433057600080fd5b8135602061434061417b83614137565b82815260059290921b8401810191818101908684111561435f57600080fd5b8286015b848110156141de5780358352918301918301614363565b60008060006060848603121561438f57600080fd5b83356001600160401b03808211156143a657600080fd5b6143b28783880161431f565b945060208601359150808211156143c857600080fd5b6143d4878388016140e3565b935060408601359150808211156143ea57600080fd5b506143f7868287016140e3565b9150509250925092565b803563ffffffff81168114613d8257600080fd5b6000806000806080858703121561442b57600080fd5b8435935061443b60208601614401565b92506040850135915061445060608601614401565b905092959194509250565b60008060006060848603121561447057600080fd5b83356001600160401b0381111561448657600080fd5b6144928682870161431f565b9350506144a160208501614401565b91506144af60408501614401565b90509250925092565b6000602082840312156144ca57600080fd5b613f8282614005565b600080604083850312156144e657600080fd5b82356001600160401b038111156144fc57600080fd5b6145088582860161431f565b92505061451760208401614401565b90509250929050565b6060815260006145336060830186613fad565b6001600160a01b03851660208401528281036040840152835160c080835261455d90830182613fad565b9050602085015182820360208401526145768282613fad565b915050604085015163ffffffff8082166040850152806060880151166060850152806080880151166080850152505060ff60a08601511660a08301528092505050949350505050565b600080604083850312156145d257600080fd5b6145db83614005565b9150602083013580151581146145f057600080fd5b809150509250929050565b6000806000806080858703121561461157600080fd5b61461a85614005565b935061462860208601614005565b92506040850135915060608501356001600160401b0381111561464a57600080fd5b8501601f8101871361465b57600080fd5b61466a8782356020840161408c565b91505092959194509250565b6000806040838503121561468957600080fd5b61469283614005565b915061451760208401614005565b600181811c908216806146b457607f821691505b6020821081036146d457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f82111561090957600081815260208120601f850160051c810160208610156147365750805b601f850160051c820191505b81811015612fee57828155600101614742565b81516001600160401b0381111561476e5761476e614046565b6147828161477c84546146a0565b8461470f565b602080601f8311600181146147b7576000841561479f5750858301515b600019600386901b1c1916600185901b178555612fee565b600085815260208120601f198616915b828110156147e6578886015182559484019460019091019084016147c7565b50858210156148045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008151614826818560208601613f89565b9290920192915050565b60008251614842818460208701613f89565b9190910192915050565b60008154614859816146a0565b600182811680156148715760018114614886576148b5565b60ff19841687528215158302870194506148b5565b8560005260208060002060005b858110156148ac5781548a820152908401908201614893565b50505082870194505b5050505092915050565b6000613f82828461484c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614909576149096148e1565b5060010190565b600081518084526020808501808196508360051b8101915082860160005b85811015614958578284038952614946848351613fad565b9885019893509084019060010161492e565b5091979650505050505050565b6040815260006149786040830185614910565b828103602084015261498a8185614910565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806149c0576149c0614993565b92169190910692915050565b6001600160f81b031991909116815260010190565b63ffffffff818116838216028082169190828114614a0157614a016148e1565b505092915050565b600063ffffffff808316818103614a2257614a226148e1565b6001019392505050565b63ffffffff818116838216019080821115613b8257613b826148e1565b7f3c616e696d617465206174747269627574654e616d653d2766696c6c2720000081526776616c7565733d2760c01b601e82015260008351614a92816026850160208801613f89565b6627206475723d2760c81b6026918401918201528351614ab981602d840160208801613f89565b6a6d732720626567696e3d2760a81b602d9290910191820152603801949350505050565b63ffffffff828116828216039080821115613b8257613b826148e1565b60008451614b0c818460208901613f89565b636d733b6160e01b9083019081528451614b2d816004840160208901613f89565b642e656e642b60d81b600492909101918201528351614b53816009840160208801613f89565b6c36b9939034b21e93b09813979f60991b6009929091019182015260160195945050505050565b60008451614b8c818460208901613f89565b845190830190614ba0818360208901613f89565b8451910190614bb3818360208801613f89565b0195945050505050565b606160f81b815260008451614bd9816001850160208901613f89565b642e656e642b60d81b6001918401918201528451614bfe816006840160208901613f89565b686d73272069643d276160b81b600692909101918201528351614c2881600f840160208801613f89565b6213979f60e91b600f929091019182015260120195945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b80820281158282048414176106c7576106c76148e1565b60ff81811683821601908111156106c7576106c76148e1565b815160009082906020808601845b83811015614cf057815185529382019390820190600101614cd4565b50929695505050505050565b604081526000614d0f6040830185613fad565b828103602084015261498a8185613fad565b600082614d3057614d30614993565b500490565b600060ff821660ff8103614d4b57614d4b6148e1565b60010192915050565b7f2265787465726e616c5f75726c22203a207b2274797065223a2022737472696e81527233911610113232b9b1b934b83a34b7b7111d1160691b60208201526000614da2603383018561484c565b602f60f81b81528351614dbc816001840160208801613f89565b62089f4b60ea1b60019290910191820152600401949350505050565b607b60f81b815275227469746c65223a20224d6f72736520436f6465202360501b60018201528651600090614e14816017850160208c01613f89565b7f222c202274797065223a20226f626a656374222c202270726f7065727469657360179184019182015263223a207b60e01b60378201528751614e5e81603b840160208c01613f89565b7f226e616d65223a7b2274797065223a22737472696e67222c2022646573637269603b929091019182015267383a34b7b7111d1160c11b605b8201528651614ead816063840160208b01613f89565b614f93614f8d614f7f614f79614f1a614f146063878901017f227d2c226465736372697074696f6e223a7b2274797065223a22737472696e6781527f222c20226465736372697074696f6e223a224d6f72736520636f64653a2000006020820152603e0190565b8c614814565b7f227d2c22696d616765223a7b202274797065223a22737472696e67222c20226481527f65736372697074696f6e223a22646174613a696d6167652f7376672b786d6c3b60208201526618985cd94d8d0b60ca1b604082015260470190565b89614814565b61227d60f01b815260020190565b86614814565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614fd981601d850160208701613f89565b91909101601d0192915050565b60008351614ff8818460208801613f89565b6150048184018561484c565b600160fd1b815260010195945050505050565b818103818111156106c7576106c76148e1565b60008261503957615039614993565b500690565b808201808211156106c7576106c76148e1565b7f3c73766720646174612d762d32303837323034363d27272076657273696f6e3d81527f27312e312720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3260208201527f3030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f77777760408201527f2e77332e6f72672f313939392f786c696e6b2720783d273070782720793d27306060820152700383c13903b34b2bba137bc1e939810181607d1b608082015260008651615115816091850160208b01613f89565b600160fd1b6091918401918201528651615136816092840160208b01613f89565b6151976151916092838501017f2720786d6c3a73706163653d277072657365727665272069643d27647261776981527f6e67273e3c7265637420783d27302720793d2730272077696474683d270000006020820152603d0190565b88614814565b9150506151b0816927206865696768743d2760b01b9052565b6151bd600a820186614814565b67272066696c6c3d2760c01b815290506151da6008820185614814565b6213901f60e91b815260030198975050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f7b2274726169745f74797065223a22536c617368222c202276616c7565223a0081526000845161527c81601f850160208901613f89565b80830190507f2c2022646973706c61795f74797065223a226e756d626572227d2c207b22747280601f8301527f6169745f74797065223a22446974222c202276616c7565223a00000000000000603f83015285516152e1816058850160208a01613f89565b60589201918201527f6169745f74797065223a22446168222c202276616c7565223a0000000000000060788201528351615322816091840160208801613f89565b7f2c2022646973706c61795f74797065223a226e756d626572227d0000000000006091929091019182015260ab0195945050505050565b7f2c7b2274726169745f74797065223a22436f6c6f72204f4646222c202276616c8152643ab2911d1160d91b60208201526000855161539f816025850160208a01613f89565b7f227d2c207b2274726169745f74797065223a22436f6c6f72204f4e222c2022766025918401918201526630b63ab2911d1160c91b604582015285516153ec81604c840160208a01613f89565b7f227d2c207b2274726169745f74797065223a22686569676874222c202276616c604c9290910191820152633ab2911d60e11b606c8201528451615437816070840160208901613f89565b7f2c2022646973706c61795f74797065223a226e756d626572227d2c207b227472607092909101918201527f6169745f74797065223a227769647468222c202276616c7565223a0000000000609082015261549560ab820185614814565b7f2c2022646973706c61795f74797065223a226e756d626572227d0000000000008152601a01979650505050505050565b7f2c7b2274726169745f74797065223a224944222c2276616c7565223a000000008152600085516154fe81601c850160208a01613f89565b80830190507f2c2022646973706c61795f74797065223a226e756d626572227d2c207b22747280601c8301527f6169745f74797065223a224c656e677468222c2276616c7565223a0000000000603c8301528651615563816057850160208b01613f89565b605792019182018190527f6169745f74797065223a224c6576656c222c2276616c7565223a000000000000607783015285516155a6816091850160208a01613f89565b60919201918201527f6169745f74797065223a224d696e746564206279222c2276616c7565223a220060b18201526155e160d0820185614814565b61227d60f01b8152600201979650505050505050565b6e2c2261747472696275746573223a5b60881b8152835160009061562281600f850160208901613f89565b84519083019061563981600f840160208901613f89565b845191019061564f81600f840160208801613f89565b625d7d7d60e81b600f929091019182015260120195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061569f90830184613fad565b9695505050505050565b6000602082840312156156bb57600080fd5b8151613f8281613f4f565b600181815b808511156157015781600019048211156156e7576156e76148e1565b808516156156f457918102915b93841c93908002906156cb565b509250929050565b600082615718575060016106c7565b81615725575060006106c7565b816001811461573b576002811461574557615761565b60019150506106c7565b60ff841115615756576157566148e1565b50506001821b6106c7565b5060208310610133831016604e8410600b8410161715615784575081810a6106c7565b61578e83836156c6565b80600019048211156157a2576157a26148e1565b029392505050565b6000613f828383615709565b600060ff8316806157c9576157c9614993565b8060ff84160491505092915050565b60ff8181168382160290811690818114613b8257613b826148e1565b60ff82811682821603908111156106c7576106c76148e1565b634e487b7160e01b600052603160045260246000fdfe496e707574206e6f742076616c69642e2052656d6f7665206e6f742076616c69642063686172734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212209b5075e00dbe409ba7d1b3e190de4ca72c85cc5e1c142784ad9aa5ebe935763764736f6c63430008120033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806359943d741161011857806395d89b41116100a0578063c5f12b851161006f578063c5f12b85146105e4578063c87b56dd146105f9578063d2bc64c714610619578063e985e9c514610639578063f2fde38b1461068257600080fd5b806395d89b4114610560578063a005ec7a14610575578063a22cb465146105a4578063b88d4fde146105c457600080fd5b8063671d6429116100e7578063671d6429146104da57806370a08231146104fa578063715018a61461051a5780638da5cb5b1461052f5780638e9706de1461054d57600080fd5b806359943d74146104745780635b5547dd146104875780636352211e146104a757806364c57d28146104c757600080fd5b8063200d2ed21161019b5780633a2235731161016a5780633a223573146103ec5780633ccfd60b1461040c57806342842e0e146104215780634f6ccce71461044157806355f54c7a1461046157600080fd5b8063200d2ed21461036457806320575d961461038c57806323b872dd146103ac5780632f745c59146103cc57600080fd5b80630cb2ddad116101e25780630cb2ddad146102c55780631126cb71146102e5578063164fbf241461030557806318160ddd146103255780631e20478f1461034457600080fd5b806301ffc9a71461021457806306fdde0314610249578063081812fc1461026b578063095ea7b3146102a3575b600080fd5b34801561022057600080fd5b5061023461022f366004613f65565b6106a2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106cd565b6040516102409190613fd9565b34801561027757600080fd5b5061028b610286366004613fec565b61075f565b6040516001600160a01b039091168152602001610240565b3480156102af57600080fd5b506102c36102be36600461401c565b6107f9565b005b3480156102d157600080fd5b506102c36102e0366004614103565b61090e565b3480156102f157600080fd5b506102c3610300366004614103565b610986565b34801561031157600080fd5b506102c36103203660046141e9565b610a44565b34801561033157600080fd5b506008545b604051908152602001610240565b34801561035057600080fd5b5061025e61035f366004614103565b610b36565b34801561037057600080fd5b50610379610bdb565b604051610240979695949392919061424c565b34801561039857600080fd5b5061025e6103a73660046142a7565b610ca3565b3480156103b857600080fd5b506102c36103c73660046142e3565b61123b565b3480156103d857600080fd5b506103366103e736600461401c565b61126c565b3480156103f857600080fd5b506102c3610407366004614103565b611302565b34801561041857600080fd5b506102c3611396565b34801561042d57600080fd5b506102c361043c3660046142e3565b611442565b34801561044d57600080fd5b5061033661045c366004613fec565b61145d565b6102c361046f366004614103565b6114f0565b6102c361048236600461437a565b611552565b34801561049357600080fd5b506102c36104a2366004614415565b6117f9565b3480156104b357600080fd5b5061028b6104c2366004613fec565b61191a565b6102c36104d536600461445b565b611991565b3480156104e657600080fd5b506102c36104f53660046144b8565b611c4a565b34801561050657600080fd5b506103366105153660046144b8565b611cd0565b34801561052657600080fd5b506102c3611d57565b34801561053b57600080fd5b50600b546001600160a01b031661028b565b6102c361055b3660046144d3565b611d8d565b34801561056c57600080fd5b5061025e611fab565b34801561058157600080fd5b50610595610590366004613fec565b611fba565b60405161024093929190614520565b3480156105b057600080fd5b506102c36105bf3660046145bf565b6121e3565b3480156105d057600080fd5b506102c36105df3660046145fb565b6122a7565b3480156105f057600080fd5b506102c36122df565b34801561060557600080fd5b5061025e610614366004613fec565b61236f565b34801561062557600080fd5b5061025e610634366004614103565b61258b565b34801561064557600080fd5b50610234610654366004614676565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068e57600080fd5b506102c361069d3660046144b8565b61264c565b60006001600160e01b0319821663780e9d6360e01b14806106c757506106c7826126e4565b92915050565b6060600080546106dc906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610708906146a0565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108048261191a565b9050806001600160a01b0316836001600160a01b0316036108715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107d4565b336001600160a01b038216148061088d575061088d8133610654565b6108ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d4565b6109098383612734565b505050565b600b546001600160a01b031633146109385760405162461bcd60e51b81526004016107d4906146da565b60106109448282614755565b50806040516109539190614830565b604051908190038120907f3ca519b5f9974fa91529844bd315366abd3f57da732f3a667fbc8e9929e8256790600090a250565b600b546001600160a01b031633146109b05760405162461bcd60e51b81526004016107d4906146da565b6012816040516109c09190614830565b9081526040519081900360200181206109d8916148bf565b60405180910390207f3dadfeac7ff245f4435c42601c691af2c7ffba8510f41ef80714c18e1424fca382604051610a0f9190613fd9565b60405180910390a2601281604051610a279190614830565b90815260200160405180910390206000610a419190613ed5565b50565b600b546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016107d4906146da565b8051825114610a7c57600080fd5b60005b8251811015610af857818181518110610a9a57610a9a6148cb565b60200260200101516012848381518110610ab657610ab66148cb565b6020026020010151604051610acb9190614830565b90815260200160405180910390209081610ae59190614755565b5080610af0816148f7565b915050610a7f565b507fa8da387e8f844fbfabd27be5d2ddcac95da6d8d95438fe8f778c36bf7863a1aa8282604051610b2a929190614965565b60405180910390a15050565b805160208183018101805160128252928201919093012091528054610b5a906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906146a0565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081565b600c8054600d54600e54600f546010805463ffffffff80871697600160201b90970416956001600160a01b03841693600160a01b900460ff16929091610c20906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c906146a0565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b5050505050905087565b60606000601160008581526020019081526020016000206002016040518060c0016040529081600082018054610cd8906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d04906146a0565b8015610d515780601f10610d2657610100808354040283529160200191610d51565b820191906000526020600020905b815481529060010190602001808311610d3457829003601f168201915b50505050508152602001600182018054610d6a906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d96906146a0565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b8083048216604080860191909152600160401b840483166060860152600160601b90930460ff1660809094019390935290830151600c548751949550909360009388938593849384938493920490911611610e6e57600c54600160201b900463ffffffff16610e71565b84515b60408051602081019091526000815290915060015b8263ffffffff168163ffffffff161161122057610ea383826149a9565b93507fd3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561878563ffffffff1681518110610ede57610ede6148cb565b602001015160f81c60f81b604051602001610ef991906149cc565b6040516020818303038152906040528051906020012003610f3357610f1f8960036149e1565b975084610f2b81614a09565b9550506110b4565b7f6f010af653ebe3cb07d297a4ef13366103d392ceffa68dd48232e6e9ff2187bf878563ffffffff1681518110610f6c57610f6c6148cb565b602001015160f81c60f81b604051602001610f8791906149cc565b6040516020818303038152906040528051906020012003610fad57610f1f8960016149e1565b7ffba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527878563ffffffff1681518110610fe657610fe66148cb565b602001015160f81c60f81b60405160200161100191906149cc565b604051602081830303815290604052805190602001200361103a576110278960016149e1565b97506110338887614a2c565b955061120e565b7f681afa780d17da29203322b473d3f210a7d621259a4e6ce9e403f5a266ff719a878563ffffffff1681518110611073576110736148cb565b602001015160f81c60f81b60405160200161108e91906149cc565b60405160208183030381529060405280519060200120036110b4576110278960036149e1565b60008a602001516110ca8a63ffffffff166127a2565b6040516020016110db929190614a49565b60408051601f1981840301815260208301909152600080835290925063ffffffff87169003611193576111138b63ffffffff166127a2565b61112c61112160018a614add565b63ffffffff166127a2565b6111458a61113b8f600e6149e1565b6111219190614a2c565b60405160200161115793929190614afa565b604051602081830303815290604052905081818560405160200161117d93929190614b7a565b6040516020818303038152906040529350611207565b6111a1611121600189614add565b6111ae6111218a8e614a2c565b6111bd8963ffffffff166127a2565b6040516020016111cf93929190614bbd565b60405160208183030381529060405290508382826040516020016111f593929190614b7a565b60405160208183030381529060405293505b6000975050505b8061121881614a09565b915050610e86565b5061122b818a6128aa565b9c9b505050505050505050505050565b611245338261296e565b6112615760405162461bcd60e51b81526004016107d490614c45565b610909838383612a61565b600061127783611cd0565b82106112d95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107d4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b0316331461132c5760405162461bcd60e51b81526004016107d4906146da565b6002600a540361137e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d4565b6002600a5561138e816001612c0c565b506001600a55565b600b546001600160a01b031633146113c05760405162461bcd60e51b81526004016107d4906146da565b600f5460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156113fa573d6000803e3d6000fd5b50600f546040518281526001600160a01b039091169033907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9060200160405180910390a350565b610909838383604051806020016040528060008152506122a7565b600061146860085490565b82106114cb5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107d4565b600882815481106114de576114de6148cb565b90600052602060002001549050919050565b6002600a54036115425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d4565b6002600a5561138e816000612c0c565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156115a35760405162461bcd60e51b81526004016107d49190613fd9565b50600d5483516115b39190614c96565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b815250906116005760405162461bcd60e51b81526004016107d49190613fd9565b50806040516020016116129190614830565b60405160208183030381529060405280519060200120826040516020016116399190614830565b6040516020818303038152906040528051906020012014158015611661575061166182612ff6565b8015611671575061167181612ff6565b6040518060400160405280601e81526020017f436f6c6f72206e6f742076616c6964206f722073616d6520636f6c6f72730000815250906116c55760405162461bcd60e51b81526004016107d49190613fd9565b5060005b83518110156117a45760008482815181106116e6576116e66148cb565b60200260200101519050336001600160a01b03166117038261191a565b6001600160a01b03160361179157600081815260116020526040902060020161172c8482614755565b5060008181526011602052604090206003016117488582614755565b5060008181526011602052604090206004018054600a9190600c90611778908490600160601b900460ff16614cad565b92506101000a81548160ff021916908360ff1602179055505b508061179c816148f7565b9150506116c9565b50826040516117b39190614cc6565b60405180910390207f14258cbcd4a79b28b7136c1ac0431c7f442b4f77330555943e79b095b78f6dc783836040516117ec929190614cfc565b60405180910390a2505050565b600b546001600160a01b031633146118235760405162461bcd60e51b81526004016107d4906146da565b83158015611835575063ffffffff8316155b801561183f575081155b801561184f575063ffffffff8116155b15611879576000600d819055600c8054600e9290925567ffffffffffffffff1990911690556118df565b831561188557600d8490555b63ffffffff8316156118a757600c805463ffffffff191663ffffffff85161790555b81156118b357600e8290555b63ffffffff8116156118df57600c805467ffffffff000000001916600160201b63ffffffff8416021790555b818363ffffffff16857f4a4acf8ea90af2cd0d30fdb0d10b6f0b1f55a72833c5dc5c4dde877ff4dc247f60405160405180910390a450505050565b6000818152600260205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107d4565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff16156119e25760405162461bcd60e51b81526004016107d49190613fd9565b5060648263ffffffff16118015611a015750620186a08263ffffffff16105b8015611a13575060648163ffffffff16115b8015611a275750620186a08163ffffffff16105b8015611a34575060008351115b604051806040016040528060138152602001724e756d626572206f7574206f662072616e676560681b81525090611a7e5760405162461bcd60e51b81526004016107d49190613fd9565b50612710600c600101548263ffffffff168463ffffffff168651611aa29190614c96565b611aac9190614c96565b611ab69190614c96565b611ac09190614d21565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611b0d5760405162461bcd60e51b81526004016107d49190613fd9565b5060005b8351811015611bf7576000848281518110611b2e57611b2e6148cb565b60200260200101519050336001600160a01b0316611b4b8261191a565b6001600160a01b031603611be4576000818152601160205260409020600401805463ffffffff858116600160401b026bffffffff000000000000000019918816600160201b02919091166bffffffffffffffff0000000019909216919091171780825560649190600c90611bcb90849060ff600160601b90910416614cad565b92506101000a81548160ff021916908360ff1602179055505b5080611bef816148f7565b915050611b11565b5082604051611c069190614cc6565b6040805191829003822063ffffffff808616845284166020840152917f881837717b8b8cf1e0c9819053d562402dff4a9bc1f2036c52de95b1940c3c3391016117ec565b600b546001600160a01b03163314611c745760405162461bcd60e51b81526004016107d4906146da565b600f546040516001600160a01b038084169216907f44480e2c785a901cfd7e220e53f3940931d9f14c088297d4316bd5b3c8ae216f90600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611d3b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107d4565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314611d815760405162461bcd60e51b81526004016107d4906146da565b611d8b6000613142565b565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615611dde5760405162461bcd60e51b81526004016107d49190613fd9565b50600d548251611dee9190614c96565b341460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090611e3b5760405162461bcd60e51b81526004016107d49190613fd9565b5060008163ffffffff16118015611e5a5750620186a08163ffffffff16105b604051806040016040528060138152602001724e756d626572206f7574206f662072616e676560681b81525090611ea45760405162461bcd60e51b81526004016107d49190613fd9565b5060005b8251811015611f58576000838281518110611ec557611ec56148cb565b60200260200101519050336001600160a01b0316611ee28261191a565b6001600160a01b031603611f45576000818152601160205260409020600401805463ffffffff191663ffffffff851617808255600160601b900460ff1690600c611f2b83614d35565b91906101000a81548160ff021916908360ff160217905550505b5080611f50816148f7565b915050611ea8565b5081604051611f679190614cc6565b60405190819003812063ffffffff83168252907fceebd377146b43b88445c95c0c3e79b10594127ee081be5f420087ea6b58a6ea9060200160405180910390a25050565b6060600180546106dc906146a0565b601160205260009081526040902080548190611fd5906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054612001906146a0565b801561204e5780601f106120235761010080835404028352916020019161204e565b820191906000526020600020905b81548152906001019060200180831161203157829003601f168201915b5050505050908060010160009054906101000a90046001600160a01b031690806002016040518060c001604052908160008201805461208c906146a0565b80601f01602080910402602001604051908101604052809291908181526020018280546120b8906146a0565b80156121055780601f106120da57610100808354040283529160200191612105565b820191906000526020600020905b8154815290600101906020018083116120e857829003601f168201915b5050505050815260200160018201805461211e906146a0565b80601f016020809104026020016040519081016040528092919081815260200182805461214a906146a0565b80156121975780601f1061216c57610100808354040283529160200191612197565b820191906000526020600020905b81548152906001019060200180831161217a57829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b820481166040840152600160401b8204166060830152600160601b900460ff16608090910152905083565b336001600160a01b0383160361223b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d4565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6122b1338361296e565b6122cd5760405162461bcd60e51b81526004016107d490614c45565b6122d984848484613194565b50505050565b600b546001600160a01b031633146123095760405162461bcd60e51b81526004016107d4906146da565b600f805460ff600160a01b808304821615810260ff60a01b1990931692909217928390556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2936123659390049091161515815260200190565b60405180910390a1565b606061237a60085490565b8211156040518060400160405280601f81526020017f53656c656374656420746f6b656e496420646f6573206e6f7420657869737400815250906123d15760405162461bcd60e51b81526004016107d49190613fd9565b50600082815260116020526040812080546123eb906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054612417906146a0565b80156124645780601f1061243957610100808354040283529160200191612464565b820191906000526020600020905b81548152906001019060200180831161244757829003601f168201915b5050505050905060006124768261258b565b905060006124848583610ca3565b6040805160208082018352600082529151929350917fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470916124c891601091016148bf565b60405160208183030381529060405280519060200120146125115760106124ee876127a2565b6040516020016124ff929190614d54565b60405160208183030381529060405290505b600061255d61251f886127a2565b83878761252b886131c7565b6125348d613330565b60405160200161254996959493929190614dd8565b6040516020818303038152906040526131c7565b9050806040516020016125709190614fa1565b60405160208183030381529060405295505050505050919050565b60408051602081019091526000808252606091906125a884613632565b905060005b8151811015612643578260128383815181106125cb576125cb6148cb565b602001015160f81c60f81b6040516020016125e691906149cc565b60408051601f198184030181529082905261260091614830565b908152602001604051809103902060405160200161261f929190614fe6565b6040516020818303038152906040529250808061263b906148f7565b9150506125ad565b50909392505050565b600b546001600160a01b031633146126765760405162461bcd60e51b81526004016107d4906146da565b6001600160a01b0381166126db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d4565b610a4181613142565b60006001600160e01b031982166380ac58cd60e01b148061271557506001600160e01b03198216635b5e139f60e01b145b806106c757506301ffc9a760e01b6001600160e01b03198316146106c7565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127698261191a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816000036127c95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156127f357806127dd816148f7565b91506127ec9050600a83614d21565b91506127cd565b6000816001600160401b0381111561280d5761280d614046565b6040519080825280601f01601f191660200182016040528015612837576020820181803683370190505b5090505b84156128a25761284c600183615017565b9150612859600a8661502a565b61286490603061503e565b60f81b818381518110612879576128796148cb565b60200101906001600160f81b031916908160001a90535061289b600a86614d21565b945061283b565b949350505050565b606060006128c1836080015163ffffffff166127a2565b6128d4846060015163ffffffff166127a2565b6128e7856080015163ffffffff166127a2565b6128fa866060015163ffffffff166127a2565b8651604051612910959493929190602001615051565b60408051601f198184030181528282018252600d83526c1e17b932b1ba1f1e17b9bb339f60991b60208481019190915291519093506129559184918891859101614b7a565b6040516020818303038152906040529250505092915050565b6000818152600260205260408120546001600160a01b03166129e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107d4565b60006129f28361191a565b9050806001600160a01b0316846001600160a01b03161480612a2d5750836001600160a01b0316612a228461075f565b6001600160a01b0316145b806128a257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166128a2565b826001600160a01b0316612a748261191a565b6001600160a01b031614612adc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107d4565b6001600160a01b038216612b3e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107d4565b612b49838383613794565b612b54600082612734565b6001600160a01b0383166000908152600360205260408120805460019290612b7d908490615017565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bab90849061503e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600f5460408051808201909152600e81526d135a5b9d1a5b99c81c185d5cd95960921b602082015290600160a01b900460ff1615612c5d5760405162461bcd60e51b81526004016107d49190613fd9565b5060015b6008548111612d2c5782604051602001612c7b9190614830565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612cad9291016148bf565b6040516020818303038152906040528051906020012014156040518060400160405280602081526020017f536f6d656f6e6520616c7265616479206d696e7465642074686973207465787481525090612d195760405162461bcd60e51b81526004016107d49190613fd9565b5080612d24816148f7565b915050612c61565b5081518015801590612d4c5750600c54600160201b900463ffffffff1681105b612d5557600080fd5b6000612d6060085490565b612d6b90600161503e565b905033328114612d7a57600080fd5b600c54349063ffffffff1684118015612d91575084155b15612df257600e54612da39085614c96565b811460405180604001604052806014815260200173115e1858dd081d985b1d59481c995c5d5a5c995960621b81525090612df05760405162461bcd60e51b81526004016107d49190613fd9565b505b612dfb8661384c565b6040518060600160405280602781526020016158246027913990612e325760405162461bcd60e51b81526004016107d49190613fd9565b5060408051606080820183528882526001600160a01b038516602080840191909152835161010081018552600560c0820181815264776869746560d81b60e084015282528551808701875290815264626c61636b60d81b818401528183015260c88186015261015e9281018390526080810192909252600060a0830181905283850192909252868252601190529190912081518190612ed19082614755565b5060208201516001820180546001600160a01b0319166001600160a01b039092169190911790556040820151805160028301908190612f109082614755565b5060208201516001820190612f259082614755565b50604082810151600290920180546060850151608086015160a09096015160ff16600160601b0260ff60601b1963ffffffff978816600160401b02166cffffffffff000000000000000019928816600160201b0267ffffffffffffffff199094169790961696909617919091171692909217929092179055518592506001600160a01b03851691507f2e73cf09b9c19e4e10c745d6b27e0c27a3f1e88c90fd9fdb7b12590dcadbae2590612fdc9085815260200190565b60405180910390a3612fee8284613923565b505050505050565b600080600090506000604051806040016040528060168152602001756162636465664142434445463031323334353637383960501b8152509050600084905080516007146040518060400160405280601081526020016f436f6c6f722073697a652077726f6e6760801b815250906130815760405162461bcd60e51b81526004016107d49190613fd9565b5060015b81518110156131245760005b83518160ff16101561311157838160ff16815181106130b2576130b26148cb565b602001015160f81c60f81b6001600160f81b0319168383815181106130d9576130d96148cb565b01602001516001600160f81b031916036130ff57846130f781614d35565b955050613111565b8061310981614d35565b915050613091565b508061311c816148f7565b915050613085565b50600181516131339190615017565b8360ff16149350505050919050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61319f848484612a61565b6131ab84848484613941565b6122d95760405162461bcd60e51b81526004016107d4906151f2565b805160609060008190036131eb575050604080516020810190915260008152919050565b600060036131fa83600261503e565b6132049190614d21565b61320f906004614c96565b9050600061321e82602061503e565b6001600160401b0381111561323557613235614046565b6040519080825280601f01601f19166020018201604052801561325f576020820181803683370190505b509050600060405180606001604052806040815260200161584b604091399050600181016020830160005b868110156132eb576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161328a565b506003860660018114613305576002811461331657613322565b613d3d60f01b600119830152613322565b603d60f81b6000198301525b505050918152949350505050565b60606000601160008481526020019081526020016000206002016040518060c0016040529081600082018054613365906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054613391906146a0565b80156133de5780601f106133b3576101008083540402835291602001916133de565b820191906000526020600020905b8154815290600101906020018083116133c157829003601f168201915b505050505081526020016001820180546133f7906146a0565b80601f0160208091040260200160405190810160405280929190818152602001828054613423906146a0565b80156134705780601f1061344557610100808354040283529160200191613470565b820191906000526020600020905b81548152906001019060200180831161345357829003601f168201915b50505091835250506002919091015463ffffffff8082166020840152600160201b820481166040840152600160401b8204166060830152600160601b900460ff1660809091015290506134c1613f0f565b6134d58260400151600761112191906149e1565b6134e98360400151600161112191906149e1565b6134fd8460400151600361112191906149e1565b60405160200161350f93929190615244565b60408051808303601f19018152919052815281516020830151606084015161353c9063ffffffff166127a2565b61354f856080015163ffffffff166127a2565b6040516020016135629493929190615359565b60408051808303601f190181529190526020820152613580846127a2565b600085815260116020526040902080546135a5919061359e906146a0565b90506127a2565b6135b58460a0015160ff166127a2565b6000878152601160205260409020600101546135d9906001600160a01b0316613a42565b6040516020016135ec94939291906154c6565b60408051808303601f190181529181528281018290528251602080850151925161361a9492939291016155f7565b60405160208183030381529060405292505050919050565b60606000829050600081516001600160401b0381111561365457613654614046565b6040519080825280601f01601f19166020018201604052801561367e576020820181803683370190505b50905060005b825181101561378c5760418382815181106136a1576136a16148cb565b016020015160f81c108015906136d15750605a8382815181106136c6576136c66148cb565b016020015160f81c11155b15613733578281815181106136e8576136e86148cb565b602001015160f81c60f81b60f81c60206137029190614cad565b60f81b828281518110613717576137176148cb565b60200101906001600160f81b031916908160001a90535061377a565b828181518110613745576137456148cb565b602001015160f81c60f81b828281518110613762576137626148cb565b60200101906001600160f81b031916908160001a9053505b80613784816148f7565b915050613684565b509392505050565b6001600160a01b0383166137ef576137ea81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613812565b816001600160a01b0316836001600160a01b031614613812576138128382613b89565b6001600160a01b0382166138295761090981613c26565b826001600160a01b0316826001600160a01b031614610909576109098282613cd5565b600081815b81518160ff1610156139195760126138a6838360ff1681518110613877576138776148cb565b602001015160f81c60f81b60405160200161389291906149cc565b604051602081830303815290604052613632565b6040516138b39190614830565b90815260200160405180910390206040516020016138d191906148bf565b60408051601f19818403018152828252805160209182012060008452908301918290529151902003613907575060009392505050565b8061391181614d35565b915050613851565b5060019392505050565b61393d828260405180602001604052806000815250613d19565b5050565b60006001600160a01b0384163b15613a3757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061398590339089908890889060040161566c565b6020604051808303816000875af19250505080156139c0575060408051601f3d908101601f191682019092526139bd918101906156a9565b60015b613a1d573d8080156139ee576040519150601f19603f3d011682016040523d82523d6000602084013e6139f3565b606091505b508051600003613a155760405162461bcd60e51b81526004016107d4906151f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506128a2565b506001949350505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015613b82576000613a7f826013615017565b613a8a906008614c96565b613a959060026157aa565b613aa8906001600160a01b038716614d21565b60f81b9050600060108260f81c613abf91906157b6565b60f81b905060008160f81c6010613ad691906157d8565b8360f81c613ae491906157f4565b60f81b9050613af282613d4c565b85613afe866002614c96565b81518110613b0e57613b0e6148cb565b60200101906001600160f81b031916908160001a905350613b2e81613d4c565b85613b3a866002614c96565b613b4590600161503e565b81518110613b5557613b556148cb565b60200101906001600160f81b031916908160001a9053505050508080613b7a906148f7565b915050613a69565b5092915050565b60006001613b9684611cd0565b613ba09190615017565b600083815260076020526040902054909150808214613bf3576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613c3890600190615017565b60008381526009602052604081205460088054939450909284908110613c6057613c606148cb565b906000526020600020015490508060088381548110613c8157613c816148cb565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613cb957613cb961580d565b6001900381819060005260206000200160009055905550505050565b6000613ce083611cd0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b613d238383613d87565b613d306000848484613941565b6109095760405162461bcd60e51b81526004016107d4906151f2565b6000600a60f883901c1015613d7357613d6a60f883901c6030614cad565b60f81b92915050565b613d6a60f883901c6057614cad565b919050565b6001600160a01b038216613ddd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d4565b6000818152600260205260409020546001600160a01b031615613e425760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d4565b613e4e60008383613794565b6001600160a01b0382166000908152600360205260408120805460019290613e7790849061503e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b508054613ee1906146a0565b6000825580601f10613ef1575050565b601f016020900490600052602060002090810190610a419190613f36565b60405180606001604052806003905b6060815260200190600190039081613f1e5790505090565b5b80821115613f4b5760008155600101613f37565b5090565b6001600160e01b031981168114610a4157600080fd5b600060208284031215613f7757600080fd5b8135613f8281613f4f565b9392505050565b60005b83811015613fa4578181015183820152602001613f8c565b50506000910152565b60008151808452613fc5816020860160208601613f89565b601f01601f19169290920160200192915050565b602081526000613f826020830184613fad565b600060208284031215613ffe57600080fd5b5035919050565b80356001600160a01b0381168114613d8257600080fd5b6000806040838503121561402f57600080fd5b61403883614005565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561408457614084614046565b604052919050565b60006001600160401b038311156140a5576140a5614046565b6140b8601f8401601f191660200161405c565b90508281528383830111156140cc57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126140f457600080fd5b613f828383356020850161408c565b60006020828403121561411557600080fd5b81356001600160401b0381111561412b57600080fd5b6128a2848285016140e3565b60006001600160401b0382111561415057614150614046565b5060051b60200190565b600082601f83011261416b57600080fd5b8135602061418061417b83614137565b61405c565b82815260059290921b8401810191818101908684111561419f57600080fd5b8286015b848110156141de5780356001600160401b038111156141c25760008081fd5b6141d08986838b01016140e3565b8452509183019183016141a3565b509695505050505050565b600080604083850312156141fc57600080fd5b82356001600160401b038082111561421357600080fd5b61421f8683870161415a565b9350602085013591508082111561423557600080fd5b506142428582860161415a565b9150509250929050565b63ffffffff88811682528716602082015260408101869052606081018590526001600160a01b038416608082015282151560a082015260e060c0820181905260009061429a90830184613fad565b9998505050505050505050565b600080604083850312156142ba57600080fd5b8235915060208301356001600160401b038111156142d757600080fd5b614242858286016140e3565b6000806000606084860312156142f857600080fd5b61430184614005565b925061430f60208501614005565b9150604084013590509250925092565b600082601f83011261433057600080fd5b8135602061434061417b83614137565b82815260059290921b8401810191818101908684111561435f57600080fd5b8286015b848110156141de5780358352918301918301614363565b60008060006060848603121561438f57600080fd5b83356001600160401b03808211156143a657600080fd5b6143b28783880161431f565b945060208601359150808211156143c857600080fd5b6143d4878388016140e3565b935060408601359150808211156143ea57600080fd5b506143f7868287016140e3565b9150509250925092565b803563ffffffff81168114613d8257600080fd5b6000806000806080858703121561442b57600080fd5b8435935061443b60208601614401565b92506040850135915061445060608601614401565b905092959194509250565b60008060006060848603121561447057600080fd5b83356001600160401b0381111561448657600080fd5b6144928682870161431f565b9350506144a160208501614401565b91506144af60408501614401565b90509250925092565b6000602082840312156144ca57600080fd5b613f8282614005565b600080604083850312156144e657600080fd5b82356001600160401b038111156144fc57600080fd5b6145088582860161431f565b92505061451760208401614401565b90509250929050565b6060815260006145336060830186613fad565b6001600160a01b03851660208401528281036040840152835160c080835261455d90830182613fad565b9050602085015182820360208401526145768282613fad565b915050604085015163ffffffff8082166040850152806060880151166060850152806080880151166080850152505060ff60a08601511660a08301528092505050949350505050565b600080604083850312156145d257600080fd5b6145db83614005565b9150602083013580151581146145f057600080fd5b809150509250929050565b6000806000806080858703121561461157600080fd5b61461a85614005565b935061462860208601614005565b92506040850135915060608501356001600160401b0381111561464a57600080fd5b8501601f8101871361465b57600080fd5b61466a8782356020840161408c565b91505092959194509250565b6000806040838503121561468957600080fd5b61469283614005565b915061451760208401614005565b600181811c908216806146b457607f821691505b6020821081036146d457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f82111561090957600081815260208120601f850160051c810160208610156147365750805b601f850160051c820191505b81811015612fee57828155600101614742565b81516001600160401b0381111561476e5761476e614046565b6147828161477c84546146a0565b8461470f565b602080601f8311600181146147b7576000841561479f5750858301515b600019600386901b1c1916600185901b178555612fee565b600085815260208120601f198616915b828110156147e6578886015182559484019460019091019084016147c7565b50858210156148045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008151614826818560208601613f89565b9290920192915050565b60008251614842818460208701613f89565b9190910192915050565b60008154614859816146a0565b600182811680156148715760018114614886576148b5565b60ff19841687528215158302870194506148b5565b8560005260208060002060005b858110156148ac5781548a820152908401908201614893565b50505082870194505b5050505092915050565b6000613f82828461484c565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201614909576149096148e1565b5060010190565b600081518084526020808501808196508360051b8101915082860160005b85811015614958578284038952614946848351613fad565b9885019893509084019060010161492e565b5091979650505050505050565b6040815260006149786040830185614910565b828103602084015261498a8185614910565b95945050505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806149c0576149c0614993565b92169190910692915050565b6001600160f81b031991909116815260010190565b63ffffffff818116838216028082169190828114614a0157614a016148e1565b505092915050565b600063ffffffff808316818103614a2257614a226148e1565b6001019392505050565b63ffffffff818116838216019080821115613b8257613b826148e1565b7f3c616e696d617465206174747269627574654e616d653d2766696c6c2720000081526776616c7565733d2760c01b601e82015260008351614a92816026850160208801613f89565b6627206475723d2760c81b6026918401918201528351614ab981602d840160208801613f89565b6a6d732720626567696e3d2760a81b602d9290910191820152603801949350505050565b63ffffffff828116828216039080821115613b8257613b826148e1565b60008451614b0c818460208901613f89565b636d733b6160e01b9083019081528451614b2d816004840160208901613f89565b642e656e642b60d81b600492909101918201528351614b53816009840160208801613f89565b6c36b9939034b21e93b09813979f60991b6009929091019182015260160195945050505050565b60008451614b8c818460208901613f89565b845190830190614ba0818360208901613f89565b8451910190614bb3818360208801613f89565b0195945050505050565b606160f81b815260008451614bd9816001850160208901613f89565b642e656e642b60d81b6001918401918201528451614bfe816006840160208901613f89565b686d73272069643d276160b81b600692909101918201528351614c2881600f840160208801613f89565b6213979f60e91b600f929091019182015260120195945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b80820281158282048414176106c7576106c76148e1565b60ff81811683821601908111156106c7576106c76148e1565b815160009082906020808601845b83811015614cf057815185529382019390820190600101614cd4565b50929695505050505050565b604081526000614d0f6040830185613fad565b828103602084015261498a8185613fad565b600082614d3057614d30614993565b500490565b600060ff821660ff8103614d4b57614d4b6148e1565b60010192915050565b7f2265787465726e616c5f75726c22203a207b2274797065223a2022737472696e81527233911610113232b9b1b934b83a34b7b7111d1160691b60208201526000614da2603383018561484c565b602f60f81b81528351614dbc816001840160208801613f89565b62089f4b60ea1b60019290910191820152600401949350505050565b607b60f81b815275227469746c65223a20224d6f72736520436f6465202360501b60018201528651600090614e14816017850160208c01613f89565b7f222c202274797065223a20226f626a656374222c202270726f7065727469657360179184019182015263223a207b60e01b60378201528751614e5e81603b840160208c01613f89565b7f226e616d65223a7b2274797065223a22737472696e67222c2022646573637269603b929091019182015267383a34b7b7111d1160c11b605b8201528651614ead816063840160208b01613f89565b614f93614f8d614f7f614f79614f1a614f146063878901017f227d2c226465736372697074696f6e223a7b2274797065223a22737472696e6781527f222c20226465736372697074696f6e223a224d6f72736520636f64653a2000006020820152603e0190565b8c614814565b7f227d2c22696d616765223a7b202274797065223a22737472696e67222c20226481527f65736372697074696f6e223a22646174613a696d6167652f7376672b786d6c3b60208201526618985cd94d8d0b60ca1b604082015260470190565b89614814565b61227d60f01b815260020190565b86614814565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614fd981601d850160208701613f89565b91909101601d0192915050565b60008351614ff8818460208801613f89565b6150048184018561484c565b600160fd1b815260010195945050505050565b818103818111156106c7576106c76148e1565b60008261503957615039614993565b500690565b808201808211156106c7576106c76148e1565b7f3c73766720646174612d762d32303837323034363d27272076657273696f6e3d81527f27312e312720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3260208201527f3030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f77777760408201527f2e77332e6f72672f313939392f786c696e6b2720783d273070782720793d27306060820152700383c13903b34b2bba137bc1e939810181607d1b608082015260008651615115816091850160208b01613f89565b600160fd1b6091918401918201528651615136816092840160208b01613f89565b6151976151916092838501017f2720786d6c3a73706163653d277072657365727665272069643d27647261776981527f6e67273e3c7265637420783d27302720793d2730272077696474683d270000006020820152603d0190565b88614814565b9150506151b0816927206865696768743d2760b01b9052565b6151bd600a820186614814565b67272066696c6c3d2760c01b815290506151da6008820185614814565b6213901f60e91b815260030198975050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f7b2274726169745f74797065223a22536c617368222c202276616c7565223a0081526000845161527c81601f850160208901613f89565b80830190507f2c2022646973706c61795f74797065223a226e756d626572227d2c207b22747280601f8301527f6169745f74797065223a22446974222c202276616c7565223a00000000000000603f83015285516152e1816058850160208a01613f89565b60589201918201527f6169745f74797065223a22446168222c202276616c7565223a0000000000000060788201528351615322816091840160208801613f89565b7f2c2022646973706c61795f74797065223a226e756d626572227d0000000000006091929091019182015260ab0195945050505050565b7f2c7b2274726169745f74797065223a22436f6c6f72204f4646222c202276616c8152643ab2911d1160d91b60208201526000855161539f816025850160208a01613f89565b7f227d2c207b2274726169745f74797065223a22436f6c6f72204f4e222c2022766025918401918201526630b63ab2911d1160c91b604582015285516153ec81604c840160208a01613f89565b7f227d2c207b2274726169745f74797065223a22686569676874222c202276616c604c9290910191820152633ab2911d60e11b606c8201528451615437816070840160208901613f89565b7f2c2022646973706c61795f74797065223a226e756d626572227d2c207b227472607092909101918201527f6169745f74797065223a227769647468222c202276616c7565223a0000000000609082015261549560ab820185614814565b7f2c2022646973706c61795f74797065223a226e756d626572227d0000000000008152601a01979650505050505050565b7f2c7b2274726169745f74797065223a224944222c2276616c7565223a000000008152600085516154fe81601c850160208a01613f89565b80830190507f2c2022646973706c61795f74797065223a226e756d626572227d2c207b22747280601c8301527f6169745f74797065223a224c656e677468222c2276616c7565223a0000000000603c8301528651615563816057850160208b01613f89565b605792019182018190527f6169745f74797065223a224c6576656c222c2276616c7565223a000000000000607783015285516155a6816091850160208a01613f89565b60919201918201527f6169745f74797065223a224d696e746564206279222c2276616c7565223a220060b18201526155e160d0820185614814565b61227d60f01b8152600201979650505050505050565b6e2c2261747472696275746573223a5b60881b8152835160009061562281600f850160208901613f89565b84519083019061563981600f840160208901613f89565b845191019061564f81600f840160208801613f89565b625d7d7d60e81b600f929091019182015260120195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061569f90830184613fad565b9695505050505050565b6000602082840312156156bb57600080fd5b8151613f8281613f4f565b600181815b808511156157015781600019048211156156e7576156e76148e1565b808516156156f457918102915b93841c93908002906156cb565b509250929050565b600082615718575060016106c7565b81615725575060006106c7565b816001811461573b576002811461574557615761565b60019150506106c7565b60ff841115615756576157566148e1565b50506001821b6106c7565b5060208310610133831016604e8410600b8410161715615784575081810a6106c7565b61578e83836156c6565b80600019048211156157a2576157a26148e1565b029392505050565b6000613f828383615709565b600060ff8316806157c9576157c9614993565b8060ff84160491505092915050565b60ff8181168382160290811690818114613b8257613b826148e1565b60ff82811682821603908111156106c7576106c76148e1565b634e487b7160e01b600052603160045260246000fdfe496e707574206e6f742076616c69642e2052656d6f7665206e6f742076616c69642063686172734142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212209b5075e00dbe409ba7d1b3e190de4ca72c85cc5e1c142784ad9aa5ebe935763764736f6c63430008120033

Deployed Bytecode Sourcemap

44524:19376:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38351:224;;;;;;;;;;-1:-1:-1;38351:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;38351:224:0;;;;;;;;25465:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27024:221::-;;;;;;;;;;-1:-1:-1;27024:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;27024:221:0;1555:203:1;26547:411:0;;;;;;;;;;-1:-1:-1;26547:411:0;;;;;:::i;:::-;;:::i;:::-;;59805:173;;;;;;;;;;-1:-1:-1;59805:173:0;;;;;:::i;:::-;;:::i;61886:168::-;;;;;;;;;;-1:-1:-1;61886:168:0;;;;;:::i;:::-;;:::i;61499:338::-;;;;;;;;;;-1:-1:-1;61499:338:0;;;;;:::i;:::-;;:::i;38991:113::-;;;;;;;;;;-1:-1:-1;39079:10:0;:17;38991:113;;;5421:25:1;;;5409:2;5394:18;38991:113:0;5275:177:1;45891:45:0;;;;;;;;;;-1:-1:-1;45891:45:0;;;;;:::i;:::-;;:::i;45813:20::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;49771:2087::-;;;;;;;;;;-1:-1:-1;49771:2087:0;;;;;:::i;:::-;;:::i;27914:339::-;;;;;;;;;;-1:-1:-1;27914:339:0;;;;;:::i;:::-;;:::i;38659:256::-;;;;;;;;;;-1:-1:-1;38659:256:0;;;;;:::i;:::-;;:::i;49156:113::-;;;;;;;;;;-1:-1:-1;49156:113:0;;;;;:::i;:::-;;:::i;59273:211::-;;;;;;;;;;;;;:::i;28324:185::-;;;;;;;;;;-1:-1:-1;28324:185:0;;;;;:::i;:::-;;:::i;39181:233::-;;;;;;;;;;-1:-1:-1;39181:233:0;;;;;:::i;:::-;;:::i;49277:115::-;;;;;;:::i;:::-;;:::i;56835:900::-;;;;;;:::i;:::-;;:::i;59986:1093::-;;;;;;;;;;-1:-1:-1;59986:1093:0;;;;;:::i;:::-;;:::i;25159:239::-;;;;;;;;;;-1:-1:-1;25159:239:0;;;;;:::i;:::-;;:::i;58409:856::-;;;;;;:::i;:::-;;:::i;59492:169::-;;;;;;;;;;-1:-1:-1;59492:169:0;;;;;:::i;:::-;;:::i;24889:208::-;;;;;;;;;;-1:-1:-1;24889:208:0;;;;;:::i;:::-;;:::i;9857:94::-;;;;;;;;;;;;;:::i;9206:87::-;;;;;;;;;;-1:-1:-1;9279:6:0;;-1:-1:-1;;;;;9279:6:0;9206:87;;57743:658;;;;;;:::i;:::-;;:::i;25634:104::-;;;;;;;;;;;;;:::i;45842:42::-;;;;;;;;;;-1:-1:-1;45842:42:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;27317:295::-;;;;;;;;;;-1:-1:-1;27317:295:0;;;;;:::i;:::-;;:::i;28580:328::-;;;;;;;;;;-1:-1:-1;28580:328:0;;;;;:::i;:::-;;:::i;59669:128::-;;;;;;;;;;;;;:::i;53738:1099::-;;;;;;;;;;-1:-1:-1;53738:1099:0;;;;;:::i;:::-;;:::i;49400:363::-;;;;;;;;;;-1:-1:-1;49400:363:0;;;;;:::i;:::-;;:::i;27683:164::-;;;;;;;;;;-1:-1:-1;27683:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27804:25:0;;;27780:4;27804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27683:164;10106:192;;;;;;;;;;-1:-1:-1;10106:192:0;;;;;:::i;:::-;;:::i;38351:224::-;38453:4;-1:-1:-1;;;;;;38477:50:0;;-1:-1:-1;;;38477:50:0;;:90;;;38531:36;38555:11;38531:23;:36::i;:::-;38470:97;38351:224;-1:-1:-1;;38351:224:0:o;25465:100::-;25519:13;25552:5;25545:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25465:100;:::o;27024:221::-;27100:7;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;27120:73;;;;-1:-1:-1;;;27120:73:0;;13121:2:1;27120:73:0;;;13103:21:1;13160:2;13140:18;;;13133:30;13199:34;13179:18;;;13172:62;-1:-1:-1;;;13250:18:1;;;13243:42;13302:19;;27120:73:0;;;;;;;;;-1:-1:-1;27213:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27213:24:0;;27024:221::o;26547:411::-;26628:13;26644:23;26659:7;26644:14;:23::i;:::-;26628:39;;26692:5;-1:-1:-1;;;;;26686:11:0;:2;-1:-1:-1;;;;;26686:11:0;;26678:57;;;;-1:-1:-1;;;26678:57:0;;13534:2:1;26678:57:0;;;13516:21:1;13573:2;13553:18;;;13546:30;13612:34;13592:18;;;13585:62;-1:-1:-1;;;13663:18:1;;;13656:31;13704:19;;26678:57:0;13332:397:1;26678:57:0;8146:10;-1:-1:-1;;;;;26770:21:0;;;;:62;;-1:-1:-1;26795:37:0;26812:5;8146:10;27683:164;:::i;26795:37::-;26748:168;;;;-1:-1:-1;;;26748:168:0;;13936:2:1;26748:168:0;;;13918:21:1;13975:2;13955:18;;;13948:30;14014:34;13994:18;;;13987:62;14085:26;14065:18;;;14058:54;14129:19;;26748:168:0;13734:420:1;26748:168:0;26929:21;26938:2;26942:7;26929:8;:21::i;:::-;26617:341;26547:411;;:::o;59805:173::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59889:18;:33:::1;59910:12:::0;59889:18;:33:::1;:::i;:::-;;59957:12;59938:32;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;59805:173:::0;:::o;61886:168::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61987:12:::1;62000:6;61987:20;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;61965:43:::1;::::0;::::1;:::i;:::-;;;;;;;;;61979:6;61965:43;;;;;;:::i;:::-;;;;;;;;62026:12;62039:6;62026:20;;;;;;:::i;:::-;;;;;;;;;;;;;;62019:27;;;;:::i;:::-;61886:168:::0;:::o;61499:338::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;61634:12:::1;:19;61616:7;:14;:37;61607:47;;;::::0;::::1;;61670:6;61665:111;61686:7;:14;61682:1;:18;61665:111;;;61749:12;61762:1;61749:15;;;;;;;;:::i;:::-;;;;;;;61722:12;61735:7;61743:1;61735:10;;;;;;;;:::i;:::-;;;;;;;61722:24;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;:::i;:::-;-1:-1:-1::0;61702:3:0;::::1;::::0;::::1;:::i;:::-;;;;61665:111;;;;61791:38;61807:7;61816:12;61791:38;;;;;;;:::i;:::-;;;;;;;;61499:338:::0;;:::o;45891:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45813:20::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45813:20:0;;;;;-1:-1:-1;;;;;45813:20:0;;;-1:-1:-1;;;45813:20:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49771:2087::-;49866:13;49891:38;49932:7;:17;49940:8;49932:17;;;;;;;;;;;:33;;49891:74;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49891:74:0;;;-1:-1:-1;;49891:74:0;;;;;;;;;;;;;;-1:-1:-1;;;49891:74:0;;;;;;;;;;;;;-1:-1:-1;;;49891:74:0;;;;;;;;-1:-1:-1;;;49891:74:0;;;;;;;;;;;;;49990:20;;;;49891:74;50201:13;50190:8;;49990:20;;-1:-1:-1;49990:20:0;;-1:-1:-1;;50190:8:0;;-1:-1:-1;;;;;;;;50201:13:0;;;;;-1:-1:-1;50190:59:0;;50236:6;:13;-1:-1:-1;;;50236:13:0;;;;50190:59;;;50224:1;:8;50190:59;50260:25;;;;;;;;;:20;:25;;50177:72;;-1:-1:-1;50312:1:0;50296:1503;50320:3;50315:8;;:1;:8;;;50296:1503;;50349:7;50353:3;50349:1;:7;:::i;:::-;50345:11;;50414:14;50404:1;50406;50404:4;;;;;;;;;;:::i;:::-;;;;;;;;;50387:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50377:33;;;;;;:51;50373:714;;50459:8;:4;50466:1;50459:8;:::i;:::-;50448:19;-1:-1:-1;50486:7:0;;;;:::i;:::-;;;;50373:714;;;50582:14;50572:1;50574;50572:4;;;;;;;;;;:::i;:::-;;;;;;;;;50555:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50545:33;;;;;;:51;50541:546;;50627:8;:4;50634:1;50627:8;:::i;50541:546::-;50750:14;50740:1;50742;50740:4;;;;;;;;;;:::i;:::-;;;;;;;;;50723:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50713:33;;;;;;:51;50709:378;;50795:8;:4;50802:1;50795:8;:::i;:::-;50784:19;-1:-1:-1;50822:17:0;50784:19;50822:17;;:::i;:::-;;;50858:8;;50709:378;50955:14;50945:1;50947;50945:4;;;;;;;;;;:::i;:::-;;;;;;;;;50928:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50918:33;;;;;;:51;50914:173;;51000:8;:4;51007:1;51000:8;:::i;50914:173::-;51103:20;51184:15;:23;;;51218:18;51227:8;51218:18;;:8;:18::i;:::-;51126:125;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51126:125:0;;;;;;;51266:25;;;;;:20;:25;;;51126:125;;-1:-1:-1;51310:6:0;;;;;51306:456;;51359:14;51368:4;51359:14;;:8;:14::i;:::-;51381:19;51390:9;51398:1;51390:5;:9;:::i;:::-;51381:19;;:8;:19::i;:::-;51409:27;51430:5;51418:9;:4;51425:2;51418:9;:::i;:::-;:17;;;;:::i;51409:27::-;51345:108;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51336:117;;51495:6;51503;51511;51481:37;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51472:46;;51306:456;;;51598:17;51607:7;51613:1;51607:5;:7;:::i;51598:17::-;51624:22;51633:12;51640:5;51633:4;:12;:::i;51624:22::-;51659:15;51668:5;51659:15;;:8;:15::i;:::-;51580:101;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51571:110;;51723:6;51731;51739;51709:37;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51700:46;;51306:456;51786:1;51778:9;;50330:1469;;50296:1503;50325:3;;;;:::i;:::-;;;;50296:1503;;;;51818:32;51826:6;51834:15;51818:7;:32::i;:::-;51811:39;49771:2087;-1:-1:-1;;;;;;;;;;;;49771:2087:0:o;27914:339::-;28109:41;8146:10;28142:7;28109:18;:41::i;:::-;28101:103;;;;-1:-1:-1;;;28101:103:0;;;;;;;:::i;:::-;28217:28;28227:4;28233:2;28237:7;28217:9;:28::i;38659:256::-;38756:7;38792:23;38809:5;38792:16;:23::i;:::-;38784:5;:31;38776:87;;;;-1:-1:-1;;;38776:87:0;;25809:2:1;38776:87:0;;;25791:21:1;25848:2;25828:18;;;25821:30;25887:34;25867:18;;;25860:62;-1:-1:-1;;;25938:18:1;;;25931:41;25989:19;;38776:87:0;25607:407:1;38776:87:0;-1:-1:-1;;;;;;38881:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38659:256::o;49156:113::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;12145:1:::1;12741:7;;:19:::0;12733:63:::1;;;::::0;-1:-1:-1;;;12733:63:0;;26221:2:1;12733:63:0::1;::::0;::::1;26203:21:1::0;26260:2;26240:18;;;26233:30;26299:33;26279:18;;;26272:61;26350:18;;12733:63:0::1;26019:355:1::0;12733:63:0::1;12145:1;12874:7;:18:::0;49241:20:::2;49249:5:::0;49256:4:::2;49241:7;:20::i;:::-;-1:-1:-1::0;12101:1:0::1;13053:7;:22:::0;49156:113::o;59273:211::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59380:16;;59372:42:::1;::::0;59340:21:::1;::::0;-1:-1:-1;;;;;59380:16:0::1;::::0;59372:42;::::1;;;::::0;59340:21;;59323:14:::1;59372:42:::0;59323:14;59372:42;59340:21;59380:16;59372:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;59451:16:0;;59430:46:::1;::::0;5421:25:1;;;-1:-1:-1;;;;;59451:16:0;;::::1;::::0;59439:10:::1;::::0;59430:46:::1;::::0;5409:2:1;5394:18;59430:46:0::1;;;;;;;59312:172;59273:211::o:0;28324:185::-;28462:39;28479:4;28485:2;28489:7;28462:39;;;;;;;;;;;;:16;:39::i;39181:233::-;39256:7;39292:30;39079:10;:17;;38991:113;39292:30;39284:5;:38;39276:95;;;;-1:-1:-1;;;39276:95:0;;26581:2:1;39276:95:0;;;26563:21:1;26620:2;26600:18;;;26593:30;26659:34;26639:18;;;26632:62;-1:-1:-1;;;26710:18:1;;;26703:42;26762:19;;39276:95:0;26379:408:1;39276:95:0;39389:10;39400:5;39389:17;;;;;;;;:::i;:::-;;;;;;;;;39382:24;;39181:233;;;:::o;49277:115::-;12145:1;12741:7;;:19;12733:63;;;;-1:-1:-1;;;12733:63:0;;26221:2:1;12733:63:0;;;26203:21:1;26260:2;26240:18;;;26233:30;26299:33;26279:18;;;26272:61;26350:18;;12733:63:0;26019:355:1;12733:63:0;12145:1;12874:7;:18;49363:21:::1;49371:5:::0;49378::::1;49363:7;:21::i;56835:900::-:0;56978:13;;56993:18;;;;;;;;;;;;-1:-1:-1;;;56993:18:0;;;;;-1:-1:-1;;;56978:13:0;;;;56977:14;56969:43;;;;-1:-1:-1;;;56969:43:0;;;;;;;;:::i;:::-;-1:-1:-1;57067:17:0;;57044:20;;:40;;57067:17;57044:40;:::i;:::-;57031:9;:53;57086:16;;;;;;;;;;;;;-1:-1:-1;;;57086:16:0;;;57023:80;;;;;-1:-1:-1;;;57023:80:0;;;;;;;;:::i;:::-;;57190:9;57173:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;57163:38;;;;;;57149:8;57132:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;57122:37;;;;;;:79;;:106;;;;;57205:23;57219:8;57205:13;:23::i;:::-;57122:134;;;;;57232:24;57246:9;57232:13;:24::i;:::-;57258:9;;;;;;;;;;;;;;;;;57114:154;;;;;-1:-1:-1;;;57114:154:0;;;;;;;;:::i;:::-;;57286:9;57281:381;57305:13;:20;57301:1;:24;57281:381;;;57346:15;57364:13;57378:1;57364:16;;;;;;;;:::i;:::-;;;;;;;57346:34;;57419:10;-1:-1:-1;;;;;57399:30:0;:16;57407:7;57399;:16::i;:::-;-1:-1:-1;;;;;57399:30:0;;57395:256;;57449:16;;;;:7;:16;;;;;:32;;:53;57493:9;57449:32;:53;:::i;:::-;-1:-1:-1;57521:16:0;;;;:7;:16;;;;;:40;;:51;57564:8;57521:40;:51;:::i;:::-;-1:-1:-1;57591:16:0;;;;:7;:16;;;;;:38;;:44;;57633:2;;57591:38;;;:44;;57633:2;;-1:-1:-1;;;57591:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57395:256;-1:-1:-1;57327:3:0;;;;:::i;:::-;;;;57281:381;;;;57692:13;57679:48;;;;;;:::i;:::-;;;;;;;;;57707:8;57717:9;57679:48;;;;;;;:::i;:::-;;;;;;;;56835:900;;;:::o;59986:1093::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;60193:16;;:42;::::1;;;-1:-1:-1::0;60213:22:0::1;::::0;::::1;::::0;60193:42:::1;:74;;;;-1:-1:-1::0;60239:28:0;;60193:74:::1;:90;;;;-1:-1:-1::0;60271:12:0::1;::::0;::::1;::::0;60193:90:::1;60189:789;;;60319:1;60299:17:::0;:21;;;:6:::1;60335:27:::0;;60377:29;:33;;;;-1:-1:-1;;60425:17:0;;;;;60189:789:::1;;;60543:15:::0;;60539:86:::1;;60578:17:::0;:31;;;60539:86:::1;60643:21;::::0;::::1;::::0;60639:104:::1;;60684:6;:43:::0;;-1:-1:-1;;60684:43:0::1;;::::0;::::1;;::::0;;60639:104:::1;60761:27:::0;;60757:122:::1;;60808:29:::0;:55;;;60757:122:::1;60897:11;::::0;::::1;::::0;60893:74:::1;;60928:6;:23:::0;;-1:-1:-1;;60928:23:0::1;-1:-1:-1::0;;;60928:23:0::1;::::0;::::1;;;::::0;;60893:74:::1;61047:23;61028:17;60995:76;;61015:11;60995:76;;;;;;;;;;59986:1093:::0;;;;:::o;25159:239::-;25231:7;25267:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25267:16:0;;25294:73;;;;-1:-1:-1;;;25294:73:0;;28278:2:1;25294:73:0;;;28260:21:1;28317:2;28297:18;;;28290:30;28356:34;28336:18;;;28329:62;-1:-1:-1;;;28407:18:1;;;28400:39;28456:19;;25294:73:0;28076:405:1;58409:856:0;58529:13;;58544:18;;;;;;;;;;;;-1:-1:-1;;;58544:18:0;;;;;-1:-1:-1;;;58529:13:0;;;;58528:14;58520:43;;;;-1:-1:-1;;;58520:43:0;;;;;;;;:::i;:::-;;58592:3;58582:7;:13;;;:33;;;;;58609:6;58599:7;:16;;;58582:33;:49;;;;;58628:3;58619:6;:12;;;58582:49;:68;;;;;58644:6;58635;:15;;;58582:68;:95;;;;;58676:1;58653:13;:20;:24;58582:95;58679:14;;;;;;;;;;;;;-1:-1:-1;;;58679:14:0;;;58574:120;;;;;-1:-1:-1;;;58574:120:0;;;;;;;;:::i;:::-;;58790:5;58769:6;:17;;;58760:6;58727:39;;58750:7;58727:30;;:13;:20;:30;;;;:::i;:::-;:39;;;;:::i;:::-;:59;;;;:::i;:::-;58726:69;;;;:::i;:::-;58713:9;:82;58797:16;;;;;;;;;;;;;-1:-1:-1;;;58797:16:0;;;58705:109;;;;;-1:-1:-1;;;58705:109:0;;;;;;;;:::i;:::-;;58830:9;58825:374;58849:13;:20;58845:1;:24;58825:374;;;58890:15;58908:13;58922:1;58908:16;;;;;;;;:::i;:::-;;;;;;;58890:34;;58963:10;-1:-1:-1;;;;;58943:30:0;:16;58951:7;58943;:16::i;:::-;-1:-1:-1;;;;;58943:30:0;;58939:249;;58993:16;;;;:7;:16;;;;;:39;;:49;;;59061:47;;;-1:-1:-1;;;59061:47:0;-1:-1:-1;;58993:49:0;;;-1:-1:-1;;;58993:49:0;59061:47;;;;-1:-1:-1;;59061:47:0;;;;;;;;;;;59169:3;;58993:39;59127:38;;:45;;59169:3;;59127:45;-1:-1:-1;;;59127:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58939:249;-1:-1:-1;58871:3:0;;;;:::i;:::-;;;;58825:374;;;;59226:13;59214:43;;;;;;:::i;:::-;;;;;;;;;;28793:10:1;28830:15;;;28812:34;;28882:15;;28877:2;28862:18;;28855:43;59214::0;;;28756:18:1;59214:43:0;28611:293:1;59492:169:0;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59582:16;;59569:43:::1;::::0;-1:-1:-1;;;;;59569:43:0;;::::1;::::0;59582:16:::1;::::0;59569:43:::1;::::0;59582:16:::1;::::0;59569:43:::1;59623:16:::0;:30;;-1:-1:-1;;;;;;59623:30:0::1;-1:-1:-1::0;;;;;59623:30:0;;;::::1;::::0;;;::::1;::::0;;59492:169::o;24889:208::-;24961:7;-1:-1:-1;;;;;24989:19:0;;24981:74;;;;-1:-1:-1;;;24981:74:0;;29111:2:1;24981:74:0;;;29093:21:1;29150:2;29130:18;;;29123:30;29189:34;29169:18;;;29162:62;-1:-1:-1;;;29240:18:1;;;29233:40;29290:19;;24981:74:0;28909:406:1;24981:74:0;-1:-1:-1;;;;;;25073:16:0;;;;;:9;:16;;;;;;;24889:208::o;9857:94::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;9922:21:::1;9940:1;9922:9;:21::i;:::-;9857:94::o:0;57743:658::-;57846:13;;57861:18;;;;;;;;;;;;-1:-1:-1;;;57861:18:0;;;;;-1:-1:-1;;;57846:13:0;;;;57845:14;57837:43;;;;-1:-1:-1;;;57837:43:0;;;;;;;;:::i;:::-;-1:-1:-1;57935:17:0;;57912:20;;:40;;57935:17;57912:40;:::i;:::-;57899:9;:53;57954:16;;;;;;;;;;;;;-1:-1:-1;;;57954:16:0;;;57891:80;;;;;-1:-1:-1;;;57891:80:0;;;;;;;;:::i;:::-;;57999:1;57991:5;:9;;;:27;;;;;58012:6;58004:5;:14;;;57991:27;58020:14;;;;;;;;;;;;;-1:-1:-1;;;58020:14:0;;;57982:53;;;;;-1:-1:-1;;;57982:53:0;;;;;;;;:::i;:::-;;58051:9;58046:299;58070:13;:20;58066:1;:24;58046:299;;;58111:15;58129:13;58143:1;58129:16;;;;;;;;:::i;:::-;;;;;;;58111:34;;58184:10;-1:-1:-1;;;;;58164:30:0;:16;58172:7;58164;:16::i;:::-;-1:-1:-1;;;;;58164:30:0;;58160:174;;58214:16;;;;:7;:16;;;;;:37;;:45;;-1:-1:-1;;58214:45:0;;;;;;;;-1:-1:-1;;;58278:40:0;;;;;:38;:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;58160:174;-1:-1:-1;58092:3:0;;;;:::i;:::-;;;;58046:299;;;;58372:13;58360:33;;;;;;:::i;:::-;;;;;;;;;29675:10:1;29663:23;;29645:42;;58360:33:0;;;29633:2:1;29618:18;58360:33:0;;;;;;;57743:658;;:::o;25634:104::-;25690:13;25723:7;25716:14;;;;;:::i;45842:42::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45842:42:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45842:42:0;;;-1:-1:-1;;45842:42:0;;;;;;;;;;;;;;-1:-1:-1;;;45842:42:0;;;;;;;;-1:-1:-1;;;45842:42:0;;;;;;;-1:-1:-1;;;45842:42:0;;;;;;;;;;-1:-1:-1;45842:42:0;:::o;27317:295::-;8146:10;-1:-1:-1;;;;;27420:24:0;;;27412:62;;;;-1:-1:-1;;;27412:62:0;;29900:2:1;27412:62:0;;;29882:21:1;29939:2;29919:18;;;29912:30;29978:27;29958:18;;;29951:55;30023:18;;27412:62:0;29698:349:1;27412:62:0;8146:10;27487:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27487:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27487:53:0;;;;;;;;;;27556:48;;540:41:1;;;27487:42:0;;8146:10;27556:48;;513:18:1;27556:48:0;;;;;;;27317:295;;:::o;28580:328::-;28755:41;8146:10;28788:7;28755:18;:41::i;:::-;28747:103;;;;-1:-1:-1;;;28747:103:0;;;;;;;:::i;:::-;28861:39;28875:4;28881:2;28885:7;28894:5;28861:13;:39::i;:::-;28580:328;;;;:::o;59669:128::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;59739:13;;;::::1;-1:-1:-1::0;;;59739:13:0;;::::1;::::0;::::1;59738:14;59722:30:::0;::::1;-1:-1:-1::0;;;;59722:30:0;;::::1;::::0;;;::::1;::::0;;;;59768:21:::1;::::0;::::1;::::0;::::1;::::0;59775:13;::::1;::::0;;::::1;565:14:1::0;558:22;540:41;;528:2;513:18;;400:187;59768:21:0::1;;;;;;;;59669:128::o:0;53738:1099::-;53804:13;53850;39079:10;:17;;38991:113;53850:13;53838:8;:25;;53865:14;;;;;;;;;;;;;;;;;53830:50;;;;;-1:-1:-1;;;53830:50:0;;;;;;;;:::i;:::-;-1:-1:-1;53891:18:0;53912:17;;;:7;:17;;;;;53891:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53945:25;53973:15;53983:4;53973:9;:15::i;:::-;53945:43;;53999:17;54019:40;54037:8;54047:11;54019:17;:40::i;:::-;54070:22;;;;;;;;;:17;:22;;54117:36;;53999:60;;-1:-1:-1;54070:22:0;54158:13;;54117:36;;54134:18;;54117:36;;:::i;:::-;;;;;;;;;;;;;54107:47;;;;;;:64;54103:218;;54261:18;54284;54293:8;54284;:18::i;:::-;54193:116;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54187:122;;54103:218;54331:18;54352:394;54426:18;54435:8;54426;:18::i;:::-;54485:3;54532:4;54602:11;54689:25;54709:3;54689:13;:25::i;:::-;54722:20;54733:8;54722:10;:20::i;:::-;54379:364;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54352:13;:394::i;:::-;54331:415;;54823:4;54773:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;54759:70;;;;;;;53738:1099;;;:::o;49400:363::-;49488:29;;;;;;;;;:24;:29;;;49462:13;;49488:29;49551:15;49560:5;49551:8;:15::i;:::-;49528:39;;49583:6;49578:150;49595:1;:8;49591:1;:12;49578:150;;;49653:10;49665:12;49702:1;49704;49702:4;;;;;;;;:::i;:::-;;;;;;;;;49685:22;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49685:22:0;;;;;;;;;;49665:44;;;:::i;:::-;;;;;;;;;;;;;49639:77;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49625:91;;49605:3;;;;;:::i;:::-;;;;49578:150;;;-1:-1:-1;49745:10:0;;49400:363;-1:-1:-1;;;49400:363:0:o;10106:192::-;9279:6;;-1:-1:-1;;;;;9279:6:0;8146:10;9426:23;9418:68;;;;-1:-1:-1;;;9418:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10195:22:0;::::1;10187:73;;;::::0;-1:-1:-1;;;10187:73:0;;35267:2:1;10187:73:0::1;::::0;::::1;35249:21:1::0;35306:2;35286:18;;;35279:30;35345:34;35325:18;;;35318:62;-1:-1:-1;;;35396:18:1;;;35389:36;35442:19;;10187:73:0::1;35065:402:1::0;10187:73:0::1;10271:19;10281:8;10271:9;:19::i;24520:305::-:0;24622:4;-1:-1:-1;;;;;;24659:40:0;;-1:-1:-1;;;24659:40:0;;:105;;-1:-1:-1;;;;;;;24716:48:0;;-1:-1:-1;;;24716:48:0;24659:105;:158;;;-1:-1:-1;;;;;;;;;;23236:40:0;;;24781:36;23127:157;34400:174;34475:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34475:29:0;-1:-1:-1;;;;;34475:29:0;;;;;;;;:24;;34529:23;34475:24;34529:14;:23::i;:::-;-1:-1:-1;;;;;34520:46:0;;;;;;;;;;;34400:174;;:::o;62700:715::-;62756:13;62969:5;62978:1;62969:10;62965:53;;-1:-1:-1;;62996:10:0;;;;;;;;;;;;-1:-1:-1;;;62996:10:0;;;;;62700:715::o;62965:53::-;63043:5;63028:12;63084:78;63091:9;;63084:78;;63117:8;;;;:::i;:::-;;-1:-1:-1;63140:10:0;;-1:-1:-1;63148:2:0;63140:10;;:::i;:::-;;;63084:78;;;63172:19;63204:6;-1:-1:-1;;;;;63194:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63194:17:0;;63172:39;;63222:154;63229:10;;63222:154;;63256:11;63266:1;63256:11;;:::i;:::-;;-1:-1:-1;63325:10:0;63333:2;63325:5;:10;:::i;:::-;63312:24;;:2;:24;:::i;:::-;63299:39;;63282:6;63289;63282:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;63282:56:0;;;;;;;;-1:-1:-1;63353:11:0;63362:2;63353:11;;:::i;:::-;;;63222:154;;;63400:6;62700:715;-1:-1:-1;;;;62700:715:0:o;51866:769::-;51968:13;51993:19;52187:31;52196:15;:21;;;52187:31;;:8;:31::i;:::-;52243:32;52252:15;:22;;;52243:32;;:8;:32::i;:::-;52360:31;52369:15;:21;;;52360:31;;:8;:31::i;:::-;52425:32;52434:15;:22;;;52425:32;;:8;:32::i;:::-;52489:24;;52015:515;;;;;;;;52489:24;52015:515;;;:::i;:::-;;;;-1:-1:-1;;52015:515:0;;;;;;52541:35;;;;;;;;-1:-1:-1;;;52015:515:0;52541:35;;;;;;;52594:33;;52015:515;;-1:-1:-1;52594:33:0;;52015:515;;52615:6;;52015:515;;52594:33;;:::i;:::-;;;;;;;;;;;;;52587:40;;;;51866:769;;;;:::o;30712:348::-;30805:4;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;30822:73;;;;-1:-1:-1;;;30822:73:0;;38408:2:1;30822:73:0;;;38390:21:1;38447:2;38427:18;;;38420:30;38486:34;38466:18;;;38459:62;-1:-1:-1;;;38537:18:1;;;38530:42;38589:19;;30822:73:0;38206:408:1;30822:73:0;30906:13;30922:23;30937:7;30922:14;:23::i;:::-;30906:39;;30975:5;-1:-1:-1;;;;;30964:16:0;:7;-1:-1:-1;;;;;30964:16:0;;:51;;;;31008:7;-1:-1:-1;;;;;30984:31:0;:20;30996:7;30984:11;:20::i;:::-;-1:-1:-1;;;;;30984:31:0;;30964:51;:87;;;-1:-1:-1;;;;;;27804:25:0;;;27780:4;27804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31019:32;27683:164;33704:578;33863:4;-1:-1:-1;;;;;33836:31:0;:23;33851:7;33836:14;:23::i;:::-;-1:-1:-1;;;;;33836:31:0;;33828:85;;;;-1:-1:-1;;;33828:85:0;;38821:2:1;33828:85:0;;;38803:21:1;38860:2;38840:18;;;38833:30;38899:34;38879:18;;;38872:62;-1:-1:-1;;;38950:18:1;;;38943:39;38999:19;;33828:85:0;38619:405:1;33828:85:0;-1:-1:-1;;;;;33932:16:0;;33924:65;;;;-1:-1:-1;;;33924:65:0;;39231:2:1;33924:65:0;;;39213:21:1;39270:2;39250:18;;;39243:30;39309:34;39289:18;;;39282:62;-1:-1:-1;;;39360:18:1;;;39353:34;39404:19;;33924:65:0;39029:400:1;33924:65:0;34002:39;34023:4;34029:2;34033:7;34002:20;:39::i;:::-;34106:29;34123:1;34127:7;34106:8;:29::i;:::-;-1:-1:-1;;;;;34148:15:0;;;;;;:9;:15;;;;;:20;;34167:1;;34148:15;:20;;34167:1;;34148:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34179:13:0;;;;;;:9;:13;;;;;:18;;34196:1;;34179:13;:18;;34196:1;;34179:18;:::i;:::-;;;;-1:-1:-1;;34208:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34208:21:0;-1:-1:-1;;;;;34208:21:0;;;;;;;;;34247:27;;34208:16;;34247:27;;;;;;;33704:578;;;:::o;52643:1087::-;52723:13;;52738:18;;;;;;;;;;;;-1:-1:-1;;;52738:18:0;;;;;-1:-1:-1;;;52723:13:0;;;;52722:14;52714:43;;;;-1:-1:-1;;;52714:43:0;;;;;;;;:::i;:::-;-1:-1:-1;52785:1:0;52768:182;39079:10;:17;52788:1;:18;52768:182;;52910:5;52893:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52893:23:0;;;;;;;;;52883:34;;52893:23;52883:34;;;;52862:10;;;;:7;:10;;;;;;52883:34;;52845:33;;52862:10;52845:33;;:::i;:::-;;;;;;;;;;;;;52835:44;;;;;;:82;;52919:18;;;;;;;;;;;;;;;;;52827:111;;;;;-1:-1:-1;;;52827:111:0;;;;;;;;:::i;:::-;-1:-1:-1;52808:3:0;;;;:::i;:::-;;;;52768:182;;;-1:-1:-1;52975:19:0;;53014:8;;;;;:32;;-1:-1:-1;53033:6:0;:13;-1:-1:-1;;;53033:13:0;;;;53026:20;;53014:32;53005:42;;;;;;53058:16;53077:13;39079:10;:17;;38991:113;53077:13;:17;;53093:1;53077:17;:::i;:::-;53058:36;-1:-1:-1;8146:10:0;53154:9;:20;;53146:29;;;;;;53241:6;:23;53206:9;;53241:23;;53234:30;;:41;;;;;53269:6;53268:7;53234:41;53230:150;;;53320:29;;53313:36;;:4;:36;:::i;:::-;53300:9;:49;53351:16;;;;;;;;;;;;;-1:-1:-1;;;53351:16:0;;;53292:76;;;;;-1:-1:-1;;;53292:76:0;;;;;;;;:::i;:::-;;53230:150;53401:15;53410:5;53401:8;:15::i;:::-;53417:19;;;;;;;;;;;;;;;;;53392:45;;;;;-1:-1:-1;;;53392:45:0;;;;;;;;:::i;:::-;-1:-1:-1;53470:158:0;;;;;;;;;;;;-1:-1:-1;;;;;53470:158:0;;;;;;;;;;53527:99;;;;;;;;;;;;;;-1:-1:-1;;;53527:99:0;;;;;;;;;;;;;;;;-1:-1:-1;;;53527:99:0;;;;;;;;53586:3;53527:99;;;;53599:3;53527:99;;;;;;-1:-1:-1;;;53527:99:0;;;;-1:-1:-1;;;;53527:99:0;;;53470:158;;;;;;;53450:17;;;:7;:17;;;;;;:178;;:17;;:178;;:17;:178;:::i;:::-;-1:-1:-1;53450:178:0;;;;;;;;;-1:-1:-1;;;;;;53450:178:0;-1:-1:-1;;;;;53450:178:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53450:178:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;53450:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53450:178:0;-1:-1:-1;;;;53450:178:0;;;;-1:-1:-1;;;53450:178:0;;-1:-1:-1;;53450:178:0;;;-1:-1:-1;;;53450:178:0;-1:-1:-1;;53450:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;53646:37;53663:8;;-1:-1:-1;;;;;;53646:37:0;;;-1:-1:-1;53646:37:0;;;;53673:9;5421:25:1;;5409:2;5394:18;;5275:177;53646:37:0;;;;;;;;53694:28;53704:7;53713:8;53694:9;:28::i;:::-;52703:1027;;;;52643:1087;;:::o;56226:601::-;56293:4;56309:18;56330:1;56309:22;;56342:20;56365:31;;;;;;;;;;;;;-1:-1:-1;;;56365:31:0;;;56342:54;;56407:23;56439:5;56407:38;;56465:10;:17;56486:1;56465:22;56489:14;;;;;;;;;;;;;-1:-1:-1;;;56489:14:0;;;56456:48;;;;;-1:-1:-1;;;56456:48:0;;;;;;;;:::i;:::-;-1:-1:-1;56533:1:0;56517:247;56540:10;:17;56536:1;:21;56517:247;;;56581:7;56577:176;56596:7;:14;56592:1;:18;;;56577:176;;;56653:7;56661:1;56653:10;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;56636:27:0;;:10;56647:1;56636:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;56636:13:0;:27;56633:106;;56683:14;;;;:::i;:::-;;;;56716:5;;56633:106;56612:3;;;;:::i;:::-;;;;56577:176;;;-1:-1:-1;56559:3:0;;;;:::i;:::-;;;;56517:247;;;;56818:1;56799:10;:17;:20;;;;:::i;:::-;56783:12;:36;;;56776:43;;;;;56226:601;;;:::o;10306:173::-;10381:6;;;-1:-1:-1;;;;;10398:17:0;;;-1:-1:-1;;;;;;10398:17:0;;;;;;;10431:40;;10381:6;;;10398:17;10381:6;;10431:40;;10362:16;;10431:40;10351:128;10306:173;:::o;29790:315::-;29947:28;29957:4;29963:2;29967:7;29947:9;:28::i;:::-;29994:48;30017:4;30023:2;30027:7;30036:5;29994:22;:48::i;:::-;29986:111;;;;-1:-1:-1;;;29986:111:0;;;;;;;:::i;64253:1607::-;64351:11;;64311:13;;64337:11;64377:8;;;64373:23;;-1:-1:-1;;64387:9:0;;;;;;;;;-1:-1:-1;64387:9:0;;;64253:1607;-1:-1:-1;64253:1607:0:o;64373:23::-;64448:18;64486:1;64475:7;:3;64481:1;64475:7;:::i;:::-;64474:13;;;;:::i;:::-;64469:19;;:1;:19;:::i;:::-;64448:40;-1:-1:-1;64546:19:0;64578:15;64448:40;64591:2;64578:15;:::i;:::-;-1:-1:-1;;;;;64568:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64568:26:0;;64546:48;;64607:18;64628:5;;;;;;;;;;;;;;;;;64607:26;;64697:1;64690:5;64686:13;64742:2;64734:6;64730:15;64793:1;64761:777;64816:3;64813:1;64810:10;64761:777;;;64871:1;64914:12;;;;;64908:19;65009:4;64997:2;64993:14;;;;;64975:40;;64969:47;65118:2;65114:14;;;65110:25;;65096:40;;65090:47;65247:1;65243:13;;;65239:24;;65225:39;;65219:46;65367:16;;;;65353:31;;65347:38;65045:1;65041:11;;;65139:4;65086:58;;;65077:68;65170:11;;65215:57;;;65206:67;;;;65298:11;;65343:49;;65334:59;65422:3;65418:13;65451:22;;65521:1;65506:17;;;;64864:9;64761:777;;;64765:44;65570:1;65565:3;65561:11;65591:1;65586:84;;;;65689:1;65684:82;;;;65554:212;;65586:84;-1:-1:-1;;;;;65619:17:0;;65612:43;65586:84;;65684:82;-1:-1:-1;;;;;65717:17:0;;65710:41;65554:212;-1:-1:-1;;;65782:26:0;;;65789:6;64253:1607;-1:-1:-1;;;;64253:1607:0:o;54845:1373::-;54906:13;54931:38;54972:7;:17;54980:8;54972:17;;;;;;;;;;;:33;;54931:74;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54931:74:0;;;-1:-1:-1;;54931:74:0;;;;;;;;;;;;;;-1:-1:-1;;;54931:74:0;;;;;;;;-1:-1:-1;;;54931:74:0;;;;;;;-1:-1:-1;;;54931:74:0;;;;;;;;;;-1:-1:-1;55016:22:0;;:::i;:::-;55108:34;55117:15;:20;;;55140:1;55117:24;;;;:::i;55108:34::-;55203;55212:15;:20;;;55235:1;55212:24;;;;:::i;55203:34::-;55298;55307:15;:20;;;55330:1;55307:24;;;;:::i;55298:34::-;55060:302;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55060:302:0;;;;;;55049:313;;55438:24;;55049:8;55505:23;;;55577:22;;;;55568:32;;;;:8;:32::i;:::-;55663:31;55672:15;:21;;;55663:31;;:8;:31::i;:::-;55384:340;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55384:340:0;;;;;;55373:8;;;:351;55791:18;55800:8;55791;:18::i;:::-;55887:17;;;;:7;:17;;;;;55881:36;;55872:46;;55887:17;55881:36;;;:::i;:::-;;;55872:8;:46::i;:::-;55980:31;55989:15;:21;;;55980:31;;:8;:31::i;:::-;56092:17;;;;:7;:17;;;;;:26;;;56078:41;;-1:-1:-1;;;;;56092:26:0;56078:13;:41::i;:::-;55746:379;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55746:379:0;;;;;;55735:8;;;:390;;;56177:8;;55735;56186;;;;56145:65;;;;56177:8;;56186;55746:379;56145:65;;:::i;:::-;;;;;;;;;;;;;56138:72;;;;54845:1373;;;:::o;63423:474::-;63483:13;63509:17;63535:3;63509:30;;63550:19;63582:4;:11;-1:-1:-1;;;;;63572:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63572:22:0;;63550:44;;63610:6;63605:253;63626:4;:11;63622:1;:15;63605:253;;;63682:2;63670:4;63675:1;63670:7;;;;;;;;:::i;:::-;;;;;;;63664:20;;;;63663:48;;;63708:2;63696:4;63701:1;63696:7;;;;;;;;:::i;:::-;;;;;;;63690:20;;63663:48;63659:188;;;63757:4;63762:1;63757:7;;;;;;;;:::i;:::-;;;;;;;;;63751:14;;63768:2;63751:19;;;;:::i;:::-;63744:27;;63732:6;63739:1;63732:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;63732:39:0;;;;;;;;;63659:188;;;63824:4;63829:1;63824:7;;;;;;;;:::i;:::-;;;;;;;;;63812:6;63819:1;63812:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;63812:19:0;;;;;;;;;63659:188;63639:3;;;;:::i;:::-;;;;63605:253;;;-1:-1:-1;63882:6:0;63423:474;-1:-1:-1;;;63423:474:0:o;40027:589::-;-1:-1:-1;;;;;40233:18:0;;40229:187;;40268:40;40300:7;41443:10;:17;;41416:24;;;;:15;:24;;;;;:44;;;41471:24;;;;;;;;;;;;41339:164;40268:40;40229:187;;;40338:2;-1:-1:-1;;;;;40330:10:0;:4;-1:-1:-1;;;;;40330:10:0;;40326:90;;40357:47;40390:4;40396:7;40357:32;:47::i;:::-;-1:-1:-1;;;;;40430:16:0;;40426:183;;40463:45;40500:7;40463:36;:45::i;40426:183::-;40536:4;-1:-1:-1;;;;;40530:10:0;:2;-1:-1:-1;;;;;40530:10:0;;40526:83;;40557:40;40585:2;40589:7;40557:27;:40::i;61087:404::-;61148:4;61196:5;61148:4;61213:249;61232:10;:17;61228:1;:21;;;61213:249;;;61337:12;61350:49;61383:10;61394:1;61383:13;;;;;;;;;;:::i;:::-;;;;;;;;;61366:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;61350:8;:49::i;:::-;61337:63;;;;;;:::i;:::-;;;;;;;;;;;;;61320:81;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61320:81:0;;;;;;;;;61310:92;;61320:81;61310:92;;;;61285:20;;;;;;;;;;61275:31;;;;:127;61271:180;;-1:-1:-1;61429:5:0;;61087:404;-1:-1:-1;;;61087:404:0:o;61271:180::-;61251:3;;;;:::i;:::-;;;;61213:249;;;-1:-1:-1;61479:4:0;;61087:404;-1:-1:-1;;;61087:404:0:o;31402:110::-;31478:26;31488:2;31492:7;31478:26;;;;;;;;;;;;:9;:26::i;:::-;31402:110;;:::o;35139:803::-;35294:4;-1:-1:-1;;;;;35315:13:0;;15622:20;15670:8;35311:624;;35351:72;;-1:-1:-1;;;35351:72:0;;-1:-1:-1;;;;;35351:36:0;;;;;:72;;8146:10;;35402:4;;35408:7;;35417:5;;35351:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35351:72:0;;;;;;;;-1:-1:-1;;35351:72:0;;;;;;;;;;;;:::i;:::-;;;35347:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35597:6;:13;35614:1;35597:18;35593:272;;35640:60;;-1:-1:-1;;;35640:60:0;;;;;;;:::i;35593:272::-;35815:6;35809:13;35800:6;35796:2;35792:15;35785:38;35347:533;-1:-1:-1;;;;;;35474:55:0;-1:-1:-1;;;35474:55:0;;-1:-1:-1;35467:62:0;;35311:624;-1:-1:-1;35919:4:0;35139:803;;;;;;:::o;62062:451::-;62162:13;;;62172:2;62162:13;;;62119;62162;;;;;;62145:14;;62162:13;;;;;;;;;;;-1:-1:-1;62162:13:0;62145:30;;62191:6;62186:293;62207:2;62203:1;:6;62186:293;;;62231:8;62282:6;62287:1;62282:2;:6;:::i;:::-;62279:10;;:1;:10;:::i;:::-;62275:15;;:1;:15;:::i;:::-;62255:36;;-1:-1:-1;;;;;62255:16:0;;:36;:::i;:::-;62242:51;;62231:62;;62308:9;62338:2;62333:1;62327:8;;:13;;;;:::i;:::-;62320:21;;62308:33;;62356:9;62397:2;62391:9;;62386:2;:14;;;;:::i;:::-;62381:1;62375:8;;:25;;;;:::i;:::-;62368:33;;62356:45;;62425:8;62430:2;62425:4;:8::i;:::-;62416:1;62418:3;62420:1;62418;:3;:::i;:::-;62416:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;62416:17:0;;;;;;;;;62459:8;62464:2;62459:4;:8::i;:::-;62448:1;62450:3;62452:1;62450;:3;:::i;:::-;:5;;62454:1;62450:5;:::i;:::-;62448:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;62448:19:0;;;;;;;;;62216:263;;;62211:3;;;;;:::i;:::-;;;;62186:293;;;-1:-1:-1;62503:1:0;62062:451;-1:-1:-1;;62062:451:0:o;42130:988::-;42396:22;42446:1;42421:22;42438:4;42421:16;:22::i;:::-;:26;;;;:::i;:::-;42458:18;42479:26;;;:17;:26;;;;;;42396:51;;-1:-1:-1;42612:28:0;;;42608:328;;-1:-1:-1;;;;;42679:18:0;;42657:19;42679:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42730:30;;;;;;:44;;;42847:30;;:17;:30;;;;;:43;;;42608:328;-1:-1:-1;43032:26:0;;;;:17;:26;;;;;;;;43025:33;;;-1:-1:-1;;;;;43076:18:0;;;;;:12;:18;;;;;:34;;;;;;;43069:41;42130:988::o;43413:1079::-;43691:10;:17;43666:22;;43691:21;;43711:1;;43691:21;:::i;:::-;43723:18;43744:24;;;:15;:24;;;;;;44117:10;:26;;43666:46;;-1:-1:-1;43744:24:0;;43666:46;;44117:26;;;;;;:::i;:::-;;;;;;;;;44095:48;;44181:11;44156:10;44167;44156:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44261:28;;;:15;:28;;;;;;;:41;;;44433:24;;;;;44426:31;44468:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43484:1008;;;43413:1079;:::o;40917:221::-;41002:14;41019:20;41036:2;41019:16;:20::i;:::-;-1:-1:-1;;;;;41050:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41095:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40917:221:0:o;31739:321::-;31869:18;31875:2;31879:7;31869:5;:18::i;:::-;31920:54;31951:1;31955:2;31959:7;31968:5;31920:22;:54::i;:::-;31898:154;;;;-1:-1:-1;;;31898:154:0;;;;;;;:::i;62521:171::-;62568:8;62604:2;62593:8;;;;:13;62589:95;;;62622:15;:8;;;;62633:4;62622:15;:::i;:::-;62615:23;;;62521:171;-1:-1:-1;;62521:171:0:o;62589:95::-;62668:15;:8;;;;62679:4;62668:15;:::i;62589:95::-;62521:171;;;:::o;32396:382::-;-1:-1:-1;;;;;32476:16:0;;32468:61;;;;-1:-1:-1;;;32468:61:0;;49957:2:1;32468:61:0;;;49939:21:1;;;49976:18;;;49969:30;50035:34;50015:18;;;50008:62;50087:18;;32468:61:0;49755:356:1;32468:61:0;30483:4;30507:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30507:16:0;:30;32540:58;;;;-1:-1:-1;;;32540:58:0;;50318:2:1;32540:58:0;;;50300:21:1;50357:2;50337:18;;;50330:30;50396;50376:18;;;50369:58;50444:18;;32540:58:0;50116:352:1;32540:58:0;32611:45;32640:1;32644:2;32648:7;32611:20;:45::i;:::-;-1:-1:-1;;;;;32669:13:0;;;;;;:9;:13;;;;;:18;;32686:1;;32669:13;:18;;32686:1;;32669:18;:::i;:::-;;;;-1:-1:-1;;32698:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32698:21:0;-1:-1:-1;;;;;32698:21:0;;;;;;;;32737:33;;32698:16;;;32737:33;;32698:16;;32737:33;32396:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1941:254;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2200:127::-;2261:10;2256:3;2252:20;2249:1;2242:31;2292:4;2289:1;2282:15;2316:4;2313:1;2306:15;2332:275;2403:2;2397:9;2468:2;2449:13;;-1:-1:-1;;2445:27:1;2433:40;;-1:-1:-1;;;;;2488:34:1;;2524:22;;;2485:62;2482:88;;;2550:18;;:::i;:::-;2586:2;2579:22;2332:275;;-1:-1:-1;2332:275:1:o;2612:407::-;2677:5;-1:-1:-1;;;;;2703:6:1;2700:30;2697:56;;;2733:18;;:::i;:::-;2771:57;2816:2;2795:15;;-1:-1:-1;;2791:29:1;2822:4;2787:40;2771:57;:::i;:::-;2762:66;;2851:6;2844:5;2837:21;2891:3;2882:6;2877:3;2873:16;2870:25;2867:45;;;2908:1;2905;2898:12;2867:45;2957:6;2952:3;2945:4;2938:5;2934:16;2921:43;3011:1;3004:4;2995:6;2988:5;2984:18;2980:29;2973:40;2612:407;;;;;:::o;3024:222::-;3067:5;3120:3;3113:4;3105:6;3101:17;3097:27;3087:55;;3138:1;3135;3128:12;3087:55;3160:80;3236:3;3227:6;3214:20;3207:4;3199:6;3195:17;3160:80;:::i;3251:322::-;3320:6;3373:2;3361:9;3352:7;3348:23;3344:32;3341:52;;;3389:1;3386;3379:12;3341:52;3429:9;3416:23;-1:-1:-1;;;;;3454:6:1;3451:30;3448:50;;;3494:1;3491;3484:12;3448:50;3517;3559:7;3550:6;3539:9;3535:22;3517:50;:::i;3578:182::-;3637:4;-1:-1:-1;;;;;3662:6:1;3659:30;3656:56;;;3692:18;;:::i;:::-;-1:-1:-1;3737:1:1;3733:14;3749:4;3729:25;;3578:182::o;3765:887::-;3818:5;3871:3;3864:4;3856:6;3852:17;3848:27;3838:55;;3889:1;3886;3879:12;3838:55;3925:6;3912:20;3951:4;3975:59;3991:42;4030:2;3991:42;:::i;:::-;3975:59;:::i;:::-;4068:15;;;4154:1;4150:10;;;;4138:23;;4134:32;;;4099:12;;;;4178:15;;;4175:35;;;4206:1;4203;4196:12;4175:35;4242:2;4234:6;4230:15;4254:369;4270:6;4265:3;4262:15;4254:369;;;4356:3;4343:17;-1:-1:-1;;;;;4379:11:1;4376:35;4373:125;;;4452:1;4481:2;4477;4470:14;4373:125;4523:57;4576:3;4571:2;4557:11;4549:6;4545:24;4541:33;4523:57;:::i;:::-;4511:70;;-1:-1:-1;4601:12:1;;;;4287;;4254:369;;;-1:-1:-1;4641:5:1;3765:887;-1:-1:-1;;;;;;3765:887:1:o;4657:613::-;4795:6;4803;4856:2;4844:9;4835:7;4831:23;4827:32;4824:52;;;4872:1;4869;4862:12;4824:52;4912:9;4899:23;-1:-1:-1;;;;;4982:2:1;4974:6;4971:14;4968:34;;;4998:1;4995;4988:12;4968:34;5021:60;5073:7;5064:6;5053:9;5049:22;5021:60;:::i;:::-;5011:70;;5134:2;5123:9;5119:18;5106:32;5090:48;;5163:2;5153:8;5150:16;5147:36;;;5179:1;5176;5169:12;5147:36;;5202:62;5256:7;5245:8;5234:9;5230:24;5202:62;:::i;:::-;5192:72;;;4657:613;;;;;:::o;5457:741::-;5756:10;5793:15;;;5775:34;;5845:15;;5840:2;5825:18;;5818:43;5892:2;5877:18;;5870:34;;;5935:2;5920:18;;5913:34;;;-1:-1:-1;;;;;5984:32:1;;5978:3;5963:19;;5956:61;6061:14;;6054:22;6004:3;6033:19;;6026:51;6114:3;6108;6093:19;;6086:32;;;5727:4;;6135:57;;6172:19;;6164:6;6135:57;:::i;:::-;6127:65;5457:741;-1:-1:-1;;;;;;;;;5457:741:1:o;6203:390::-;6281:6;6289;6342:2;6330:9;6321:7;6317:23;6313:32;6310:52;;;6358:1;6355;6348:12;6310:52;6394:9;6381:23;6371:33;;6455:2;6444:9;6440:18;6427:32;-1:-1:-1;;;;;6474:6:1;6471:30;6468:50;;;6514:1;6511;6504:12;6468:50;6537;6579:7;6570:6;6559:9;6555:22;6537:50;:::i;6598:328::-;6675:6;6683;6691;6744:2;6732:9;6723:7;6719:23;6715:32;6712:52;;;6760:1;6757;6750:12;6712:52;6783:29;6802:9;6783:29;:::i;:::-;6773:39;;6831:38;6865:2;6854:9;6850:18;6831:38;:::i;:::-;6821:48;;6916:2;6905:9;6901:18;6888:32;6878:42;;6598:328;;;;;:::o;6931:661::-;6985:5;7038:3;7031:4;7023:6;7019:17;7015:27;7005:55;;7056:1;7053;7046:12;7005:55;7092:6;7079:20;7118:4;7142:59;7158:42;7197:2;7158:42;:::i;7142:59::-;7235:15;;;7321:1;7317:10;;;;7305:23;;7301:32;;;7266:12;;;;7345:15;;;7342:35;;;7373:1;7370;7363:12;7342:35;7409:2;7401:6;7397:15;7421:142;7437:6;7432:3;7429:15;7421:142;;;7503:17;;7491:30;;7541:12;;;;7454;;7421:142;;7597:769;7719:6;7727;7735;7788:2;7776:9;7767:7;7763:23;7759:32;7756:52;;;7804:1;7801;7794:12;7756:52;7844:9;7831:23;-1:-1:-1;;;;;7914:2:1;7906:6;7903:14;7900:34;;;7930:1;7927;7920:12;7900:34;7953:61;8006:7;7997:6;7986:9;7982:22;7953:61;:::i;:::-;7943:71;;8067:2;8056:9;8052:18;8039:32;8023:48;;8096:2;8086:8;8083:16;8080:36;;;8112:1;8109;8102:12;8080:36;8135:52;8179:7;8168:8;8157:9;8153:24;8135:52;:::i;:::-;8125:62;;8240:2;8229:9;8225:18;8212:32;8196:48;;8269:2;8259:8;8256:16;8253:36;;;8285:1;8282;8275:12;8253:36;;8308:52;8352:7;8341:8;8330:9;8326:24;8308:52;:::i;:::-;8298:62;;;7597:769;;;;;:::o;8371:163::-;8438:20;;8498:10;8487:22;;8477:33;;8467:61;;8524:1;8521;8514:12;8539:393;8623:6;8631;8639;8647;8700:3;8688:9;8679:7;8675:23;8671:33;8668:53;;;8717:1;8714;8707:12;8668:53;8753:9;8740:23;8730:33;;8782:37;8815:2;8804:9;8800:18;8782:37;:::i;:::-;8772:47;;8866:2;8855:9;8851:18;8838:32;8828:42;;8889:37;8922:2;8911:9;8907:18;8889:37;:::i;:::-;8879:47;;8539:393;;;;;;;:::o;8937:492::-;9037:6;9045;9053;9106:2;9094:9;9085:7;9081:23;9077:32;9074:52;;;9122:1;9119;9112:12;9074:52;9162:9;9149:23;-1:-1:-1;;;;;9187:6:1;9184:30;9181:50;;;9227:1;9224;9217:12;9181:50;9250:61;9303:7;9294:6;9283:9;9279:22;9250:61;:::i;:::-;9240:71;;;9330:37;9363:2;9352:9;9348:18;9330:37;:::i;:::-;9320:47;;9386:37;9419:2;9408:9;9404:18;9386:37;:::i;:::-;9376:47;;8937:492;;;;;:::o;9434:186::-;9493:6;9546:2;9534:9;9525:7;9521:23;9517:32;9514:52;;;9562:1;9559;9552:12;9514:52;9585:29;9604:9;9585:29;:::i;9625:420::-;9717:6;9725;9778:2;9766:9;9757:7;9753:23;9749:32;9746:52;;;9794:1;9791;9784:12;9746:52;9834:9;9821:23;-1:-1:-1;;;;;9859:6:1;9856:30;9853:50;;;9899:1;9896;9889:12;9853:50;9922:61;9975:7;9966:6;9955:9;9951:22;9922:61;:::i;:::-;9912:71;;;10002:37;10035:2;10024:9;10020:18;10002:37;:::i;:::-;9992:47;;9625:420;;;;;:::o;10050:1190::-;10321:2;10310:9;10303:21;10284:4;10347:56;10399:2;10388:9;10384:18;10376:6;10347:56;:::i;:::-;-1:-1:-1;;;;;10439:32:1;;10434:2;10419:18;;10412:60;10508:22;;;10503:2;10488:18;;10481:50;10560:13;;10597:4;10582:20;;;10625:61;;10668:17;;10560:13;10625:61;:::i;:::-;10611:75;;10735:2;10727:6;10723:15;10717:22;10784:6;10776;10772:19;10767:2;10759:6;10755:15;10748:44;10815:52;10860:6;10844:14;10815:52;:::i;:::-;10801:66;;;10916:2;10908:6;10904:15;10898:22;10939:10;11002:2;10986:14;10982:23;10977:2;10969:6;10965:15;10958:48;11067:2;11061;11053:6;11049:15;11043:22;11039:31;11034:2;11026:6;11022:15;11015:56;11136:2;11128:4;11120:6;11116:17;11110:24;11106:33;11099:4;11091:6;11087:17;11080:60;;;11205:4;11197;11189:6;11185:17;11179:24;11175:35;11168:4;11160:6;11156:17;11149:62;11228:6;11220:14;;;;10050:1190;;;;;;:::o;11245:347::-;11310:6;11318;11371:2;11359:9;11350:7;11346:23;11342:32;11339:52;;;11387:1;11384;11377:12;11339:52;11410:29;11429:9;11410:29;:::i;:::-;11400:39;;11489:2;11478:9;11474:18;11461:32;11536:5;11529:13;11522:21;11515:5;11512:32;11502:60;;11558:1;11555;11548:12;11502:60;11581:5;11571:15;;;11245:347;;;;;:::o;11597:667::-;11692:6;11700;11708;11716;11769:3;11757:9;11748:7;11744:23;11740:33;11737:53;;;11786:1;11783;11776:12;11737:53;11809:29;11828:9;11809:29;:::i;:::-;11799:39;;11857:38;11891:2;11880:9;11876:18;11857:38;:::i;:::-;11847:48;;11942:2;11931:9;11927:18;11914:32;11904:42;;11997:2;11986:9;11982:18;11969:32;-1:-1:-1;;;;;12016:6:1;12013:30;12010:50;;;12056:1;12053;12046:12;12010:50;12079:22;;12132:4;12124:13;;12120:27;-1:-1:-1;12110:55:1;;12161:1;12158;12151:12;12110:55;12184:74;12250:7;12245:2;12232:16;12227:2;12223;12219:11;12184:74;:::i;:::-;12174:84;;;11597:667;;;;;;;:::o;12269:260::-;12337:6;12345;12398:2;12386:9;12377:7;12373:23;12369:32;12366:52;;;12414:1;12411;12404:12;12366:52;12437:29;12456:9;12437:29;:::i;:::-;12427:39;;12485:38;12519:2;12508:9;12504:18;12485:38;:::i;12534:380::-;12613:1;12609:12;;;;12656;;;12677:61;;12731:4;12723:6;12719:17;12709:27;;12677:61;12784:2;12776:6;12773:14;12753:18;12750:38;12747:161;;12830:10;12825:3;12821:20;12818:1;12811:31;12865:4;12862:1;12855:15;12893:4;12890:1;12883:15;12747:161;;12534:380;;;:::o;14159:356::-;14361:2;14343:21;;;14380:18;;;14373:30;14439:34;14434:2;14419:18;;14412:62;14506:2;14491:18;;14159:356::o;14646:545::-;14748:2;14743:3;14740:11;14737:448;;;14784:1;14809:5;14805:2;14798:17;14854:4;14850:2;14840:19;14924:2;14912:10;14908:19;14905:1;14901:27;14895:4;14891:38;14960:4;14948:10;14945:20;14942:47;;;-1:-1:-1;14983:4:1;14942:47;15038:2;15033:3;15029:12;15026:1;15022:20;15016:4;15012:31;15002:41;;15093:82;15111:2;15104:5;15101:13;15093:82;;;15156:17;;;15137:1;15126:13;15093:82;;15367:1352;15493:3;15487:10;-1:-1:-1;;;;;15512:6:1;15509:30;15506:56;;;15542:18;;:::i;:::-;15571:97;15661:6;15621:38;15653:4;15647:11;15621:38;:::i;:::-;15615:4;15571:97;:::i;:::-;15723:4;;15787:2;15776:14;;15804:1;15799:663;;;;16506:1;16523:6;16520:89;;;-1:-1:-1;16575:19:1;;;16569:26;16520:89;-1:-1:-1;;15324:1:1;15320:11;;;15316:24;15312:29;15302:40;15348:1;15344:11;;;15299:57;16622:81;;15769:944;;15799:663;14593:1;14586:14;;;14630:4;14617:18;;-1:-1:-1;;15835:20:1;;;15953:236;15967:7;15964:1;15961:14;15953:236;;;16056:19;;;16050:26;16035:42;;16148:27;;;;16116:1;16104:14;;;;15983:19;;15953:236;;;15957:3;16217:6;16208:7;16205:19;16202:201;;;16278:19;;;16272:26;-1:-1:-1;;16361:1:1;16357:14;;;16373:3;16353:24;16349:37;16345:42;16330:58;16315:74;;16202:201;-1:-1:-1;;;;;16449:1:1;16433:14;;;16429:22;16416:36;;-1:-1:-1;15367:1352:1:o;16724:198::-;16766:3;16804:5;16798:12;16819:65;16877:6;16872:3;16865:4;16858:5;16854:16;16819:65;:::i;:::-;16900:16;;;;;16724:198;-1:-1:-1;;16724:198:1:o;16927:289::-;17058:3;17096:6;17090:13;17112:66;17171:6;17166:3;17159:4;17151:6;17147:17;17112:66;:::i;:::-;17194:16;;;;;16927:289;-1:-1:-1;;16927:289:1:o;17221:722::-;17271:3;17312:5;17306:12;17341:36;17367:9;17341:36;:::i;:::-;17396:1;17413:18;;;17440:133;;;;17587:1;17582:355;;;;17406:531;;17440:133;-1:-1:-1;;17473:24:1;;17461:37;;17546:14;;17539:22;17527:35;;17518:45;;;-1:-1:-1;17440:133:1;;17582:355;17613:5;17610:1;17603:16;17642:4;17687:2;17684:1;17674:16;17712:1;17726:165;17740:6;17737:1;17734:13;17726:165;;;17818:14;;17805:11;;;17798:35;17861:16;;;;17755:10;;17726:165;;;17730:3;;;17920:6;17915:3;17911:16;17904:23;;17406:531;;;;;17221:722;;;;:::o;17948:197::-;18076:3;18101:38;18135:3;18127:6;18101:38;:::i;18150:127::-;18211:10;18206:3;18202:20;18199:1;18192:31;18242:4;18239:1;18232:15;18266:4;18263:1;18256:15;18282:127;18343:10;18338:3;18334:20;18331:1;18324:31;18374:4;18371:1;18364:15;18398:4;18395:1;18388:15;18414:135;18453:3;18474:17;;;18471:43;;18494:18;;:::i;:::-;-1:-1:-1;18541:1:1;18530:13;;18414:135::o;18554:627::-;18606:3;18644:5;18638:12;18671:6;18666:3;18659:19;18697:4;18738:2;18733:3;18729:12;18763:11;18790;18783:18;;18840:6;18837:1;18833:14;18826:5;18822:26;18810:38;;18882:2;18875:5;18871:14;18903:1;18913:242;18927:6;18924:1;18921:13;18913:242;;;18998:5;18992:4;18988:16;18983:3;18976:29;19026:49;19070:4;19061:6;19055:13;19026:49;:::i;:::-;19133:12;;;;19018:57;-1:-1:-1;19098:15:1;;;;18949:1;18942:9;18913:242;;;-1:-1:-1;19171:4:1;;18554:627;-1:-1:-1;;;;;;;18554:627:1:o;19186:503::-;19483:2;19472:9;19465:21;19446:4;19509:55;19560:2;19549:9;19545:18;19537:6;19509:55;:::i;:::-;19612:9;19604:6;19600:22;19595:2;19584:9;19580:18;19573:50;19640:43;19676:6;19668;19640:43;:::i;:::-;19632:51;19186:503;-1:-1:-1;;;;;19186:503:1:o;19694:127::-;19755:10;19750:3;19746:20;19743:1;19736:31;19786:4;19783:1;19776:15;19810:4;19807:1;19800:15;19826:183;19857:1;19883:10;19920:2;19917:1;19913:10;19942:3;19932:37;;19949:18;;:::i;:::-;19987:10;;19983:20;;;;;19826:183;-1:-1:-1;;19826:183:1:o;20014:199::-;-1:-1:-1;;;;;;20153:26:1;;;;20141:39;;20205:1;20196:11;;20014:199::o;20218:249::-;20289:10;20331;;;20343;;;20327:27;20374:20;;;;20289:10;20413:24;;;20403:58;;20441:18;;:::i;:::-;20403:58;;20218:249;;;;:::o;20472:201::-;20510:3;20538:10;20583:2;20576:5;20572:14;20610:2;20601:7;20598:15;20595:41;;20616:18;;:::i;:::-;20665:1;20652:15;;20472:201;-1:-1:-1;;;20472:201:1:o;20678:172::-;20745:10;20775;;;20787;;;20771:27;;20810:11;;;20807:37;;;20824:18;;:::i;20855:1074::-;21426:32;21421:3;21414:45;-1:-1:-1;;;21484:2:1;21479:3;21475:12;21468:32;21396:3;21529:6;21523:13;21545:75;21613:6;21608:2;21603:3;21599:12;21592:4;21584:6;21580:17;21545:75;:::i;:::-;-1:-1:-1;;;21679:2:1;21639:16;;;21671:11;;;21664:30;21719:13;;21741:76;21719:13;21803:2;21795:11;;21788:4;21776:17;;21741:76;:::i;:::-;-1:-1:-1;;;21877:2:1;21836:17;;;;21869:11;;;21862:34;21920:2;21912:11;;20855:1074;-1:-1:-1;;;;20855:1074:1:o;21934:175::-;22002:10;22045;;;22033;;;22029:27;;22068:12;;;22065:38;;;22083:18;;:::i;22114:1121::-;22612:3;22650:6;22644:13;22666:66;22725:6;22720:3;22713:4;22705:6;22701:17;22666:66;:::i;:::-;-1:-1:-1;;;22754:16:1;;;22779:21;;;22825:13;;22847:78;22825:13;22912:1;22901:13;;22894:4;22882:17;;22847:78;:::i;:::-;-1:-1:-1;;;22988:1:1;22944:20;;;;22980:10;;;22973:27;23025:13;;23047:75;23025:13;23109:1;23101:10;;23094:4;23082:17;;23047:75;:::i;:::-;-1:-1:-1;;;23182:1:1;23141:17;;;;23174:10;;;23167:35;23226:2;23218:11;;22114:1121;-1:-1:-1;;;;;22114:1121:1:o;23240:703::-;23467:3;23505:6;23499:13;23521:66;23580:6;23575:3;23568:4;23560:6;23556:17;23521:66;:::i;:::-;23650:13;;23609:16;;;;23672:70;23650:13;23609:16;23719:4;23707:17;;23672:70;:::i;:::-;23809:13;;23764:20;;;23831:70;23809:13;23764:20;23878:4;23866:17;;23831:70;:::i;:::-;23917:20;;23240:703;-1:-1:-1;;;;;23240:703:1:o;23948:1236::-;-1:-1:-1;;;24560:3:1;24553:16;24535:3;24598:6;24592:13;24614:74;24681:6;24677:1;24672:3;24668:11;24661:4;24653:6;24649:17;24614:74;:::i;:::-;-1:-1:-1;;;24747:1:1;24707:16;;;24739:10;;;24732:27;24784:13;;24806:75;24784:13;24868:1;24860:10;;24853:4;24841:17;;24806:75;:::i;:::-;-1:-1:-1;;;24941:1:1;24900:17;;;;24933:10;;;24926:31;24982:13;;25004:76;24982:13;25066:2;25058:11;;25051:4;25039:17;;25004:76;:::i;:::-;-1:-1:-1;;;25140:2:1;25099:17;;;;25132:11;;;25125:26;25175:2;25167:11;;23948:1236;-1:-1:-1;;;;;23948:1236:1:o;25189:413::-;25391:2;25373:21;;;25430:2;25410:18;;;25403:30;25469:34;25464:2;25449:18;;25442:62;-1:-1:-1;;;25535:2:1;25520:18;;25513:47;25592:3;25577:19;;25189:413::o;26792:168::-;26865:9;;;26896;;26913:15;;;26907:22;;26893:37;26883:71;;26934:18;;:::i;26965:148::-;27053:4;27032:12;;;27046;;;27028:31;;27071:13;;27068:39;;;27087:18;;:::i;27118:543::-;27336:13;;27279:3;;27310;;27389:4;27416:15;;;27279:3;27459:175;27473:6;27470:1;27467:13;27459:175;;;27536:13;;27522:28;;27572:14;;;;27609:15;;;;27495:1;27488:9;27459:175;;;-1:-1:-1;27650:5:1;;27118:543;-1:-1:-1;;;;;;27118:543:1:o;27666:405::-;27863:2;27852:9;27845:21;27826:4;27889:56;27941:2;27930:9;27926:18;27918:6;27889:56;:::i;:::-;27993:9;27985:6;27981:22;27976:2;27965:9;27961:18;27954:50;28021:44;28058:6;28050;28021:44;:::i;28486:120::-;28526:1;28552;28542:35;;28557:18;;:::i;:::-;-1:-1:-1;28591:9:1;;28486:120::o;29320:175::-;29357:3;29401:4;29394:5;29390:16;29430:4;29421:7;29418:17;29415:43;;29438:18;;:::i;:::-;29487:1;29474:15;;29320:175;-1:-1:-1;;29320:175:1:o;30052:964::-;30539:66;30527:79;;-1:-1:-1;;;30631:2:1;30622:12;;30615:72;-1:-1:-1;30709:47:1;30752:2;30743:12;;30735:6;30709:47;:::i;:::-;-1:-1:-1;;;30772:5:1;30765:18;30812:6;30806:13;30828:74;30895:6;30891:1;30884:5;30880:13;30875:2;30867:6;30863:15;30828:74;:::i;:::-;-1:-1:-1;;;30963:1:1;30921:18;;;;30955:10;;;30948:36;31008:1;31000:10;;30052:964;-1:-1:-1;;;;30052:964:1:o;31912:2156::-;-1:-1:-1;;;33008:16:1;;-1:-1:-1;;;33049:1:1;33040:11;;33033:76;33132:13;;-1:-1:-1;;33154:75:1;33132:13;33217:2;33208:12;;33201:4;33189:17;;33154:75;:::i;:::-;33293:66;33288:2;33248:16;;;33280:11;;;33273:87;-1:-1:-1;;;33384:2:1;33376:11;;33369:41;33435:13;;33457:76;33435:13;33519:2;33511:11;;33504:4;33492:17;;33457:76;:::i;:::-;33598:66;33593:2;33552:17;;;;33585:11;;;33578:87;-1:-1:-1;;;33689:2:1;33681:11;;33674:49;33748:13;;33770:76;33748:13;33832:2;33824:11;;33817:4;33805:17;;33770:76;:::i;:::-;33862:200;33888:173;33918:142;33944:115;33974:84;34000:57;34053:2;34042:8;34038:2;34034:17;34030:26;31098:66;31086:79;;31195:66;31190:2;31181:12;;31174:88;31287:2;31278:12;;31021:275;34000:57;33992:6;33974:84;:::i;:::-;31378:66;31366:79;;31475:66;31470:2;31461:12;;31454:88;-1:-1:-1;;;31567:2:1;31558:12;;31551:31;31607:2;31598:12;;31301:315;33944:115;33936:6;33918:142;:::i;:::-;-1:-1:-1;;;31847:27:1;;31899:1;31890:11;;31782:125;33888:173;33880:6;33862:200;:::i;:::-;33855:207;31912:2156;-1:-1:-1;;;;;;;;;;31912:2156:1:o;34073:461::-;34335:31;34330:3;34323:44;34305:3;34396:6;34390:13;34412:75;34480:6;34475:2;34470:3;34466:12;34459:4;34451:6;34447:17;34412:75;:::i;:::-;34507:16;;;;34525:2;34503:25;;34073:461;-1:-1:-1;;34073:461:1:o;34539:521::-;34805:3;34843:6;34837:13;34859:66;34918:6;34913:3;34906:4;34898:6;34894:17;34859:66;:::i;:::-;34947:51;34990:6;34985:3;34981:16;34973:6;34947:51;:::i;:::-;-1:-1:-1;;;35007:18:1;;35052:1;35041:13;;34539:521;-1:-1:-1;;;;;34539:521:1:o;35472:128::-;35539:9;;;35560:11;;;35557:37;;;35574:18;;:::i;35605:112::-;35637:1;35663;35653:35;;35668:18;;:::i;:::-;-1:-1:-1;35702:9:1;;35605:112::o;35722:125::-;35787:9;;;35808:10;;;35805:36;;;35821:18;;:::i;36297:1904::-;37213:34;37208:3;37201:47;37278:34;37273:2;37268:3;37264:12;37257:56;37343:34;37338:2;37333:3;37329:12;37322:56;37408:34;37403:2;37398:3;37394:12;37387:56;-1:-1:-1;;;37468:3:1;37463;37459:13;37452:42;37183:3;37523:6;37517:13;37539:74;37606:6;37600:3;37595;37591:13;37586:2;37578:6;37574:15;37539:74;:::i;:::-;-1:-1:-1;;;37672:3:1;37632:16;;;37664:12;;;37657:25;37707:13;;37729:75;37707:13;37789:3;37781:12;;37776:2;37764:15;;37729:75;:::i;:::-;37826:85;37852:58;37905:3;37894:8;37890:2;37886:17;37882:27;35929:34;35917:47;;35994:31;35989:2;35980:12;;35973:53;36051:2;36042:12;;35852:208;37852:58;37844:6;37826:85;:::i;:::-;37813:98;;;37920:36;37950:5;-1:-1:-1;;;36115:25:1;;36065:77;37920:36;37978:41;38015:2;38008:5;38004:14;37996:6;37978:41;:::i;:::-;-1:-1:-1;;;36192:23:1;;37965:54;-1:-1:-1;38081:40:1;38118:1;38111:5;38107:13;38099:6;38081:40;:::i;:::-;-1:-1:-1;;;36272:18:1;;38193:1;38182:13;;;-1:-1:-1;;;;;;;;36297:1904:1:o;39434:414::-;39636:2;39618:21;;;39675:2;39655:18;;;39648:30;39714:34;39709:2;39694:18;;39687:62;-1:-1:-1;;;39780:2:1;39765:18;;39758:48;39838:3;39823:19;;39434:414::o;40001:1655::-;40642:66;40637:3;40630:79;40612:3;40738:6;40732:13;40754:75;40822:6;40817:2;40812:3;40808:12;40801:4;40793:6;40789:17;40754:75;:::i;:::-;40857:6;40852:3;40848:16;40838:26;;40883:66;40978:2;40973;40969;40965:11;40958:23;41010:66;41005:2;41001;40997:11;40990:87;41108:6;41102:13;41124:76;41191:8;41186:2;41182;41178:11;41171:4;41163:6;41159:17;41124:76;:::i;:::-;41260:2;41219:17;;41252:11;;;41245:23;41298:66;41292:3;41284:12;;41277:88;41390:13;;41412:77;41390:13;41474:3;41466:12;;41459:4;41447:17;;41412:77;:::i;:::-;41555:66;41549:3;41508:17;;;;41541:12;;;41534:88;41646:3;41638:12;;40001:1655;-1:-1:-1;;;;;40001:1655:1:o;41661:2023::-;42461:66;42456:3;42449:79;42567:12;42562:3;42558:22;42553:2;42548:3;42544:12;42537:44;42431:3;42610:6;42604:13;42626:73;42692:6;42687:2;42682:3;42678:12;42673:2;42665:6;42661:15;42626:73;:::i;:::-;42763:66;42758:2;42718:16;;;42750:11;;;42743:87;-1:-1:-1;;;42854:2:1;42846:11;;42839:47;42911:13;;42933:74;42911:13;42993:2;42985:11;;42980:2;42968:15;;42933:74;:::i;:::-;43072:66;43067:2;43026:17;;;;43059:11;;;43052:87;-1:-1:-1;;;43163:3:1;43155:12;;43148:42;43215:13;;43237:75;43215:13;43297:3;43289:12;;43284:2;43272:15;;43237:75;:::i;:::-;43378:66;43372:3;43331:17;;;;43364:12;;;43357:88;43475:66;43469:3;43461:12;;43454:88;43564:39;43598:3;43590:12;;43582:6;43564:39;:::i;:::-;39923:66;39911:79;;43675:2;43664:14;;;-1:-1:-1;;;;;;;41661:2023:1:o;43689:2002::-;44478:66;44473:3;44466:79;44448:3;44574:6;44568:13;44590:75;44658:6;44653:2;44648:3;44644:12;44637:4;44629:6;44625:17;44590:75;:::i;:::-;44693:6;44688:3;44684:16;44674:26;;44719:66;44814:2;44809;44805;44801:11;44794:23;44846:66;44841:2;44837;44833:11;44826:87;44944:6;44938:13;44960:76;45027:8;45022:2;45018;45014:11;45007:4;44999:6;44995:17;44960:76;:::i;:::-;45096:2;45055:17;;45088:11;;;45081:23;;;45134:66;45128:3;45120:12;;45113:88;45226:13;;45248:77;45226:13;45310:3;45302:12;;45295:4;45283:17;;45248:77;:::i;:::-;45385:3;45344:17;;45377:12;;;45370:24;45424:66;45418:3;45410:12;;45403:88;45513:39;45547:3;45539:12;;45531:6;45513:39;:::i;:::-;-1:-1:-1;;;31741:30:1;;45683:1;45672:13;;;-1:-1:-1;;;;;;;43689:2002:1:o;45696:1022::-;-1:-1:-1;;;46122:55:1;;46200:13;;46104:3;;46222:75;46200:13;46285:2;46276:12;;46269:4;46257:17;;46222:75;:::i;:::-;46357:13;;46316:16;;;;46379:76;46357:13;46441:2;46433:11;;46426:4;46414:17;;46379:76;:::i;:::-;46516:13;;46474:17;;;46538:76;46516:13;46600:2;46592:11;;46585:4;46573:17;;46538:76;:::i;:::-;-1:-1:-1;;;46674:2:1;46633:17;;;;46666:11;;;46659:26;46709:2;46701:11;;45696:1022;-1:-1:-1;;;;;45696:1022:1:o;46934:500::-;-1:-1:-1;;;;;47203:15:1;;;47185:34;;47255:15;;47250:2;47235:18;;47228:43;47302:2;47287:18;;47280:34;;;47350:3;47345:2;47330:18;;47323:31;;;47128:4;;47371:57;;47408:19;;47400:6;47371:57;:::i;:::-;47363:65;46934:500;-1:-1:-1;;;;;;46934:500:1:o;47439:249::-;47508:6;47561:2;47549:9;47540:7;47536:23;47532:32;47529:52;;;47577:1;47574;47567:12;47529:52;47609:9;47603:16;47628:30;47652:5;47628:30;:::i;47693:422::-;47782:1;47825:5;47782:1;47839:270;47860:7;47850:8;47847:21;47839:270;;;47919:4;47915:1;47911:6;47907:17;47901:4;47898:27;47895:53;;;47928:18;;:::i;:::-;47978:7;47968:8;47964:22;47961:55;;;47998:16;;;;47961:55;48077:22;;;;48037:15;;;;47839:270;;;47843:3;47693:422;;;;;:::o;48120:806::-;48169:5;48199:8;48189:80;;-1:-1:-1;48240:1:1;48254:5;;48189:80;48288:4;48278:76;;-1:-1:-1;48325:1:1;48339:5;;48278:76;48370:4;48388:1;48383:59;;;;48456:1;48451:130;;;;48363:218;;48383:59;48413:1;48404:10;;48427:5;;;48451:130;48488:3;48478:8;48475:17;48472:43;;;48495:18;;:::i;:::-;-1:-1:-1;;48551:1:1;48537:16;;48566:5;;48363:218;;48665:2;48655:8;48652:16;48646:3;48640:4;48637:13;48633:36;48627:2;48617:8;48614:16;48609:2;48603:4;48600:12;48596:35;48593:77;48590:159;;;-1:-1:-1;48702:19:1;;;48734:5;;48590:159;48781:34;48806:8;48800:4;48781:34;:::i;:::-;48851:6;48847:1;48843:6;48839:19;48830:7;48827:32;48824:58;;;48862:18;;:::i;:::-;48900:20;;48120:806;-1:-1:-1;;;48120:806:1:o;48931:131::-;48991:5;49020:36;49047:8;49041:4;49020:36;:::i;49067:165::-;49105:1;49139:4;49136:1;49132:12;49163:3;49153:37;;49170:18;;:::i;:::-;49222:3;49215:4;49212:1;49208:12;49204:22;49199:27;;;49067:165;;;;:::o;49237:225::-;49341:4;49320:12;;;49334;;;49316:31;49367:22;;;;49408:24;;;49398:58;;49436:18;;:::i;49467:151::-;49557:4;49550:12;;;49536;;;49532:31;;49575:14;;49572:40;;;49592:18;;:::i;49623:127::-;49684:10;49679:3;49675:20;49672:1;49665:31;49715:4;49712:1;49705:15;49739:4;49736:1;49729:15

Swarm Source

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