Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 597 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 74748396 | 174 days ago | IN | 0 POL | 0.00074319 | ||||
| Set Approval For... | 68382796 | 332 days ago | IN | 0 POL | 0.00140055 | ||||
| Set Approval For... | 64397982 | 433 days ago | IN | 0 POL | 0.00158957 | ||||
| Set Approval For... | 57380469 | 608 days ago | IN | 0 POL | 0.00140056 | ||||
| Set Approval For... | 54371361 | 688 days ago | IN | 0 POL | 0.00553665 | ||||
| Set Approval For... | 51208442 | 769 days ago | IN | 0 POL | 0.02953761 | ||||
| Set Approval For... | 50684352 | 783 days ago | IN | 0 POL | 0.00168368 | ||||
| Set Approval For... | 46902147 | 879 days ago | IN | 0 POL | 0.00627637 | ||||
| Set Approval For... | 46268848 | 894 days ago | IN | 0 POL | 0.00358676 | ||||
| Safe Transfer Fr... | 45032392 | 926 days ago | IN | 0 POL | 0.01244729 | ||||
| Safe Transfer Fr... | 44982316 | 927 days ago | IN | 0 POL | 0.00680485 | ||||
| Safe Transfer Fr... | 43491200 | 965 days ago | IN | 0 POL | 0.00634151 | ||||
| Safe Transfer Fr... | 43491161 | 965 days ago | IN | 0 POL | 0.00638856 | ||||
| Set Approval For... | 42920522 | 980 days ago | IN | 0 POL | 0.00724919 | ||||
| Gift | 42670734 | 986 days ago | IN | 0 POL | 0.04103295 | ||||
| Transfer Ownersh... | 42620612 | 987 days ago | IN | 0 POL | 0.00432565 | ||||
| Set Approval For... | 41329575 | 1021 days ago | IN | 0 POL | 0.00629341 | ||||
| Set Approval For... | 40567423 | 1041 days ago | IN | 0 POL | 0.00467675 | ||||
| Set Approval For... | 39765473 | 1062 days ago | IN | 0 POL | 0.01173901 | ||||
| Set Approval For... | 39749426 | 1062 days ago | IN | 0 POL | 0.00327445 | ||||
| Set Approval For... | 39749426 | 1062 days ago | IN | 0 POL | 0.00451472 | ||||
| Set Approval For... | 38914080 | 1084 days ago | IN | 0 POL | 0.00314829 | ||||
| Safe Transfer Fr... | 38728907 | 1089 days ago | IN | 0 POL | 0.00365041 | ||||
| Safe Transfer Fr... | 38728835 | 1089 days ago | IN | 0 POL | 0.00474898 | ||||
| Safe Transfer Fr... | 38728732 | 1089 days ago | IN | 0 POL | 0.00377322 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HanzoNFT
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.10;
// SPDX-License-Identifier: Unlicensed
/**
* Hanzo Founders Collection, by Hanzo Inu
* https://www.hanzoinu.ninja
* Telegram: https://t.me/HanzoInu
* Discord: https://discord.gg/HzgXJyNzkd
*
* NFT Generation & Launch via Dogira NFT-Kit
* Mint: https://Dogira.finance
* Home: https://Dogira.net
* Telegram: https://t.me/DogiraToken
* Discord: https://discord.gg/ZxudAQE3Bh
*/
import "ERC721Enumerable.sol";
import "Ownable.sol";
import "Strings.sol";
import "Payment.sol";
import "Guard.sol";
import "VRFConsumerBase.sol";
contract HanzoNFT is VRFConsumerBase, ERC721Enumerable, Ownable, Payment, Guard {
using Strings for uint256;
bytes32 internal keyHash;
uint256 internal fee = 0.0001 * 10 ** 18;
uint256 public linkVRFOffset;
string public baseURI;
string public attributesZipHash;
//settings
uint256 public maxSupply = 8888;
bool public whitelistStatus = false;
bool public publicStatus = false;
mapping(address => bool) public onWhitelist;
mapping(address => uint256) public walletMints;
//prices
uint256 private whitelistPrice = 75 ether;
uint256 private publicPrice = 100 ether;
uint256 private price = 100 ether;
//maxmint
uint256 public whitelistMaxMint = 10;
uint256 public publicMaxMint = 25;
uint256 public maxMint = 25;
//shares
address[] private addressList = [
0x092cEC2F2f571ea63ba7B24a019090576717B531, // Hanzo Team - 85%
0xaB352AD9B0AB57857aB4d1aeaDCC137A5CBCF376 // Dogira Team - 15%
];
uint[] private shareList = [85, 15];
event VRFOffsetSet(uint vrfResult, bytes32 requestId);
event AttributesZipHashSet(string attributesZipHash);
//token
constructor(
string memory _name,
string memory _symbol,
string memory _initBaseURI,
bytes32 _keyHash
)
VRFConsumerBase(
0x3d2341ADb2D31f1c5530cDC622016af293177AE0, // VRF Coordinator
0xb0897686c545045aFc77CF20eC7A532E3120E0F1 // LINK Token
)
ERC721(_name, _symbol)
Payment(addressList, shareList){
setURI(_initBaseURI);
keyHash = _keyHash;
}
function getRandomNumber() external onlyOwner returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK!");
return requestRandomness(keyHash, fee);
}
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
uint256 s = totalSupply();
linkVRFOffset = randomness % s;
emit VRFOffsetSet(linkVRFOffset, requestId);
}
function setAttributesZipHash(string memory _zipHash) external onlyOwner {
attributesZipHash = _zipHash;
emit AttributesZipHashSet(attributesZipHash);
}
function mint(uint256 _tokenAmount) public payable {
uint256 s = totalSupply();
uint256 _maxMint = maxMint;
uint256 _price = publicPrice;
if (!publicStatus) {
_maxMint = whitelistMaxMint;
_price = whitelistPrice;
bool wl = onWhitelist[msg.sender];
require(whitelistStatus, "Whitelist is not active" );
if (!wl) {
require(publicStatus, "You are not whitelisted!" );
}
}
uint256 mintsByWallet = walletMints[msg.sender];
_maxMint = _maxMint - mintsByWallet;
require(_tokenAmount > 0, "Must mint at least one NFT." );
require(_tokenAmount <= _maxMint, "Mint less");
require( s + _tokenAmount <= maxSupply, "Mint less");
require(msg.value >= _price * _tokenAmount, "MATIC input is wrong");
for (uint256 i = 0; i < _tokenAmount; ++i) {
_safeMint(msg.sender, s + i, "");
}
mintsByWallet = mintsByWallet + _tokenAmount;
walletMints[msg.sender] = mintsByWallet;
delete s;
}
// admin minting
function gift(uint[] calldata gifts, address[] calldata recipient) external onlyOwner{
require(gifts.length == recipient.length);
uint g = 0;
uint256 s = totalSupply();
for(uint i = 0; i < gifts.length; ++i){
g += gifts[i];
}
require( s + g <= maxSupply, "Too many" );
delete g;
for(uint i = 0; i < recipient.length; ++i){
for(uint j = 0; j < gifts[i]; ++j){
_safeMint( recipient[i], s++, "" );
}
}
delete s;
}
// admin functionality
function whitelistSet(address[] calldata _addresses) public onlyOwner {
for(uint256 i; i < _addresses.length; i++){
onWhitelist[_addresses[i]] = true;
}
}
//read metadata
function _baseURI() internal view virtual returns (string memory) {
return baseURI;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(tokenId <= maxSupply, "Token ID out of bounds!");
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString())) : "";
}
//price switch
function setPrice(uint256 _whitelistPrice, uint256 _publicPrice) public onlyOwner {
price = _publicPrice;
whitelistPrice = _whitelistPrice;
}
//max switch
function setMax(uint256 _whitelistMaxMint, uint256 _publicMaxMint) public onlyOwner {
maxMint = _publicMaxMint;
whitelistMaxMint = _whitelistMaxMint;
}
//write metadata
function setURI(string memory _newBaseURI) public onlyOwner {
baseURI = _newBaseURI;
}
//onoff switch
function setWhitelistMode(bool _wlstatus) public onlyOwner {
whitelistStatus = _wlstatus;
}
function setPublicMode(bool _pstatus) public onlyOwner {
publicStatus = _pstatus;
}
function initiatePayment() public onlyOwner {
Payment.splitFunds();
}
function withdraw() public payable onlyOwner {
(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
require(success);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "IERC165.sol";
/**
* @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;
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;
import "IERC721.sol";
import "IERC721Receiver.sol";
import "IERC721Metadata.sol";
import "Address.sol";
import "Context.sol";
import "ERC165.sol";
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
string private _name;
string private _symbol;
address[] internal _owners;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
uint count = 0;
uint length = _owners.length;
for( uint i = 0; i < length; ++i ){
if( owner == _owners[i] ){
++count;
}
}
delete length;
return count;
}
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;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
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);
}
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
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);
}
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
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);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
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);
}
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");
}
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return tokenId < _owners.length && _owners[tokenId] != address(0);
}
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));
}
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
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"
);
}
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);
_owners.push(to);
emit Transfer(address(0), to, tokenId);
}
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_owners[tokenId] = address(0);
emit Transfer(owner, address(0), tokenId);
}
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);
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
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.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;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.10;
import "ERC721.sol";
import "IERC721Enumerable.sol";
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
require(index < ERC721.balanceOf(owner), "ERC721Enum: owner ioob");
uint count;
for( uint i; i < _owners.length; ++i ){
if( owner == _owners[i] ){
if( count == index )
return i;
else
++count;
}
}
require(false, "ERC721Enum: owner ioob");
}
function tokensOfOwner(address owner) public view returns (uint256[] memory) {
require(0 < ERC721.balanceOf(owner), "ERC721Enum: owner ioob");
uint256 tokenCount = balanceOf(owner);
uint256[] memory tokenIds = new uint256[](tokenCount);
for (uint256 i = 0; i < tokenCount; i++) {
tokenIds[i] = tokenOfOwnerByIndex(owner, i);
}
return tokenIds;
}
function totalSupply() public view virtual override returns (uint256) {
return _owners.length;
}
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enum: global ioob");
return index;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract Guard {
// 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 noRentry() {
// 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;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "IERC165.sol";
/**
* @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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "IERC721.sol";
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "IERC721.sol";
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface LinkTokenInterface {
function allowance(address owner, address spender) external view returns (uint256 remaining);
function approve(address spender, uint256 value) external returns (bool success);
function balanceOf(address owner) external view returns (uint256 balance);
function decimals() external view returns (uint8 decimalPlaces);
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
function increaseApproval(address spender, uint256 subtractedValue) external;
function name() external view returns (string memory tokenName);
function symbol() external view returns (string memory tokenSymbol);
function totalSupply() external view returns (uint256 totalTokensIssued);
function transfer(address to, uint256 value) external returns (bool success);
function transferAndCall(
address to,
uint256 value,
bytes calldata data
) external returns (bool success);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool success);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_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);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "Address.sol";
import "Context.sol";
import "SafeMath.sol";
/**
* @title PaymentSplitter
* @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
* that the Ether will be split in this way, since it is handled transparently by the contract.
*
* The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
* account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
* an amount proportional to the percentage of total shares they were assigned.
*
* `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
* accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
* function.
*/
contract Payment is Context {
event PayeeAdded(address account, uint256 shares);
event PaymentReleased(address to, uint256 amount);
event PaymentReceived(address from, uint256 amount);
uint256 private _totalShares;
uint256 private _totalReleased;
mapping(address => uint256) private _shares;
mapping(address => uint256) private _released;
address[] private _payees;
/**
* @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
* the matching position in the `shares` array.
*
* All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
* duplicates in `payees`.
*/
constructor(address[] memory payees, uint256[] memory shares_) payable {
require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
require(payees.length > 0, "PaymentSplitter: no payees");
for (uint256 i = 0; i < payees.length; i++) {
_addPayee(payees[i], shares_[i]);
}
}
/**
* @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
* reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
* reliability of the events, and not the actual splitting of Ether.
*
* To learn more about this see the Solidity documentation for
* https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
* functions].
*/
receive() external payable virtual {
emit PaymentReceived(_msgSender(), msg.value);
}
/**
* @dev Getter for the total shares held by payees.
*/
function totalShares() public view returns (uint256) {
return _totalShares;
}
/**
* @dev Getter for the total amount of Ether already released.
*/
function totalReleased() public view returns (uint256) {
return _totalReleased;
}
/**
* @dev Getter for the amount of shares held by an account.
*/
function shares(address account) public view returns (uint256) {
return _shares[account];
}
/**
* @dev Getter for the amount of Ether already released to a payee.
*/
function released(address account) public view returns (uint256) {
return _released[account];
}
/**
* @dev Getter for the address of the payee number `index`.
*/
function payee(uint256 index) public view returns (address) {
return _payees[index];
}
/**
* @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
* total shares and their previous withdrawals.
*/
function release(address payable account) public virtual {
require(_shares[account] > 0, "PaymentSplitter: account has no shares");
uint256 totalReceived = address(this).balance + _totalReleased;
uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];
require(payment != 0, "PaymentSplitter: account is not due payment");
_released[account] = _released[account] + payment;
_totalReleased = _totalReleased + payment;
Address.sendValue(account, payment);
emit PaymentReleased(account, payment);
}
function splitFunds() public virtual {
for (uint256 i = 0; i < _payees.length; i++) {
release(payable(_payees[i]));
}
}
/**
* @dev Add a new payee to the contract.
* @param account The address of the payee to add.
* @param shares_ The number of shares owned by the payee.
*/
function _addPayee(address account, uint256 shares_) private {
require(account != address(0), "PaymentSplitter: account is the zero address");
require(shares_ > 0, "PaymentSplitter: shares are 0");
require(_shares[account] == 0, "PaymentSplitter: account already has shares");
_payees.push(account);
_shares[account] = shares_;
_totalShares = _totalShares + shares_;
emit PayeeAdded(account, shares_);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "LinkTokenInterface.sol";
import "VRFRequestIDBase.sol";
/** ****************************************************************************
* @notice Interface for contracts using VRF randomness
* *****************************************************************************
* @dev PURPOSE
*
* @dev Reggie the Random Oracle (not his real job) wants to provide randomness
* @dev to Vera the verifier in such a way that Vera can be sure he's not
* @dev making his output up to suit himself. Reggie provides Vera a public key
* @dev to which he knows the secret key. Each time Vera provides a seed to
* @dev Reggie, he gives back a value which is computed completely
* @dev deterministically from the seed and the secret key.
*
* @dev Reggie provides a proof by which Vera can verify that the output was
* @dev correctly computed once Reggie tells it to her, but without that proof,
* @dev the output is indistinguishable to her from a uniform random sample
* @dev from the output space.
*
* @dev The purpose of this contract is to make it easy for unrelated contracts
* @dev to talk to Vera the verifier about the work Reggie is doing, to provide
* @dev simple access to a verifiable source of randomness.
* *****************************************************************************
* @dev USAGE
*
* @dev Calling contracts must inherit from VRFConsumerBase, and can
* @dev initialize VRFConsumerBase's attributes in their constructor as
* @dev shown:
*
* @dev contract VRFConsumer {
* @dev constuctor(<other arguments>, address _vrfCoordinator, address _link)
* @dev VRFConsumerBase(_vrfCoordinator, _link) public {
* @dev <initialization with other arguments goes here>
* @dev }
* @dev }
*
* @dev The oracle will have given you an ID for the VRF keypair they have
* @dev committed to (let's call it keyHash), and have told you the minimum LINK
* @dev price for VRF service. Make sure your contract has sufficient LINK, and
* @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
* @dev want to generate randomness from.
*
* @dev Once the VRFCoordinator has received and validated the oracle's response
* @dev to your request, it will call your contract's fulfillRandomness method.
*
* @dev The randomness argument to fulfillRandomness is the actual random value
* @dev generated from your seed.
*
* @dev The requestId argument is generated from the keyHash and the seed by
* @dev makeRequestId(keyHash, seed). If your contract could have concurrent
* @dev requests open, you can use the requestId to track which seed is
* @dev associated with which randomness. See VRFRequestIDBase.sol for more
* @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind,
* @dev if your contract could have multiple requests in flight simultaneously.)
*
* @dev Colliding `requestId`s are cryptographically impossible as long as seeds
* @dev differ. (Which is critical to making unpredictable randomness! See the
* @dev next section.)
*
* *****************************************************************************
* @dev SECURITY CONSIDERATIONS
*
* @dev A method with the ability to call your fulfillRandomness method directly
* @dev could spoof a VRF response with any random value, so it's critical that
* @dev it cannot be directly called by anything other than this base contract
* @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
*
* @dev For your users to trust that your contract's random behavior is free
* @dev from malicious interference, it's best if you can write it so that all
* @dev behaviors implied by a VRF response are executed *during* your
* @dev fulfillRandomness method. If your contract must store the response (or
* @dev anything derived from it) and use it later, you must ensure that any
* @dev user-significant behavior which depends on that stored value cannot be
* @dev manipulated by a subsequent VRF request.
*
* @dev Similarly, both miners and the VRF oracle itself have some influence
* @dev over the order in which VRF responses appear on the blockchain, so if
* @dev your contract could have multiple VRF requests in flight simultaneously,
* @dev you must ensure that the order in which the VRF responses arrive cannot
* @dev be used to manipulate your contract's user-significant behavior.
*
* @dev Since the ultimate input to the VRF is mixed with the block hash of the
* @dev block in which the request is made, user-provided seeds have no impact
* @dev on its economic security properties. They are only included for API
* @dev compatability with previous versions of this contract.
*
* @dev Since the block hash of the block which contains the requestRandomness
* @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
* @dev miner could, in principle, fork the blockchain to evict the block
* @dev containing the request, forcing the request to be included in a
* @dev different block with a different hash, and therefore a different input
* @dev to the VRF. However, such an attack would incur a substantial economic
* @dev cost. This cost scales with the number of blocks the VRF oracle waits
* @dev until it calls responds to a request.
*/
abstract contract VRFConsumerBase is VRFRequestIDBase {
/**
* @notice fulfillRandomness handles the VRF response. Your contract must
* @notice implement it. See "SECURITY CONSIDERATIONS" above for important
* @notice principles to keep in mind when implementing your fulfillRandomness
* @notice method.
*
* @dev VRFConsumerBase expects its subcontracts to have a method with this
* @dev signature, and will call it once it has verified the proof
* @dev associated with the randomness. (It is triggered via a call to
* @dev rawFulfillRandomness, below.)
*
* @param requestId The Id initially returned by requestRandomness
* @param randomness the VRF output
*/
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;
/**
* @dev In order to keep backwards compatibility we have kept the user
* seed field around. We remove the use of it because given that the blockhash
* enters later, it overrides whatever randomness the used seed provides.
* Given that it adds no security, and can easily lead to misunderstandings,
* we have removed it from usage and can now provide a simpler API.
*/
uint256 private constant USER_SEED_PLACEHOLDER = 0;
/**
* @notice requestRandomness initiates a request for VRF output given _seed
*
* @dev The fulfillRandomness method receives the output, once it's provided
* @dev by the Oracle, and verified by the vrfCoordinator.
*
* @dev The _keyHash must already be registered with the VRFCoordinator, and
* @dev the _fee must exceed the fee specified during registration of the
* @dev _keyHash.
*
* @dev The _seed parameter is vestigial, and is kept only for API
* @dev compatibility with older versions. It can't *hurt* to mix in some of
* @dev your own randomness, here, but it's not necessary because the VRF
* @dev oracle will mix the hash of the block containing your request into the
* @dev VRF seed it ultimately uses.
*
* @param _keyHash ID of public key against which randomness is generated
* @param _fee The amount of LINK to send with the request
*
* @return requestId unique ID for this request
*
* @dev The returned requestId can be used to distinguish responses to
* @dev concurrent requests. It is passed as the first argument to
* @dev fulfillRandomness.
*/
function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
// This is the seed passed to VRFCoordinator. The oracle will mix this with
// the hash of the block containing this request to obtain the seed/input
// which is finally passed to the VRF cryptographic machinery.
uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
// nonces[_keyHash] must stay in sync with
// VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
// successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
// This provides protection against the user repeating their input seed,
// which would result in a predictable/duplicate output, if multiple such
// requests appeared in the same block.
nonces[_keyHash] = nonces[_keyHash] + 1;
return makeRequestId(_keyHash, vRFSeed);
}
LinkTokenInterface internal immutable LINK;
address private immutable vrfCoordinator;
// Nonces for each VRF key from which randomness has been requested.
//
// Must stay in sync with VRFCoordinator[_keyHash][this]
mapping(bytes32 => uint256) /* keyHash */ /* nonce */
private nonces;
/**
* @param _vrfCoordinator address of VRFCoordinator contract
* @param _link address of LINK token contract
*
* @dev https://docs.chain.link/docs/link-token-contracts
*/
constructor(address _vrfCoordinator, address _link) {
vrfCoordinator = _vrfCoordinator;
LINK = LinkTokenInterface(_link);
}
// rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
// proof. rawFulfillRandomness then calls fulfillRandomness, after validating
// the origin of the call
function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
fulfillRandomness(requestId, randomness);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract VRFRequestIDBase {
/**
* @notice returns the seed which is actually input to the VRF coordinator
*
* @dev To prevent repetition of VRF output due to repetition of the
* @dev user-supplied seed, that seed is combined in a hash with the
* @dev user-specific nonce, and the address of the consuming contract. The
* @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
* @dev the final seed, but the nonce does protect against repetition in
* @dev requests which are included in a single block.
*
* @param _userSeed VRF seed input provided by user
* @param _requester Address of the requesting contract
* @param _nonce User-specific nonce at the time of the request
*/
function makeVRFInputSeed(
bytes32 _keyHash,
uint256 _userSeed,
address _requester,
uint256 _nonce
) internal pure returns (uint256) {
return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
}
/**
* @notice Returns the id for this request
* @param _keyHash The serviceAgreement ID to be used for this request
* @param _vRFInputSeed The seed to be passed directly to the VRF
* @return The id for this request
*
* @dev Note that _vRFInputSeed is not the seed passed by the consuming
* @dev contract, but the one generated by makeVRFInputSeed
*/
function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"attributesZipHash","type":"string"}],"name":"AttributesZipHashSet","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":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":false,"internalType":"uint256","name":"vrfResult","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"VRFOffsetSet","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"attributesZipHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRandomNumber","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gifts","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initiatePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkVRFOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"onWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_zipHash","type":"string"}],"name":"setAttributesZipHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMaxMint","type":"uint256"},{"internalType":"uint256","name":"_publicMaxMint","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pstatus","type":"bool"}],"name":"setPublicMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_wlstatus","type":"bool"}],"name":"setWhitelistMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"splitFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"whitelistSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c0604052655af3107a4000600e556122b86012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff021916908315150217905550680410d586a20a4c000060165568056bc75e2d6310000060175568056bc75e2d63100000601855600a6019556019601a556019601b55604051806040016040528073092cec2f2f571ea63ba7b24a019090576717b53173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ab352ad9b0ab57857ab4d1aeadcc137a5cbcf37673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601c9060026200012792919062000858565b506040518060400160405280605560ff168152602001600f60ff16815250601d90600262000157929190620008e7565b503480156200016557600080fd5b5060405162006e3238038062006e3283398181016040528101906200018b919062000bc6565b601c8054806020026020016040519081016040528092919081815260200182805480156200020f57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620001c4575b5050505050601d8054806020026020016040519081016040528092919081815260200182805480156200026257602002820191906000526020600020905b8154815260200190600101908083116200024d575b50505050508585733d2341adb2d31f1c5530cdc622016af293177ae073b0897686c545045afc77cf20ec7a532e3120e0f18173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050508160019080519060200190620003159291906200093e565b5080600290805190602001906200032e9291906200093e565b50505062000351620003456200047b60201b60201c565b6200048360201b60201c565b805182511462000398576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038f9062000d1c565b60405180910390fd5b6000825111620003df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d69062000d8e565b60405180910390fd5b60005b82518110156200044e576200043883828151811062000406576200040562000db0565b5b602002602001015183838151811062000424576200042362000db0565b5b60200260200101516200054960201b60201c565b8080620004459062000e18565b915050620003e2565b5050506001600c819055506200046a826200078360201b60201c565b80600d8190555050505050620011bf565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b39062000edc565b60405180910390fd5b6000811162000602576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f99062000f4e565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000687576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067e9062000fe6565b60405180910390fd5b600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007546200073e919062001008565b6007819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000777929190620010bb565b60405180910390a15050565b620007936200047b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007b96200082e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000812576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008099062001138565b60405180910390fd5b80601090805190602001906200082a9291906200093e565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054828255906000526020600020908101928215620008d4579160200282015b82811115620008d35782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000879565b5b509050620008e39190620009cf565b5090565b8280548282559060005260206000209081019282156200092b579160200282015b828111156200092a578251829060ff1690559160200191906001019062000908565b5b5090506200093a9190620009cf565b5090565b8280546200094c9062001189565b90600052602060002090601f016020900481019282620009705760008555620009bc565b82601f106200098b57805160ff1916838001178555620009bc565b82800160010185558215620009bc579182015b82811115620009bb5782518255916020019190600101906200099e565b5b509050620009cb9190620009cf565b5090565b5b80821115620009ea576000816000905550600101620009d0565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a578262000a0c565b810181811067ffffffffffffffff8211171562000a795762000a7862000a1d565b5b80604052505050565b600062000a8e620009ee565b905062000a9c828262000a4c565b919050565b600067ffffffffffffffff82111562000abf5762000abe62000a1d565b5b62000aca8262000a0c565b9050602081019050919050565b60005b8381101562000af757808201518184015260208101905062000ada565b8381111562000b07576000848401525b50505050565b600062000b2462000b1e8462000aa1565b62000a82565b90508281526020810184848401111562000b435762000b4262000a07565b5b62000b5084828562000ad7565b509392505050565b600082601f83011262000b705762000b6f62000a02565b5b815162000b8284826020860162000b0d565b91505092915050565b6000819050919050565b62000ba08162000b8b565b811462000bac57600080fd5b50565b60008151905062000bc08162000b95565b92915050565b6000806000806080858703121562000be35762000be2620009f8565b5b600085015167ffffffffffffffff81111562000c045762000c03620009fd565b5b62000c128782880162000b58565b945050602085015167ffffffffffffffff81111562000c365762000c35620009fd565b5b62000c448782880162000b58565b935050604085015167ffffffffffffffff81111562000c685762000c67620009fd565b5b62000c768782880162000b58565b925050606062000c898782880162000baf565b91505092959194509250565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000d0460328362000c95565b915062000d118262000ca6565b604082019050919050565b6000602082019050818103600083015262000d378162000cf5565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062000d76601a8362000c95565b915062000d838262000d3e565b602082019050919050565b6000602082019050818103600083015262000da98162000d67565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000e258262000e0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000e5b5762000e5a62000ddf565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000ec4602c8362000c95565b915062000ed18262000e66565b604082019050919050565b6000602082019050818103600083015262000ef78162000eb5565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000f36601d8362000c95565b915062000f438262000efe565b602082019050919050565b6000602082019050818103600083015262000f698162000f27565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000fce602b8362000c95565b915062000fdb8262000f70565b604082019050919050565b60006020820190508181036000830152620010018162000fbf565b9050919050565b6000620010158262000e0e565b9150620010228362000e0e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200105a576200105962000ddf565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010928262001065565b9050919050565b620010a48162001085565b82525050565b620010b58162000e0e565b82525050565b6000604082019050620010d2600083018562001099565b620010e16020830184620010aa565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200112060208362000c95565b91506200112d82620010e8565b602082019050919050565b60006020820190508181036000830152620011538162001111565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620011a257607f821691505b60208210811415620011b957620011b86200115a565b5b50919050565b60805160a051615c3f620011f360003960008181611c6501526135db0152600081816127c3015261359f0152615c3f6000f3fe6080604052600436106102e85760003560e01c80637501f74111610190578063b88d4fde116100dc578063e00cd18111610095578063f0293fd31161006f578063f0293fd314610b7b578063f2fde38b14610bb8578063f7d9757714610be1578063f91798b114610c0a5761032f565b8063e00cd18114610aea578063e33b7de314610b13578063e985e9c514610b3e5761032f565b8063b88d4fde146109c8578063c87b56dd146109f1578063ce7c2ac214610a2e578063cf23872e14610a6b578063d5abeb0114610a94578063dbdff2c114610abf5761032f565b806395d89b41116101495780639ddf7ad3116101235780639ddf7ad314610941578063a0712d681461096c578063a22cb46514610988578063a952a12e146109b15761032f565b806395d89b41146108b057806396ea3a47146108db5780639852595c146109045761032f565b80637501f7411461078c57806375ec2389146107b75780638462151c146107e25780638b83209b1461081f5780638da5cb5b1461085c57806394985ddd146108875761032f565b8063305c7d4a1161024f5780634f6ccce7116102085780636d7695b3116101e25780636d7695b3146106e457806370a082311461070d578063715018a61461074a578063722e141d146107615761032f565b80634f6ccce71461063f5780636352211e1461067c5780636c0360eb146106b95761032f565b8063305c7d4a146105645780633a98ef391461058f5780633b91ceef146105ba5780633ccfd60b146105e3578063425bc1e9146105ed57806342842e0e146106165761032f565b806319165587116102a157806319165587146104565780631b814f021461047f5780631d60865914610496578063203e1d82146104d357806323b872dd146104fe5780632f745c59146105275761032f565b806301ffc9a71461033457806302fe53051461037157806306fdde031461039a578063081812fc146103c5578063095ea7b31461040257806318160ddd1461042b5761032f565b3661032f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610316610c35565b34604051610325929190613be9565b60405180910390a1005b600080fd5b34801561034057600080fd5b5061035b60048036038101906103569190613c7e565b610c3d565b6040516103689190613cc6565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613e27565b610cb7565b005b3480156103a657600080fd5b506103af610d4d565b6040516103bc9190613ef8565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e79190613f46565b610ddf565b6040516103f99190613f73565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613fba565b610e64565b005b34801561043757600080fd5b50610440610f7c565b60405161044d9190613ffa565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190614053565b610f89565b005b34801561048b57600080fd5b506104946111f1565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190614080565b61125e565b6040516104ca9190613cc6565b60405180910390f35b3480156104df57600080fd5b506104e861127e565b6040516104f59190613ef8565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906140ad565b61130c565b005b34801561053357600080fd5b5061054e60048036038101906105499190613fba565b61136c565b60405161055b9190613ffa565b60405180910390f35b34801561057057600080fd5b506105796114b5565b6040516105869190613ffa565b60405180910390f35b34801561059b57600080fd5b506105a46114bb565b6040516105b19190613ffa565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614100565b6114c5565b005b6105eb611553565b005b3480156105f957600080fd5b50610614600480360381019061060f919061416c565b611648565b005b34801561062257600080fd5b5061063d600480360381019061063891906140ad565b6116e1565b005b34801561064b57600080fd5b5061066660048036038101906106619190613f46565b611701565b6040516106739190613ffa565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613f46565b611754565b6040516106b09190613f73565b60405180910390f35b3480156106c557600080fd5b506106ce611811565b6040516106db9190613ef8565b60405180910390f35b3480156106f057600080fd5b5061070b6004803603810190610706919061416c565b61189f565b005b34801561071957600080fd5b50610734600480360381019061072f9190614080565b611938565b6040516107419190613ffa565b60405180910390f35b34801561075657600080fd5b5061075f611a5e565b005b34801561076d57600080fd5b50610776611ae6565b6040516107839190613ffa565b60405180910390f35b34801561079857600080fd5b506107a1611aec565b6040516107ae9190613ffa565b60405180910390f35b3480156107c357600080fd5b506107cc611af2565b6040516107d99190613ffa565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190614080565b611af8565b6040516108169190614257565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613f46565b611bf1565b6040516108539190613f73565b60405180910390f35b34801561086857600080fd5b50610871611c39565b60405161087e9190613f73565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906142af565b611c63565b005b3480156108bc57600080fd5b506108c5611cff565b6040516108d29190613ef8565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd91906143a5565b611d91565b005b34801561091057600080fd5b5061092b60048036038101906109269190614080565b611f76565b6040516109389190613ffa565b60405180910390f35b34801561094d57600080fd5b50610956611fbf565b6040516109639190613cc6565b60405180910390f35b61098660048036038101906109819190613f46565b611fd2565b005b34801561099457600080fd5b506109af60048036038101906109aa9190614426565b612316565b005b3480156109bd57600080fd5b506109c6612497565b005b3480156109d457600080fd5b506109ef60048036038101906109ea9190614507565b61251d565b005b3480156109fd57600080fd5b50610a186004803603810190610a139190613f46565b61257f565b604051610a259190613ef8565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a509190614080565b612623565b604051610a629190613ffa565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190613e27565b61266c565b005b348015610aa057600080fd5b50610aa961273a565b604051610ab69190613ffa565b60405180910390f35b348015610acb57600080fd5b50610ad4612740565b604051610ae19190614599565b60405180910390f35b348015610af657600080fd5b50610b116004803603810190610b0c91906145b4565b6128af565b005b348015610b1f57600080fd5b50610b286129d0565b604051610b359190613ffa565b60405180910390f35b348015610b4a57600080fd5b50610b656004803603810190610b609190614601565b6129da565b604051610b729190613cc6565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614080565b612a6e565b604051610baf9190613ffa565b60405180910390f35b348015610bc457600080fd5b50610bdf6004803603810190610bda9190614080565b612a86565b005b348015610bed57600080fd5b50610c086004803603810190610c039190614100565b612b7e565b005b348015610c1657600080fd5b50610c1f612c0c565b604051610c2c9190613cc6565b60405180910390f35b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb05750610caf82612c1f565b5b9050919050565b610cbf610c35565b73ffffffffffffffffffffffffffffffffffffffff16610cdd611c39565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a9061468d565b60405180910390fd5b8060109080519060200190610d49929190613aec565b5050565b606060018054610d5c906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d88906146dc565b8015610dd55780601f10610daa57610100808354040283529160200191610dd5565b820191906000526020600020905b815481529060010190602001808311610db857829003601f168201915b5050505050905090565b6000610dea82612d01565b610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614780565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e6f82611754565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614812565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eff610c35565b73ffffffffffffffffffffffffffffffffffffffff161480610f2e5750610f2d81610f28610c35565b6129da565b5b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906148a4565b60405180910390fd5b610f778383612d89565b505050565b6000600380549050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290614936565b60405180910390fd5b60006008544761101b9190614985565b90506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600754600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846110ad91906149db565b6110b79190614a64565b6110c19190614a95565b90506000811415611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614b3b565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111529190614985565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806008546111a39190614985565b6008819055506111b38382612e42565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111e4929190614bba565b60405180910390a1505050565b60005b600b8054905081101561125b57611248600b828154811061121857611217614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f89565b808061125390614c12565b9150506111f4565b50565b60146020528060005260406000206000915054906101000a900460ff1681565b6011805461128b906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b7906146dc565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b505050505081565b61131d611317610c35565b82612f36565b61135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614ccd565b60405180910390fd5b611367838383613014565b505050565b600061137783611938565b82106113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90614d39565b60405180910390fd5b6000805b60038054905081101561146b57600381815481106113dd576113dc614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561145a578382141561144d5780925050506114af565b8161145790614c12565b91505b8061146490614c12565b90506113bc565b5060006114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490614d39565b60405180910390fd5b505b92915050565b601a5481565b6000600754905090565b6114cd610c35565b73ffffffffffffffffffffffffffffffffffffffff166114eb611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061468d565b60405180910390fd5b80601b81905550816019819055505050565b61155b610c35565b73ffffffffffffffffffffffffffffffffffffffff16611579611c39565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c69061468d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115f590614d8a565b60006040518083038185875af1925050503d8060008114611632576040519150601f19603f3d011682016040523d82523d6000602084013e611637565b606091505b505090508061164557600080fd5b50565b611650610c35565b73ffffffffffffffffffffffffffffffffffffffff1661166e611c39565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061468d565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6116fc8383836040518060200160405280600081525061251d565b505050565b600061170b610f7c565b821061174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390614deb565b60405180910390fd5b819050919050565b6000806003838154811061176b5761176a614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90614e7d565b60405180910390fd5b80915050919050565b6010805461181e906146dc565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906146dc565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b6118a7610c35565b73ffffffffffffffffffffffffffffffffffffffff166118c5611c39565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061468d565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090614f0f565b60405180910390fd5b600080600380549050905060005b81811015611a4f57600381815481106119d3576119d2614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a3e5782611a3b90614c12565b92505b80611a4890614c12565b90506119b7565b50600090508192505050919050565b611a66610c35565b73ffffffffffffffffffffffffffffffffffffffff16611a84611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad19061468d565b60405180910390fd5b611ae460006131cd565b565b60195481565b601b5481565b600f5481565b6060611b0382611938565b600010611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614d39565b60405180910390fd5b6000611b5083611938565b905060008167ffffffffffffffff811115611b6e57611b6d613cfc565b5b604051908082528060200260200182016040528015611b9c5781602001602082028036833780820191505090505b50905060005b82811015611be657611bb4858261136c565b828281518110611bc757611bc6614be3565b5b6020026020010181815250508080611bde90614c12565b915050611ba2565b508092505050919050565b6000600b8281548110611c0757611c06614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890614f7b565b60405180910390fd5b611cfb8282613293565b5050565b606060028054611d0e906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3a906146dc565b8015611d875780601f10611d5c57610100808354040283529160200191611d87565b820191906000526020600020905b815481529060010190602001808311611d6a57829003601f168201915b5050505050905090565b611d99610c35565b73ffffffffffffffffffffffffffffffffffffffff16611db7611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e049061468d565b60405180910390fd5b818190508484905014611e1f57600080fd5b600080611e2a610f7c565b905060005b86869050811015611e7257868682818110611e4d57611e4c614be3565b5b9050602002013583611e5f9190614985565b925080611e6b90614c12565b9050611e2f565b506012548282611e829190614985565b1115611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614fe7565b60405180910390fd5b6000915060005b84849050811015611f695760005b878783818110611eeb57611eea614be3565b5b90506020020135811015611f5757611f46868684818110611f0f57611f0e614be3565b5b9050602002016020810190611f249190614080565b8480611f2f90614c12565b9550604051806020016040528060008152506132f1565b80611f5090614c12565b9050611ed8565b5080611f6290614c12565b9050611eca565b5060009050505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601360009054906101000a900460ff1681565b6000611fdc610f7c565b90506000601b54905060006017549050601360019054906101000a900460ff1661210157601954915060165490506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050601360009054906101000a900460ff166120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190615053565b60405180910390fd5b806120ff57601360019054906101000a900460ff166120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906150bf565b60405180910390fd5b5b505b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080836121519190614a95565b925060008511612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d9061512b565b60405180910390fd5b828511156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090615197565b60405180910390fd5b60125485856121e89190614985565b1115612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090615197565b60405180910390fd5b848261223591906149db565b341015612277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226e90615203565b60405180910390fd5b60005b858110156122b8576122a73382876122929190614985565b604051806020016040528060008152506132f1565b806122b190614c12565b905061227a565b5084816122c59190614985565b905080601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600093505050505050565b61231e610c35565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561238c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123839061526f565b60405180910390fd5b8060056000612399610c35565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612446610c35565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248b9190613cc6565b60405180910390a35050565b61249f610c35565b73ffffffffffffffffffffffffffffffffffffffff166124bd611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a9061468d565b60405180910390fd5b61251b6111f1565b565b61252e612528610c35565b83612f36565b61256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614ccd565b60405180910390fd5b6125798484848461334c565b50505050565b60606012548211156125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd906152db565b60405180910390fd5b60006125d06133a8565b905060008151116125f0576040518060200160405280600081525061261b565b806125fa8461343a565b60405160200161260b929190615337565b6040516020818303038152906040525b915050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612674610c35565b73ffffffffffffffffffffffffffffffffffffffff16612692611c39565b73ffffffffffffffffffffffffffffffffffffffff16146126e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126df9061468d565b60405180910390fd5b80601190805190602001906126fe929190613aec565b507f64da8b6d17414a37cd0466a760322c2788fa397c09ca85a0260ba2becf8865d9601160405161272f91906153f0565b60405180910390a150565b60125481565b600061274a610c35565b73ffffffffffffffffffffffffffffffffffffffff16612768611c39565b73ffffffffffffffffffffffffffffffffffffffff16146127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b59061468d565b60405180910390fd5b600e547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161281a9190613f73565b602060405180830381865afa158015612837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285b9190615427565b101561289c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612893906154a0565b60405180910390fd5b6128aa600d54600e5461359b565b905090565b6128b7610c35565b73ffffffffffffffffffffffffffffffffffffffff166128d5611c39565b73ffffffffffffffffffffffffffffffffffffffff161461292b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129229061468d565b60405180910390fd5b60005b828290508110156129cb5760016014600085858581811061295257612951614be3565b5b90506020020160208101906129679190614080565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806129c390614c12565b91505061292e565b505050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60156020528060005260406000206000915090505481565b612a8e610c35565b73ffffffffffffffffffffffffffffffffffffffff16612aac611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af99061468d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6990615532565b60405180910390fd5b612b7b816131cd565b50565b612b86610c35565b73ffffffffffffffffffffffffffffffffffffffff16612ba4611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf19061468d565b60405180910390fd5b80601881905550816016819055505050565b601360019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cfa5750612cf9826136eb565b5b9050919050565b600060038054905082108015612d825750600073ffffffffffffffffffffffffffffffffffffffff1660038381548110612d3e57612d3d614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dfc83611754565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7c9061559e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612eab90614d8a565b60006040518083038185875af1925050503d8060008114612ee8576040519150601f19603f3d011682016040523d82523d6000602084013e612eed565b606091505b5050905080612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2890615630565b60405180910390fd5b505050565b6000612f4182612d01565b612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f77906156c2565b60405180910390fd5b6000612f8b83611754565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ffa57508373ffffffffffffffffffffffffffffffffffffffff16612fe284610ddf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061300b575061300a81856129da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303482611754565b73ffffffffffffffffffffffffffffffffffffffff161461308a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308190615754565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f1906157e6565b60405180910390fd5b613105838383613755565b613110600082612d89565b816003828154811061312557613124614be3565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061329d610f7c565b905080826132ab9190615806565b600f819055507f4d15b4dfb1435c8ae462a8ce19cedc8997d65a65e936f298fde8afdfb97323d9600f54846040516132e4929190615837565b60405180910390a1505050565b6132fb838361375a565b61330860008484846138e2565b613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e906158d2565b60405180910390fd5b505050565b613357848484613014565b613363848484846138e2565b6133a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613399906158d2565b60405180910390fd5b50505050565b6060601080546133b7906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546133e3906146dc565b80156134305780601f1061340557610100808354040283529160200191613430565b820191906000526020600020905b81548152906001019060200180831161341357829003601f168201915b5050505050905090565b60606000821415613482576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613596565b600082905060005b600082146134b457808061349d90614c12565b915050600a826134ad9190614a64565b915061348a565b60008167ffffffffffffffff8111156134d0576134cf613cfc565b5b6040519080825280601f01601f1916602001820160405280156135025781602001600182028036833780820191505090505b5090505b6000851461358f5760018261351b9190614a95565b9150600a8561352a9190615806565b60306135369190614985565b60f81b81838151811061354c5761354b614be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135889190614a64565b9450613506565b8093505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200161360f9291906158f2565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161363c93929190615970565b6020604051808303816000875af115801561365b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061367f91906159c3565b5060006136a18460003060008089815260200190815260200160002054613a6a565b90506001600080868152602001908152602001600020546136c29190614985565b600080868152602001908152602001600020819055506136e28482613aa6565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c190615a3c565b60405180910390fd5b6137d381612d01565b15613813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380a90615aa8565b60405180910390fd5b61381f60008383613755565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006139038473ffffffffffffffffffffffffffffffffffffffff16613ad9565b15613a5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261392c610c35565b8786866040518563ffffffff1660e01b815260040161394e9493929190615ac8565b6020604051808303816000875af192505050801561398a57506040513d601f19601f820116820180604052508101906139879190615b29565b60015b613a0d573d80600081146139ba576040519150601f19603f3d011682016040523d82523d6000602084013e6139bf565b606091505b50600081511415613a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fc906158d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a62565b600190505b949350505050565b600084848484604051602001613a839493929190615b56565b6040516020818303038152906040528051906020012060001c9050949350505050565b60008282604051602001613abb929190615bdd565b60405160208183030381529060405280519060200120905092915050565b600080823b905060008111915050919050565b828054613af8906146dc565b90600052602060002090601f016020900481019282613b1a5760008555613b61565b82601f10613b3357805160ff1916838001178555613b61565b82800160010185558215613b61579182015b82811115613b60578251825591602001919060010190613b45565b5b509050613b6e9190613b72565b5090565b5b80821115613b8b576000816000905550600101613b73565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bba82613b8f565b9050919050565b613bca81613baf565b82525050565b6000819050919050565b613be381613bd0565b82525050565b6000604082019050613bfe6000830185613bc1565b613c0b6020830184613bda565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5b81613c26565b8114613c6657600080fd5b50565b600081359050613c7881613c52565b92915050565b600060208284031215613c9457613c93613c1c565b5b6000613ca284828501613c69565b91505092915050565b60008115159050919050565b613cc081613cab565b82525050565b6000602082019050613cdb6000830184613cb7565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3482613ceb565b810181811067ffffffffffffffff82111715613d5357613d52613cfc565b5b80604052505050565b6000613d66613c12565b9050613d728282613d2b565b919050565b600067ffffffffffffffff821115613d9257613d91613cfc565b5b613d9b82613ceb565b9050602081019050919050565b82818337600083830152505050565b6000613dca613dc584613d77565b613d5c565b905082815260208101848484011115613de657613de5613ce6565b5b613df1848285613da8565b509392505050565b600082601f830112613e0e57613e0d613ce1565b5b8135613e1e848260208601613db7565b91505092915050565b600060208284031215613e3d57613e3c613c1c565b5b600082013567ffffffffffffffff811115613e5b57613e5a613c21565b5b613e6784828501613df9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613eaa578082015181840152602081019050613e8f565b83811115613eb9576000848401525b50505050565b6000613eca82613e70565b613ed48185613e7b565b9350613ee4818560208601613e8c565b613eed81613ceb565b840191505092915050565b60006020820190508181036000830152613f128184613ebf565b905092915050565b613f2381613bd0565b8114613f2e57600080fd5b50565b600081359050613f4081613f1a565b92915050565b600060208284031215613f5c57613f5b613c1c565b5b6000613f6a84828501613f31565b91505092915050565b6000602082019050613f886000830184613bc1565b92915050565b613f9781613baf565b8114613fa257600080fd5b50565b600081359050613fb481613f8e565b92915050565b60008060408385031215613fd157613fd0613c1c565b5b6000613fdf85828601613fa5565b9250506020613ff085828601613f31565b9150509250929050565b600060208201905061400f6000830184613bda565b92915050565b600061402082613b8f565b9050919050565b61403081614015565b811461403b57600080fd5b50565b60008135905061404d81614027565b92915050565b60006020828403121561406957614068613c1c565b5b60006140778482850161403e565b91505092915050565b60006020828403121561409657614095613c1c565b5b60006140a484828501613fa5565b91505092915050565b6000806000606084860312156140c6576140c5613c1c565b5b60006140d486828701613fa5565b93505060206140e586828701613fa5565b92505060406140f686828701613f31565b9150509250925092565b6000806040838503121561411757614116613c1c565b5b600061412585828601613f31565b925050602061413685828601613f31565b9150509250929050565b61414981613cab565b811461415457600080fd5b50565b60008135905061416681614140565b92915050565b60006020828403121561418257614181613c1c565b5b600061419084828501614157565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141ce81613bd0565b82525050565b60006141e083836141c5565b60208301905092915050565b6000602082019050919050565b600061420482614199565b61420e81856141a4565b9350614219836141b5565b8060005b8381101561424a57815161423188826141d4565b975061423c836141ec565b92505060018101905061421d565b5085935050505092915050565b6000602082019050818103600083015261427181846141f9565b905092915050565b6000819050919050565b61428c81614279565b811461429757600080fd5b50565b6000813590506142a981614283565b92915050565b600080604083850312156142c6576142c5613c1c565b5b60006142d48582860161429a565b92505060206142e585828601613f31565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261430f5761430e613ce1565b5b8235905067ffffffffffffffff81111561432c5761432b6142ef565b5b602083019150836020820283011115614348576143476142f4565b5b9250929050565b60008083601f84011261436557614364613ce1565b5b8235905067ffffffffffffffff811115614382576143816142ef565b5b60208301915083602082028301111561439e5761439d6142f4565b5b9250929050565b600080600080604085870312156143bf576143be613c1c565b5b600085013567ffffffffffffffff8111156143dd576143dc613c21565b5b6143e9878288016142f9565b9450945050602085013567ffffffffffffffff81111561440c5761440b613c21565b5b6144188782880161434f565b925092505092959194509250565b6000806040838503121561443d5761443c613c1c565b5b600061444b85828601613fa5565b925050602061445c85828601614157565b9150509250929050565b600067ffffffffffffffff82111561448157614480613cfc565b5b61448a82613ceb565b9050602081019050919050565b60006144aa6144a584614466565b613d5c565b9050828152602081018484840111156144c6576144c5613ce6565b5b6144d1848285613da8565b509392505050565b600082601f8301126144ee576144ed613ce1565b5b81356144fe848260208601614497565b91505092915050565b6000806000806080858703121561452157614520613c1c565b5b600061452f87828801613fa5565b945050602061454087828801613fa5565b935050604061455187828801613f31565b925050606085013567ffffffffffffffff81111561457257614571613c21565b5b61457e878288016144d9565b91505092959194509250565b61459381614279565b82525050565b60006020820190506145ae600083018461458a565b92915050565b600080602083850312156145cb576145ca613c1c565b5b600083013567ffffffffffffffff8111156145e9576145e8613c21565b5b6145f58582860161434f565b92509250509250929050565b6000806040838503121561461857614617613c1c565b5b600061462685828601613fa5565b925050602061463785828601613fa5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614677602083613e7b565b915061468282614641565b602082019050919050565b600060208201905081810360008301526146a68161466a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146f457607f821691505b60208210811415614708576147076146ad565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061476a602c83613e7b565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147fc602183613e7b565b9150614807826147a0565b604082019050919050565b6000602082019050818103600083015261482b816147ef565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061488e603883613e7b565b915061489982614832565b604082019050919050565b600060208201905081810360008301526148bd81614881565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614920602683613e7b565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061499082613bd0565b915061499b83613bd0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149d0576149cf614956565b5b828201905092915050565b60006149e682613bd0565b91506149f183613bd0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a2a57614a29614956565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a6f82613bd0565b9150614a7a83613bd0565b925082614a8a57614a89614a35565b5b828204905092915050565b6000614aa082613bd0565b9150614aab83613bd0565b925082821015614abe57614abd614956565b5b828203905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614b25602b83613e7b565b9150614b3082614ac9565b604082019050919050565b60006020820190508181036000830152614b5481614b18565b9050919050565b6000819050919050565b6000614b80614b7b614b7684613b8f565b614b5b565b613b8f565b9050919050565b6000614b9282614b65565b9050919050565b6000614ba482614b87565b9050919050565b614bb481614b99565b82525050565b6000604082019050614bcf6000830185614bab565b614bdc6020830184613bda565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614c1d82613bd0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5057614c4f614956565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614cb7603183613e7b565b9150614cc282614c5b565b604082019050919050565b60006020820190508181036000830152614ce681614caa565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000614d23601683613e7b565b9150614d2e82614ced565b602082019050919050565b60006020820190508181036000830152614d5281614d16565b9050919050565b600081905092915050565b50565b6000614d74600083614d59565b9150614d7f82614d64565b600082019050919050565b6000614d9582614d67565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000614dd5601783613e7b565b9150614de082614d9f565b602082019050919050565b60006020820190508181036000830152614e0481614dc8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614e67602983613e7b565b9150614e7282614e0b565b604082019050919050565b60006020820190508181036000830152614e9681614e5a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614ef9602a83613e7b565b9150614f0482614e9d565b604082019050919050565b60006020820190508181036000830152614f2881614eec565b9050919050565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b6000614f65601f83613e7b565b9150614f7082614f2f565b602082019050919050565b60006020820190508181036000830152614f9481614f58565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000614fd1600883613e7b565b9150614fdc82614f9b565b602082019050919050565b6000602082019050818103600083015261500081614fc4565b9050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b600061503d601783613e7b565b915061504882615007565b602082019050919050565b6000602082019050818103600083015261506c81615030565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006150a9601883613e7b565b91506150b482615073565b602082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e65204e46542e0000000000600082015250565b6000615115601b83613e7b565b9150615120826150df565b602082019050919050565b6000602082019050818103600083015261514481615108565b9050919050565b7f4d696e74206c6573730000000000000000000000000000000000000000000000600082015250565b6000615181600983613e7b565b915061518c8261514b565b602082019050919050565b600060208201905081810360008301526151b081615174565b9050919050565b7f4d4154494320696e7075742069732077726f6e67000000000000000000000000600082015250565b60006151ed601483613e7b565b91506151f8826151b7565b602082019050919050565b6000602082019050818103600083015261521c816151e0565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615259601983613e7b565b915061526482615223565b602082019050919050565b600060208201905081810360008301526152888161524c565b9050919050565b7f546f6b656e204944206f7574206f6620626f756e647321000000000000000000600082015250565b60006152c5601783613e7b565b91506152d08261528f565b602082019050919050565b600060208201905081810360008301526152f4816152b8565b9050919050565b600081905092915050565b600061531182613e70565b61531b81856152fb565b935061532b818560208601613e8c565b80840191505092915050565b60006153438285615306565b915061534f8284615306565b91508190509392505050565b60008190508160005260206000209050919050565b6000815461537d816146dc565b6153878186613e7b565b945060018216600081146153a257600181146153b4576153e7565b60ff19831686526020860193506153e7565b6153bd8561535b565b60005b838110156153df578154818901526001820191506020810190506153c0565b808801955050505b50505092915050565b6000602082019050818103600083015261540a8184615370565b905092915050565b60008151905061542181613f1a565b92915050565b60006020828403121561543d5761543c613c1c565b5b600061544b84828501615412565b91505092915050565b7f4e6f7420656e6f756768204c494e4b2100000000000000000000000000000000600082015250565b600061548a601083613e7b565b915061549582615454565b602082019050919050565b600060208201905081810360008301526154b98161547d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061551c602683613e7b565b9150615527826154c0565b604082019050919050565b6000602082019050818103600083015261554b8161550f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615588601d83613e7b565b915061559382615552565b602082019050919050565b600060208201905081810360008301526155b78161557b565b9050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061561a603a83613e7b565b9150615625826155be565b604082019050919050565b600060208201905081810360008301526156498161560d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006156ac602c83613e7b565b91506156b782615650565b604082019050919050565b600060208201905081810360008301526156db8161569f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061573e602983613e7b565b9150615749826156e2565b604082019050919050565b6000602082019050818103600083015261576d81615731565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006157d0602483613e7b565b91506157db82615774565b604082019050919050565b600060208201905081810360008301526157ff816157c3565b9050919050565b600061581182613bd0565b915061581c83613bd0565b92508261582c5761582b614a35565b5b828206905092915050565b600060408201905061584c6000830185613bda565b615859602083018461458a565b9392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158bc603283613e7b565b91506158c782615860565b604082019050919050565b600060208201905081810360008301526158eb816158af565b9050919050565b6000604082019050615907600083018561458a565b6159146020830184613bda565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006159428261591b565b61594c8185615926565b935061595c818560208601613e8c565b61596581613ceb565b840191505092915050565b60006060820190506159856000830186613bc1565b6159926020830185613bda565b81810360408301526159a48184615937565b9050949350505050565b6000815190506159bd81614140565b92915050565b6000602082840312156159d9576159d8613c1c565b5b60006159e7848285016159ae565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a26602083613e7b565b9150615a31826159f0565b602082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a92601c83613e7b565b9150615a9d82615a5c565b602082019050919050565b60006020820190508181036000830152615ac181615a85565b9050919050565b6000608082019050615add6000830187613bc1565b615aea6020830186613bc1565b615af76040830185613bda565b8181036060830152615b098184615937565b905095945050505050565b600081519050615b2381613c52565b92915050565b600060208284031215615b3f57615b3e613c1c565b5b6000615b4d84828501615b14565b91505092915050565b6000608082019050615b6b600083018761458a565b615b786020830186613bda565b615b856040830185613bc1565b615b926060830184613bda565b95945050505050565b6000819050919050565b615bb6615bb182614279565b615b9b565b82525050565b6000819050919050565b615bd7615bd282613bd0565b615bbc565b82525050565b6000615be98285615ba5565b602082019150615bf98284615bc6565b602082019150819050939250505056fea2646970667358221220b93eba5bb9c2f0e803901101fd1196ff097e89a137be11ab2de89448c259d80064736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100f86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da000000000000000000000000000000000000000000000000000000000000001948616e7a6f20466f756e6465727320436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000548414e5a4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f646f676972612e66696e616e63652f48616e7a6f46432f00
Deployed Bytecode
0x6080604052600436106102e85760003560e01c80637501f74111610190578063b88d4fde116100dc578063e00cd18111610095578063f0293fd31161006f578063f0293fd314610b7b578063f2fde38b14610bb8578063f7d9757714610be1578063f91798b114610c0a5761032f565b8063e00cd18114610aea578063e33b7de314610b13578063e985e9c514610b3e5761032f565b8063b88d4fde146109c8578063c87b56dd146109f1578063ce7c2ac214610a2e578063cf23872e14610a6b578063d5abeb0114610a94578063dbdff2c114610abf5761032f565b806395d89b41116101495780639ddf7ad3116101235780639ddf7ad314610941578063a0712d681461096c578063a22cb46514610988578063a952a12e146109b15761032f565b806395d89b41146108b057806396ea3a47146108db5780639852595c146109045761032f565b80637501f7411461078c57806375ec2389146107b75780638462151c146107e25780638b83209b1461081f5780638da5cb5b1461085c57806394985ddd146108875761032f565b8063305c7d4a1161024f5780634f6ccce7116102085780636d7695b3116101e25780636d7695b3146106e457806370a082311461070d578063715018a61461074a578063722e141d146107615761032f565b80634f6ccce71461063f5780636352211e1461067c5780636c0360eb146106b95761032f565b8063305c7d4a146105645780633a98ef391461058f5780633b91ceef146105ba5780633ccfd60b146105e3578063425bc1e9146105ed57806342842e0e146106165761032f565b806319165587116102a157806319165587146104565780631b814f021461047f5780631d60865914610496578063203e1d82146104d357806323b872dd146104fe5780632f745c59146105275761032f565b806301ffc9a71461033457806302fe53051461037157806306fdde031461039a578063081812fc146103c5578063095ea7b31461040257806318160ddd1461042b5761032f565b3661032f577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770610316610c35565b34604051610325929190613be9565b60405180910390a1005b600080fd5b34801561034057600080fd5b5061035b60048036038101906103569190613c7e565b610c3d565b6040516103689190613cc6565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190613e27565b610cb7565b005b3480156103a657600080fd5b506103af610d4d565b6040516103bc9190613ef8565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e79190613f46565b610ddf565b6040516103f99190613f73565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613fba565b610e64565b005b34801561043757600080fd5b50610440610f7c565b60405161044d9190613ffa565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190614053565b610f89565b005b34801561048b57600080fd5b506104946111f1565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190614080565b61125e565b6040516104ca9190613cc6565b60405180910390f35b3480156104df57600080fd5b506104e861127e565b6040516104f59190613ef8565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906140ad565b61130c565b005b34801561053357600080fd5b5061054e60048036038101906105499190613fba565b61136c565b60405161055b9190613ffa565b60405180910390f35b34801561057057600080fd5b506105796114b5565b6040516105869190613ffa565b60405180910390f35b34801561059b57600080fd5b506105a46114bb565b6040516105b19190613ffa565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614100565b6114c5565b005b6105eb611553565b005b3480156105f957600080fd5b50610614600480360381019061060f919061416c565b611648565b005b34801561062257600080fd5b5061063d600480360381019061063891906140ad565b6116e1565b005b34801561064b57600080fd5b5061066660048036038101906106619190613f46565b611701565b6040516106739190613ffa565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613f46565b611754565b6040516106b09190613f73565b60405180910390f35b3480156106c557600080fd5b506106ce611811565b6040516106db9190613ef8565b60405180910390f35b3480156106f057600080fd5b5061070b6004803603810190610706919061416c565b61189f565b005b34801561071957600080fd5b50610734600480360381019061072f9190614080565b611938565b6040516107419190613ffa565b60405180910390f35b34801561075657600080fd5b5061075f611a5e565b005b34801561076d57600080fd5b50610776611ae6565b6040516107839190613ffa565b60405180910390f35b34801561079857600080fd5b506107a1611aec565b6040516107ae9190613ffa565b60405180910390f35b3480156107c357600080fd5b506107cc611af2565b6040516107d99190613ffa565b60405180910390f35b3480156107ee57600080fd5b5061080960048036038101906108049190614080565b611af8565b6040516108169190614257565b60405180910390f35b34801561082b57600080fd5b5061084660048036038101906108419190613f46565b611bf1565b6040516108539190613f73565b60405180910390f35b34801561086857600080fd5b50610871611c39565b60405161087e9190613f73565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906142af565b611c63565b005b3480156108bc57600080fd5b506108c5611cff565b6040516108d29190613ef8565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd91906143a5565b611d91565b005b34801561091057600080fd5b5061092b60048036038101906109269190614080565b611f76565b6040516109389190613ffa565b60405180910390f35b34801561094d57600080fd5b50610956611fbf565b6040516109639190613cc6565b60405180910390f35b61098660048036038101906109819190613f46565b611fd2565b005b34801561099457600080fd5b506109af60048036038101906109aa9190614426565b612316565b005b3480156109bd57600080fd5b506109c6612497565b005b3480156109d457600080fd5b506109ef60048036038101906109ea9190614507565b61251d565b005b3480156109fd57600080fd5b50610a186004803603810190610a139190613f46565b61257f565b604051610a259190613ef8565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a509190614080565b612623565b604051610a629190613ffa565b60405180910390f35b348015610a7757600080fd5b50610a926004803603810190610a8d9190613e27565b61266c565b005b348015610aa057600080fd5b50610aa961273a565b604051610ab69190613ffa565b60405180910390f35b348015610acb57600080fd5b50610ad4612740565b604051610ae19190614599565b60405180910390f35b348015610af657600080fd5b50610b116004803603810190610b0c91906145b4565b6128af565b005b348015610b1f57600080fd5b50610b286129d0565b604051610b359190613ffa565b60405180910390f35b348015610b4a57600080fd5b50610b656004803603810190610b609190614601565b6129da565b604051610b729190613cc6565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d9190614080565b612a6e565b604051610baf9190613ffa565b60405180910390f35b348015610bc457600080fd5b50610bdf6004803603810190610bda9190614080565b612a86565b005b348015610bed57600080fd5b50610c086004803603810190610c039190614100565b612b7e565b005b348015610c1657600080fd5b50610c1f612c0c565b604051610c2c9190613cc6565b60405180910390f35b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb05750610caf82612c1f565b5b9050919050565b610cbf610c35565b73ffffffffffffffffffffffffffffffffffffffff16610cdd611c39565b73ffffffffffffffffffffffffffffffffffffffff1614610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a9061468d565b60405180910390fd5b8060109080519060200190610d49929190613aec565b5050565b606060018054610d5c906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d88906146dc565b8015610dd55780601f10610daa57610100808354040283529160200191610dd5565b820191906000526020600020905b815481529060010190602001808311610db857829003601f168201915b5050505050905090565b6000610dea82612d01565b610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2090614780565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e6f82611754565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790614812565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610eff610c35565b73ffffffffffffffffffffffffffffffffffffffff161480610f2e5750610f2d81610f28610c35565b6129da565b5b610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906148a4565b60405180910390fd5b610f778383612d89565b505050565b6000600380549050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290614936565b60405180910390fd5b60006008544761101b9190614985565b90506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600754600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846110ad91906149db565b6110b79190614a64565b6110c19190614a95565b90506000811415611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614b3b565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111529190614985565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806008546111a39190614985565b6008819055506111b38382612e42565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516111e4929190614bba565b60405180910390a1505050565b60005b600b8054905081101561125b57611248600b828154811061121857611217614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f89565b808061125390614c12565b9150506111f4565b50565b60146020528060005260406000206000915054906101000a900460ff1681565b6011805461128b906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b7906146dc565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b505050505081565b61131d611317610c35565b82612f36565b61135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614ccd565b60405180910390fd5b611367838383613014565b505050565b600061137783611938565b82106113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90614d39565b60405180910390fd5b6000805b60038054905081101561146b57600381815481106113dd576113dc614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561145a578382141561144d5780925050506114af565b8161145790614c12565b91505b8061146490614c12565b90506113bc565b5060006114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490614d39565b60405180910390fd5b505b92915050565b601a5481565b6000600754905090565b6114cd610c35565b73ffffffffffffffffffffffffffffffffffffffff166114eb611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115389061468d565b60405180910390fd5b80601b81905550816019819055505050565b61155b610c35565b73ffffffffffffffffffffffffffffffffffffffff16611579611c39565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c69061468d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115f590614d8a565b60006040518083038185875af1925050503d8060008114611632576040519150601f19603f3d011682016040523d82523d6000602084013e611637565b606091505b505090508061164557600080fd5b50565b611650610c35565b73ffffffffffffffffffffffffffffffffffffffff1661166e611c39565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061468d565b60405180910390fd5b80601360006101000a81548160ff02191690831515021790555050565b6116fc8383836040518060200160405280600081525061251d565b505050565b600061170b610f7c565b821061174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390614deb565b60405180910390fd5b819050919050565b6000806003838154811061176b5761176a614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90614e7d565b60405180910390fd5b80915050919050565b6010805461181e906146dc565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906146dc565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b505050505081565b6118a7610c35565b73ffffffffffffffffffffffffffffffffffffffff166118c5611c39565b73ffffffffffffffffffffffffffffffffffffffff161461191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119129061468d565b60405180910390fd5b80601360016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090614f0f565b60405180910390fd5b600080600380549050905060005b81811015611a4f57600381815481106119d3576119d2614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611a3e5782611a3b90614c12565b92505b80611a4890614c12565b90506119b7565b50600090508192505050919050565b611a66610c35565b73ffffffffffffffffffffffffffffffffffffffff16611a84611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad19061468d565b60405180910390fd5b611ae460006131cd565b565b60195481565b601b5481565b600f5481565b6060611b0382611938565b600010611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614d39565b60405180910390fd5b6000611b5083611938565b905060008167ffffffffffffffff811115611b6e57611b6d613cfc565b5b604051908082528060200260200182016040528015611b9c5781602001602082028036833780820191505090505b50905060005b82811015611be657611bb4858261136c565b828281518110611bc757611bc6614be3565b5b6020026020010181815250508080611bde90614c12565b915050611ba2565b508092505050919050565b6000600b8281548110611c0757611c06614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f0000000000000000000000003d2341adb2d31f1c5530cdc622016af293177ae073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce890614f7b565b60405180910390fd5b611cfb8282613293565b5050565b606060028054611d0e906146dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3a906146dc565b8015611d875780601f10611d5c57610100808354040283529160200191611d87565b820191906000526020600020905b815481529060010190602001808311611d6a57829003601f168201915b5050505050905090565b611d99610c35565b73ffffffffffffffffffffffffffffffffffffffff16611db7611c39565b73ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e049061468d565b60405180910390fd5b818190508484905014611e1f57600080fd5b600080611e2a610f7c565b905060005b86869050811015611e7257868682818110611e4d57611e4c614be3565b5b9050602002013583611e5f9190614985565b925080611e6b90614c12565b9050611e2f565b506012548282611e829190614985565b1115611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba90614fe7565b60405180910390fd5b6000915060005b84849050811015611f695760005b878783818110611eeb57611eea614be3565b5b90506020020135811015611f5757611f46868684818110611f0f57611f0e614be3565b5b9050602002016020810190611f249190614080565b8480611f2f90614c12565b9550604051806020016040528060008152506132f1565b80611f5090614c12565b9050611ed8565b5080611f6290614c12565b9050611eca565b5060009050505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601360009054906101000a900460ff1681565b6000611fdc610f7c565b90506000601b54905060006017549050601360019054906101000a900460ff1661210157601954915060165490506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050601360009054906101000a900460ff166120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190615053565b60405180910390fd5b806120ff57601360019054906101000a900460ff166120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f5906150bf565b60405180910390fd5b5b505b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080836121519190614a95565b925060008511612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d9061512b565b60405180910390fd5b828511156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090615197565b60405180910390fd5b60125485856121e89190614985565b1115612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090615197565b60405180910390fd5b848261223591906149db565b341015612277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226e90615203565b60405180910390fd5b60005b858110156122b8576122a73382876122929190614985565b604051806020016040528060008152506132f1565b806122b190614c12565b905061227a565b5084816122c59190614985565b905080601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600093505050505050565b61231e610c35565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561238c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123839061526f565b60405180910390fd5b8060056000612399610c35565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612446610c35565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161248b9190613cc6565b60405180910390a35050565b61249f610c35565b73ffffffffffffffffffffffffffffffffffffffff166124bd611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a9061468d565b60405180910390fd5b61251b6111f1565b565b61252e612528610c35565b83612f36565b61256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256490614ccd565b60405180910390fd5b6125798484848461334c565b50505050565b60606012548211156125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd906152db565b60405180910390fd5b60006125d06133a8565b905060008151116125f0576040518060200160405280600081525061261b565b806125fa8461343a565b60405160200161260b929190615337565b6040516020818303038152906040525b915050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612674610c35565b73ffffffffffffffffffffffffffffffffffffffff16612692611c39565b73ffffffffffffffffffffffffffffffffffffffff16146126e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126df9061468d565b60405180910390fd5b80601190805190602001906126fe929190613aec565b507f64da8b6d17414a37cd0466a760322c2788fa397c09ca85a0260ba2becf8865d9601160405161272f91906153f0565b60405180910390a150565b60125481565b600061274a610c35565b73ffffffffffffffffffffffffffffffffffffffff16612768611c39565b73ffffffffffffffffffffffffffffffffffffffff16146127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b59061468d565b60405180910390fd5b600e547f000000000000000000000000b0897686c545045afc77cf20ec7a532e3120e0f173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161281a9190613f73565b602060405180830381865afa158015612837573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061285b9190615427565b101561289c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612893906154a0565b60405180910390fd5b6128aa600d54600e5461359b565b905090565b6128b7610c35565b73ffffffffffffffffffffffffffffffffffffffff166128d5611c39565b73ffffffffffffffffffffffffffffffffffffffff161461292b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129229061468d565b60405180910390fd5b60005b828290508110156129cb5760016014600085858581811061295257612951614be3565b5b90506020020160208101906129679190614080565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806129c390614c12565b91505061292e565b505050565b6000600854905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60156020528060005260406000206000915090505481565b612a8e610c35565b73ffffffffffffffffffffffffffffffffffffffff16612aac611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af99061468d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6990615532565b60405180910390fd5b612b7b816131cd565b50565b612b86610c35565b73ffffffffffffffffffffffffffffffffffffffff16612ba4611c39565b73ffffffffffffffffffffffffffffffffffffffff1614612bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf19061468d565b60405180910390fd5b80601881905550816016819055505050565b601360019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cfa5750612cf9826136eb565b5b9050919050565b600060038054905082108015612d825750600073ffffffffffffffffffffffffffffffffffffffff1660038381548110612d3e57612d3d614be3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612dfc83611754565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7c9061559e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612eab90614d8a565b60006040518083038185875af1925050503d8060008114612ee8576040519150601f19603f3d011682016040523d82523d6000602084013e612eed565b606091505b5050905080612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2890615630565b60405180910390fd5b505050565b6000612f4182612d01565b612f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f77906156c2565b60405180910390fd5b6000612f8b83611754565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ffa57508373ffffffffffffffffffffffffffffffffffffffff16612fe284610ddf565b73ffffffffffffffffffffffffffffffffffffffff16145b8061300b575061300a81856129da565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303482611754565b73ffffffffffffffffffffffffffffffffffffffff161461308a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308190615754565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f1906157e6565b60405180910390fd5b613105838383613755565b613110600082612d89565b816003828154811061312557613124614be3565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061329d610f7c565b905080826132ab9190615806565b600f819055507f4d15b4dfb1435c8ae462a8ce19cedc8997d65a65e936f298fde8afdfb97323d9600f54846040516132e4929190615837565b60405180910390a1505050565b6132fb838361375a565b61330860008484846138e2565b613347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333e906158d2565b60405180910390fd5b505050565b613357848484613014565b613363848484846138e2565b6133a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613399906158d2565b60405180910390fd5b50505050565b6060601080546133b7906146dc565b80601f01602080910402602001604051908101604052809291908181526020018280546133e3906146dc565b80156134305780601f1061340557610100808354040283529160200191613430565b820191906000526020600020905b81548152906001019060200180831161341357829003601f168201915b5050505050905090565b60606000821415613482576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613596565b600082905060005b600082146134b457808061349d90614c12565b915050600a826134ad9190614a64565b915061348a565b60008167ffffffffffffffff8111156134d0576134cf613cfc565b5b6040519080825280601f01601f1916602001820160405280156135025781602001600182028036833780820191505090505b5090505b6000851461358f5760018261351b9190614a95565b9150600a8561352a9190615806565b60306135369190614985565b60f81b81838151811061354c5761354b614be3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135889190614a64565b9450613506565b8093505050505b919050565b60007f000000000000000000000000b0897686c545045afc77cf20ec7a532e3120e0f173ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000003d2341adb2d31f1c5530cdc622016af293177ae08486600060405160200161360f9291906158f2565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161363c93929190615970565b6020604051808303816000875af115801561365b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061367f91906159c3565b5060006136a18460003060008089815260200190815260200160002054613a6a565b90506001600080868152602001908152602001600020546136c29190614985565b600080868152602001908152602001600020819055506136e28482613aa6565b91505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c190615a3c565b60405180910390fd5b6137d381612d01565b15613813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380a90615aa8565b60405180910390fd5b61381f60008383613755565b6003829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006139038473ffffffffffffffffffffffffffffffffffffffff16613ad9565b15613a5d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261392c610c35565b8786866040518563ffffffff1660e01b815260040161394e9493929190615ac8565b6020604051808303816000875af192505050801561398a57506040513d601f19601f820116820180604052508101906139879190615b29565b60015b613a0d573d80600081146139ba576040519150601f19603f3d011682016040523d82523d6000602084013e6139bf565b606091505b50600081511415613a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fc906158d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a62565b600190505b949350505050565b600084848484604051602001613a839493929190615b56565b6040516020818303038152906040528051906020012060001c9050949350505050565b60008282604051602001613abb929190615bdd565b60405160208183030381529060405280519060200120905092915050565b600080823b905060008111915050919050565b828054613af8906146dc565b90600052602060002090601f016020900481019282613b1a5760008555613b61565b82601f10613b3357805160ff1916838001178555613b61565b82800160010185558215613b61579182015b82811115613b60578251825591602001919060010190613b45565b5b509050613b6e9190613b72565b5090565b5b80821115613b8b576000816000905550600101613b73565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bba82613b8f565b9050919050565b613bca81613baf565b82525050565b6000819050919050565b613be381613bd0565b82525050565b6000604082019050613bfe6000830185613bc1565b613c0b6020830184613bda565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5b81613c26565b8114613c6657600080fd5b50565b600081359050613c7881613c52565b92915050565b600060208284031215613c9457613c93613c1c565b5b6000613ca284828501613c69565b91505092915050565b60008115159050919050565b613cc081613cab565b82525050565b6000602082019050613cdb6000830184613cb7565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3482613ceb565b810181811067ffffffffffffffff82111715613d5357613d52613cfc565b5b80604052505050565b6000613d66613c12565b9050613d728282613d2b565b919050565b600067ffffffffffffffff821115613d9257613d91613cfc565b5b613d9b82613ceb565b9050602081019050919050565b82818337600083830152505050565b6000613dca613dc584613d77565b613d5c565b905082815260208101848484011115613de657613de5613ce6565b5b613df1848285613da8565b509392505050565b600082601f830112613e0e57613e0d613ce1565b5b8135613e1e848260208601613db7565b91505092915050565b600060208284031215613e3d57613e3c613c1c565b5b600082013567ffffffffffffffff811115613e5b57613e5a613c21565b5b613e6784828501613df9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613eaa578082015181840152602081019050613e8f565b83811115613eb9576000848401525b50505050565b6000613eca82613e70565b613ed48185613e7b565b9350613ee4818560208601613e8c565b613eed81613ceb565b840191505092915050565b60006020820190508181036000830152613f128184613ebf565b905092915050565b613f2381613bd0565b8114613f2e57600080fd5b50565b600081359050613f4081613f1a565b92915050565b600060208284031215613f5c57613f5b613c1c565b5b6000613f6a84828501613f31565b91505092915050565b6000602082019050613f886000830184613bc1565b92915050565b613f9781613baf565b8114613fa257600080fd5b50565b600081359050613fb481613f8e565b92915050565b60008060408385031215613fd157613fd0613c1c565b5b6000613fdf85828601613fa5565b9250506020613ff085828601613f31565b9150509250929050565b600060208201905061400f6000830184613bda565b92915050565b600061402082613b8f565b9050919050565b61403081614015565b811461403b57600080fd5b50565b60008135905061404d81614027565b92915050565b60006020828403121561406957614068613c1c565b5b60006140778482850161403e565b91505092915050565b60006020828403121561409657614095613c1c565b5b60006140a484828501613fa5565b91505092915050565b6000806000606084860312156140c6576140c5613c1c565b5b60006140d486828701613fa5565b93505060206140e586828701613fa5565b92505060406140f686828701613f31565b9150509250925092565b6000806040838503121561411757614116613c1c565b5b600061412585828601613f31565b925050602061413685828601613f31565b9150509250929050565b61414981613cab565b811461415457600080fd5b50565b60008135905061416681614140565b92915050565b60006020828403121561418257614181613c1c565b5b600061419084828501614157565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141ce81613bd0565b82525050565b60006141e083836141c5565b60208301905092915050565b6000602082019050919050565b600061420482614199565b61420e81856141a4565b9350614219836141b5565b8060005b8381101561424a57815161423188826141d4565b975061423c836141ec565b92505060018101905061421d565b5085935050505092915050565b6000602082019050818103600083015261427181846141f9565b905092915050565b6000819050919050565b61428c81614279565b811461429757600080fd5b50565b6000813590506142a981614283565b92915050565b600080604083850312156142c6576142c5613c1c565b5b60006142d48582860161429a565b92505060206142e585828601613f31565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261430f5761430e613ce1565b5b8235905067ffffffffffffffff81111561432c5761432b6142ef565b5b602083019150836020820283011115614348576143476142f4565b5b9250929050565b60008083601f84011261436557614364613ce1565b5b8235905067ffffffffffffffff811115614382576143816142ef565b5b60208301915083602082028301111561439e5761439d6142f4565b5b9250929050565b600080600080604085870312156143bf576143be613c1c565b5b600085013567ffffffffffffffff8111156143dd576143dc613c21565b5b6143e9878288016142f9565b9450945050602085013567ffffffffffffffff81111561440c5761440b613c21565b5b6144188782880161434f565b925092505092959194509250565b6000806040838503121561443d5761443c613c1c565b5b600061444b85828601613fa5565b925050602061445c85828601614157565b9150509250929050565b600067ffffffffffffffff82111561448157614480613cfc565b5b61448a82613ceb565b9050602081019050919050565b60006144aa6144a584614466565b613d5c565b9050828152602081018484840111156144c6576144c5613ce6565b5b6144d1848285613da8565b509392505050565b600082601f8301126144ee576144ed613ce1565b5b81356144fe848260208601614497565b91505092915050565b6000806000806080858703121561452157614520613c1c565b5b600061452f87828801613fa5565b945050602061454087828801613fa5565b935050604061455187828801613f31565b925050606085013567ffffffffffffffff81111561457257614571613c21565b5b61457e878288016144d9565b91505092959194509250565b61459381614279565b82525050565b60006020820190506145ae600083018461458a565b92915050565b600080602083850312156145cb576145ca613c1c565b5b600083013567ffffffffffffffff8111156145e9576145e8613c21565b5b6145f58582860161434f565b92509250509250929050565b6000806040838503121561461857614617613c1c565b5b600061462685828601613fa5565b925050602061463785828601613fa5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614677602083613e7b565b915061468282614641565b602082019050919050565b600060208201905081810360008301526146a68161466a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146f457607f821691505b60208210811415614708576147076146ad565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061476a602c83613e7b565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147fc602183613e7b565b9150614807826147a0565b604082019050919050565b6000602082019050818103600083015261482b816147ef565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061488e603883613e7b565b915061489982614832565b604082019050919050565b600060208201905081810360008301526148bd81614881565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614920602683613e7b565b915061492b826148c4565b604082019050919050565b6000602082019050818103600083015261494f81614913565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061499082613bd0565b915061499b83613bd0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149d0576149cf614956565b5b828201905092915050565b60006149e682613bd0565b91506149f183613bd0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a2a57614a29614956565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a6f82613bd0565b9150614a7a83613bd0565b925082614a8a57614a89614a35565b5b828204905092915050565b6000614aa082613bd0565b9150614aab83613bd0565b925082821015614abe57614abd614956565b5b828203905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614b25602b83613e7b565b9150614b3082614ac9565b604082019050919050565b60006020820190508181036000830152614b5481614b18565b9050919050565b6000819050919050565b6000614b80614b7b614b7684613b8f565b614b5b565b613b8f565b9050919050565b6000614b9282614b65565b9050919050565b6000614ba482614b87565b9050919050565b614bb481614b99565b82525050565b6000604082019050614bcf6000830185614bab565b614bdc6020830184613bda565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614c1d82613bd0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c5057614c4f614956565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614cb7603183613e7b565b9150614cc282614c5b565b604082019050919050565b60006020820190508181036000830152614ce681614caa565b9050919050565b7f455243373231456e756d3a206f776e657220696f6f6200000000000000000000600082015250565b6000614d23601683613e7b565b9150614d2e82614ced565b602082019050919050565b60006020820190508181036000830152614d5281614d16565b9050919050565b600081905092915050565b50565b6000614d74600083614d59565b9150614d7f82614d64565b600082019050919050565b6000614d9582614d67565b9150819050919050565b7f455243373231456e756d3a20676c6f62616c20696f6f62000000000000000000600082015250565b6000614dd5601783613e7b565b9150614de082614d9f565b602082019050919050565b60006020820190508181036000830152614e0481614dc8565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614e67602983613e7b565b9150614e7282614e0b565b604082019050919050565b60006020820190508181036000830152614e9681614e5a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614ef9602a83613e7b565b9150614f0482614e9d565b604082019050919050565b60006020820190508181036000830152614f2881614eec565b9050919050565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b6000614f65601f83613e7b565b9150614f7082614f2f565b602082019050919050565b60006020820190508181036000830152614f9481614f58565b9050919050565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b6000614fd1600883613e7b565b9150614fdc82614f9b565b602082019050919050565b6000602082019050818103600083015261500081614fc4565b9050919050565b7f57686974656c697374206973206e6f7420616374697665000000000000000000600082015250565b600061503d601783613e7b565b915061504882615007565b602082019050919050565b6000602082019050818103600083015261506c81615030565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006150a9601883613e7b565b91506150b482615073565b602082019050919050565b600060208201905081810360008301526150d88161509c565b9050919050565b7f4d757374206d696e74206174206c65617374206f6e65204e46542e0000000000600082015250565b6000615115601b83613e7b565b9150615120826150df565b602082019050919050565b6000602082019050818103600083015261514481615108565b9050919050565b7f4d696e74206c6573730000000000000000000000000000000000000000000000600082015250565b6000615181600983613e7b565b915061518c8261514b565b602082019050919050565b600060208201905081810360008301526151b081615174565b9050919050565b7f4d4154494320696e7075742069732077726f6e67000000000000000000000000600082015250565b60006151ed601483613e7b565b91506151f8826151b7565b602082019050919050565b6000602082019050818103600083015261521c816151e0565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615259601983613e7b565b915061526482615223565b602082019050919050565b600060208201905081810360008301526152888161524c565b9050919050565b7f546f6b656e204944206f7574206f6620626f756e647321000000000000000000600082015250565b60006152c5601783613e7b565b91506152d08261528f565b602082019050919050565b600060208201905081810360008301526152f4816152b8565b9050919050565b600081905092915050565b600061531182613e70565b61531b81856152fb565b935061532b818560208601613e8c565b80840191505092915050565b60006153438285615306565b915061534f8284615306565b91508190509392505050565b60008190508160005260206000209050919050565b6000815461537d816146dc565b6153878186613e7b565b945060018216600081146153a257600181146153b4576153e7565b60ff19831686526020860193506153e7565b6153bd8561535b565b60005b838110156153df578154818901526001820191506020810190506153c0565b808801955050505b50505092915050565b6000602082019050818103600083015261540a8184615370565b905092915050565b60008151905061542181613f1a565b92915050565b60006020828403121561543d5761543c613c1c565b5b600061544b84828501615412565b91505092915050565b7f4e6f7420656e6f756768204c494e4b2100000000000000000000000000000000600082015250565b600061548a601083613e7b565b915061549582615454565b602082019050919050565b600060208201905081810360008301526154b98161547d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061551c602683613e7b565b9150615527826154c0565b604082019050919050565b6000602082019050818103600083015261554b8161550f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000615588601d83613e7b565b915061559382615552565b602082019050919050565b600060208201905081810360008301526155b78161557b565b9050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061561a603a83613e7b565b9150615625826155be565b604082019050919050565b600060208201905081810360008301526156498161560d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006156ac602c83613e7b565b91506156b782615650565b604082019050919050565b600060208201905081810360008301526156db8161569f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061573e602983613e7b565b9150615749826156e2565b604082019050919050565b6000602082019050818103600083015261576d81615731565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006157d0602483613e7b565b91506157db82615774565b604082019050919050565b600060208201905081810360008301526157ff816157c3565b9050919050565b600061581182613bd0565b915061581c83613bd0565b92508261582c5761582b614a35565b5b828206905092915050565b600060408201905061584c6000830185613bda565b615859602083018461458a565b9392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006158bc603283613e7b565b91506158c782615860565b604082019050919050565b600060208201905081810360008301526158eb816158af565b9050919050565b6000604082019050615907600083018561458a565b6159146020830184613bda565b9392505050565b600081519050919050565b600082825260208201905092915050565b60006159428261591b565b61594c8185615926565b935061595c818560208601613e8c565b61596581613ceb565b840191505092915050565b60006060820190506159856000830186613bc1565b6159926020830185613bda565b81810360408301526159a48184615937565b9050949350505050565b6000815190506159bd81614140565b92915050565b6000602082840312156159d9576159d8613c1c565b5b60006159e7848285016159ae565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a26602083613e7b565b9150615a31826159f0565b602082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a92601c83613e7b565b9150615a9d82615a5c565b602082019050919050565b60006020820190508181036000830152615ac181615a85565b9050919050565b6000608082019050615add6000830187613bc1565b615aea6020830186613bc1565b615af76040830185613bda565b8181036060830152615b098184615937565b905095945050505050565b600081519050615b2381613c52565b92915050565b600060208284031215615b3f57615b3e613c1c565b5b6000615b4d84828501615b14565b91505092915050565b6000608082019050615b6b600083018761458a565b615b786020830186613bda565b615b856040830185613bc1565b615b926060830184613bda565b95945050505050565b6000819050919050565b615bb6615bb182614279565b615b9b565b82525050565b6000819050919050565b615bd7615bd282613bd0565b615bbc565b82525050565b6000615be98285615ba5565b602082019150615bf98284615bc6565b602082019150819050939250505056fea2646970667358221220b93eba5bb9c2f0e803901101fd1196ff097e89a137be11ab2de89448c259d80064736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100f86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da000000000000000000000000000000000000000000000000000000000000001948616e7a6f20466f756e6465727320436f6c6c656374696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000548414e5a4f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f646f676972612e66696e616e63652f48616e7a6f46432f00
-----Decoded View---------------
Arg [0] : _name (string): Hanzo Founders Collection
Arg [1] : _symbol (string): HANZO
Arg [2] : _initBaseURI (string): https://dogira.finance/HanzoFC/
Arg [3] : _keyHash (bytes32): 0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : f86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [5] : 48616e7a6f20466f756e6465727320436f6c6c656374696f6e00000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 48414e5a4f000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [9] : 68747470733a2f2f646f676972612e66696e616e63652f48616e7a6f46432f00
Deployed Bytecode Sourcemap
584:5743:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2680:40:14;2696:12;:10;:12::i;:::-;2710:9;2680:40;;;;;;;:::i;:::-;;;;;;;;584:5743:6;;;;;191:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5719:100:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1638::3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2271:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1854:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1349:110:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3886:613:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4507:155;;;;;;;;;;;;;:::i;:::-;;1026:43:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;851:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2969:339:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;421:499:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1341:33:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2811:91:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5515:174:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6156:168;;;:::i;:::-;;5847:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3314:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1465:200:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1393:239:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;821:21:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5960:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;965:422:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1648:94:13;;;;;;;;;;;;;:::i;:::-;;1298:36:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1383:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;786:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;926:417:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3586:100:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;997:87:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9858:220:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1744:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4041:561:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3386:109:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;945:35:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2878:1131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2498:295:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6065:83:6;;;;;;;;;;;;;:::i;:::-;;3505:328:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4964:333:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3182:105:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2695:175:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;907:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2249:207;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4638:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2996:95:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2799:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1076:46:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1897:192:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5325:164:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;987:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;602:98:1;655:7;682:10;675:17;;602:98;:::o;191:224:4:-;293:4;332:35;317:50;;;:11;:50;;;;:90;;;;371:36;395:11;371:23;:36::i;:::-;317:90;310:97;;191:224;;;:::o;5719:100:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5800:11:6::1;5790:7;:21;;;;;;;;;;;;:::i;:::-;;5719:100:::0;:::o;1638::3:-;1692:13;1725:5;1718:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1638:100;:::o;2271:221::-;2347:7;2375:16;2383:7;2375;:16::i;:::-;2367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2460:15;:24;2476:7;2460:24;;;;;;;;;;;;;;;;;;;;;2453:31;;2271:221;;;:::o;1854:411::-;1935:13;1951:23;1966:7;1951:14;:23::i;:::-;1935:39;;1999:5;1993:11;;:2;:11;;;;1985:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2093:5;2077:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;2102:37;2119:5;2126:12;:10;:12::i;:::-;2102:16;:37::i;:::-;2077:62;2055:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;2236:21;2245:2;2249:7;2236:8;:21::i;:::-;1924:341;1854:411;;:::o;1349:110:4:-;1410:7;1437;:14;;;;1430:21;;1349:110;:::o;3886:613:14:-;3981:1;3962:7;:16;3970:7;3962:16;;;;;;;;;;;;;;;;:20;3954:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4038:21;4086:14;;4062:21;:38;;;;:::i;:::-;4038:62;;4111:15;4181:9;:18;4191:7;4181:18;;;;;;;;;;;;;;;;4166:12;;4146:7;:16;4154:7;4146:16;;;;;;;;;;;;;;;;4130:13;:32;;;;:::i;:::-;4129:49;;;;:::i;:::-;:70;;;;:::i;:::-;4111:88;;4231:1;4220:7;:12;;4212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4335:7;4314:9;:18;4324:7;4314:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;4293:9;:18;4303:7;4293:18;;;;;;;;;;;;;;;:49;;;;4387:7;4370:14;;:24;;;;:::i;:::-;4353:14;:41;;;;4407:35;4425:7;4434;4407:17;:35::i;:::-;4458:33;4474:7;4483;4458:33;;;;;;;:::i;:::-;;;;;;;;3943:556;;3886:613;:::o;4507:155::-;4560:9;4555:100;4579:7;:14;;;;4575:1;:18;4555:100;;;4615:28;4631:7;4639:1;4631:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4615:7;:28::i;:::-;4595:3;;;;;:::i;:::-;;;;4555:100;;;;4507:155::o;1026:43:6:-;;;;;;;;;;;;;;;;;;;;;;:::o;851:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2969:339:3:-;3164:41;3183:12;:10;:12::i;:::-;3197:7;3164:18;:41::i;:::-;3156:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;3272:28;3282:4;3288:2;3292:7;3272:9;:28::i;:::-;2969:339;;;:::o;421:499:4:-;510:15;554:23;571:5;554:16;:23::i;:::-;546:5;:31;538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;615:10;641:6;636:226;653:7;:14;;;;649:1;:18;636:226;;;702:7;710:1;702:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;693:19;;:5;:19;;;689:162;;;746:5;737;:14;733:102;;;782:1;775:8;;;;;;733:102;828:7;;;;:::i;:::-;;;689:162;669:3;;;;:::i;:::-;;;636:226;;;;880:5;872:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;527:393;421:499;;;;;:::o;1341:33:6:-;;;;:::o;2811:91:14:-;2855:7;2882:12;;2875:19;;2811:91;:::o;5515:174:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5620:14:6::1;5610:7;:24;;;;5664:17;5645:16;:36;;;;5515:174:::0;;:::o;6156:168::-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6213:12:6::1;6239:10;6231:24;;6263:21;6231:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6212:77;;;6308:7;6300:16;;;::::0;::::1;;6201:123;6156:168::o:0;5847:105::-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5935:9:6::1;5917:15;;:27;;;;;;;;;;;;;;;;;;5847:105:::0;:::o;3314:185:3:-;3452:39;3469:4;3475:2;3479:7;3452:39;;;;;;;;;;;;:16;:39::i;:::-;3314:185;;;:::o;1465:200:4:-;1540:7;1576:30;:28;:30::i;:::-;1568:5;:38;1560:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1652:5;1645:12;;1465:200;;;:::o;1393:239:3:-;1465:7;1485:13;1501:7;1509;1501:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1485:32;;1553:1;1536:19;;:5;:19;;;;1528:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1619:5;1612:12;;;1393:239;;;:::o;821:21:6:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5960:97::-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6041:8:6::1;6026:12;;:23;;;;;;;;;;;;;;;;;;5960:97:::0;:::o;965:422:3:-;1037:7;1082:1;1065:19;;:5;:19;;;;1057:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1142:10;1167:11;1181:7;:14;;;;1167:28;;1211:6;1206:127;1227:6;1223:1;:10;1206:127;;;1268:7;1276:1;1268:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1259:19;;:5;:19;;;1255:67;;;1299:7;;;;:::i;:::-;;;1255:67;1235:3;;;;:::i;:::-;;;1206:127;;;;1343:13;;;1374:5;1367:12;;;;965:422;;;:::o;1648:94:13:-;1228:12;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1713:21:::1;1731:1;1713:9;:21::i;:::-;1648:94::o:0;1298:36:6:-;;;;:::o;1383:27::-;;;;:::o;786:28::-;;;;:::o;926:417:4:-;985:16;1026:23;1043:5;1026:16;:23::i;:::-;1022:1;:27;1014:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1087:18;1108:16;1118:5;1108:9;:16::i;:::-;1087:37;;1135:25;1177:10;1163:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1135:53;;1204:9;1199:111;1223:10;1219:1;:14;1199:111;;;1269:29;1289:5;1296:1;1269:19;:29::i;:::-;1255:8;1264:1;1255:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;1235:3;;;;;:::i;:::-;;;;1199:111;;;;1327:8;1320:15;;;;926:417;;;:::o;3586:100:14:-;3637:7;3664;3672:5;3664:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3657:21;;3586:100;;;:::o;997:87:13:-;1043:7;1070:6;;;;;;;;;;;1063:13;;997:87;:::o;9858:220:17:-;9969:14;9955:28;;:10;:28;;;9947:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;10030:40;10048:9;10059:10;10030:17;:40::i;:::-;9858:220;;:::o;1744:104:3:-;1800:13;1833:7;1826:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:104;:::o;4041:561:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4161:9:6::1;;:16;;4145:5;;:12;;:32;4137:41;;;::::0;::::1;;4189:6;4210:9:::0;4222:13:::1;:11;:13::i;:::-;4210:25;;4250:6;4246:78;4266:5;;:12;;4262:1;:16;4246:78;;;4304:5;;4310:1;4304:8;;;;;;;:::i;:::-;;;;;;;;4299:13;;;;;:::i;:::-;;;4280:3;;;;:::i;:::-;;;4246:78;;;;4352:9;;4347:1;4343;:5;;;;:::i;:::-;:18;;4334:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;4386:8;;;4409:6;4405:171;4425:9;;:16;;4421:1;:20;4405:171;;;4466:6;4462:103;4482:5;;4488:1;4482:8;;;;;;;:::i;:::-;;;;;;;;4478:1;:12;4462:103;;;4515:34;4526:9;;4536:1;4526:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4540:3;;;;;:::i;:::-;;;4515:34;;;;;;;;;;;::::0;:9:::1;:34::i;:::-;4492:3;;;;:::i;:::-;;;4462:103;;;;4443:3;;;;:::i;:::-;;;4405:171;;;;4586:8;;;4126:476;;4041:561:::0;;;;:::o;3386:109:14:-;3442:7;3469:9;:18;3479:7;3469:18;;;;;;;;;;;;;;;;3462:25;;3386:109;;;:::o;945:35:6:-;;;;;;;;;;;;;:::o;2878:1131::-;2940:9;2952:13;:11;:13::i;:::-;2940:25;;2976:16;2995:7;;2976:26;;3013:14;3030:11;;3013:28;;3057:12;;;;;;;;;;;3052:334;;3097:16;;3086:27;;3137:14;;3128:23;;3166:7;3176:11;:23;3188:10;3176:23;;;;;;;;;;;;;;;;;;;;;;;;;3166:33;;3222:15;;;;;;;;;;;3214:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3286:2;3281:94;;3317:12;;;;;;;;;;;3309:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3281:94;3071:315;3052:334;3398:21;3422:11;:23;3434:10;3422:23;;;;;;;;;;;;;;;;3398:47;;3478:13;3467:8;:24;;;;:::i;:::-;3456:35;;3527:1;3512:12;:16;3504:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3596:8;3580:12;:24;;3572:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3658:9;;3642:12;3638:1;:16;;;;:::i;:::-;:29;;3629:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3722:12;3713:6;:21;;;;:::i;:::-;3700:9;:34;;3692:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3777:9;3772:102;3796:12;3792:1;:16;3772:102;;;3830:32;3840:10;3856:1;3852;:5;;;;:::i;:::-;3830:32;;;;;;;;;;;;:9;:32::i;:::-;3810:3;;;;:::i;:::-;;;3772:102;;;;3918:12;3902:13;:28;;;;:::i;:::-;3886:44;;3967:13;3941:11;:23;3953:10;3941:23;;;;;;;;;;;;;;;:39;;;;3993:8;;;2929:1080;;;;2878:1131;:::o;2498:295:3:-;2613:12;:10;:12::i;:::-;2601:24;;:8;:24;;;;2593:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2713:8;2668:18;:32;2687:12;:10;:12::i;:::-;2668:32;;;;;;;;;;;;;;;:42;2701:8;2668:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;2766:8;2737:48;;2752:12;:10;:12::i;:::-;2737:48;;;2776:8;2737:48;;;;;;:::i;:::-;;;;;;;;2498:295;;:::o;6065:83:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6120:20:6::1;:18;:20::i;:::-;6065:83::o:0;3505:328:3:-;3680:41;3699:12;:10;:12::i;:::-;3713:7;3680:18;:41::i;:::-;3672:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;3786:39;3800:4;3806:2;3810:7;3819:5;3786:13;:39::i;:::-;3505:328;;;;:::o;4964:333:6:-;5037:13;5082:9;;5071:7;:20;;5063:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5130:28;5161:10;:8;:10::i;:::-;5130:41;;5220:1;5195:14;5189:28;:32;:100;;;;;;;;;;;;;;;;;5248:14;5264:18;:7;:16;:18::i;:::-;5231:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5189:100;5182:107;;;4964:333;;;:::o;3182:105:14:-;3236:7;3263;:16;3271:7;3263:16;;;;;;;;;;;;;;;;3256:23;;3182:105;;;:::o;2695:175:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2799:8:6::1;2779:17;:28;;;;;;;;;;;;:::i;:::-;;2823:39;2844:17;2823:39;;;;;;:::i;:::-;;;;;;;;2695:175:::0;:::o;907:31::-;;;;:::o;2249:207::-;2304:17;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2375:3:6::1;;2342:4;:14;;;2365:4;2342:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;2334:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2417:31;2435:7;;2444:3;;2417:17;:31::i;:::-;2410:38;;2249:207:::0;:::o;4638:190::-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4723:9:6::1;4719:102;4738:10;;:17;;4734:1;:21;4719:102;;;4805:4;4776:11;:26;4788:10;;4799:1;4788:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4776:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;4757:3;;;;;:::i;:::-;;;;4719:102;;;;4638:190:::0;;:::o;2996:95:14:-;3042:7;3069:14;;3062:21;;2996:95;:::o;2799:164:3:-;2896:4;2920:18;:25;2939:5;2920:25;;;;;;;;;;;;;;;:35;2946:8;2920:35;;;;;;;;;;;;;;;;;;;;;;;;;2913:42;;2799:164;;;;:::o;1076:46:6:-;;;;;;;;;;;;;;;;;:::o;1897:192:13:-;1228:12;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2006:1:::1;1986:22;;:8;:22;;;;1978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2062:19;2072:8;2062:9;:19::i;:::-;1897:192:::0;:::o;5325:164:6:-;1228:12:13;:10;:12::i;:::-;1217:23;;:7;:5;:7::i;:::-;:23;;;1209:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5426:12:6::1;5418:5;:20;;;;5466:15;5449:14;:32;;;;5325:164:::0;;:::o;987:32::-;;;;;;;;;;;;;:::o;674:285:3:-;776:4;824:25;809:40;;;:11;:40;;;;:97;;;;873:33;858:48;;;:11;:48;;;;809:97;:142;;;;915:36;939:11;915:23;:36::i;:::-;809:142;793:158;;674:285;;;:::o;4160:155::-;4225:4;4259:7;:14;;;;4249:7;:24;:58;;;;;4305:1;4277:30;;:7;4285;4277:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:30;;;;4249:58;4242:65;;4160:155;;;:::o;6330:174::-;6432:2;6405:15;:24;6421:7;6405:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;6488:7;6484:2;6450:46;;6459:23;6474:7;6459:14;:23::i;:::-;6450:46;;;;;;;;;;;;6330:174;;:::o;2065:317:0:-;2180:6;2155:21;:31;;2147:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2234:12;2252:9;:14;;2274:6;2252:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2233:52;;;2304:7;2296:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2136:246;2065:317;;:::o;4321:348:3:-;4414:4;4439:16;4447:7;4439;:16::i;:::-;4431:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4515:13;4531:23;4546:7;4531:14;:23::i;:::-;4515:39;;4584:5;4573:16;;:7;:16;;;:51;;;;4617:7;4593:31;;:20;4605:7;4593:11;:20::i;:::-;:31;;;4573:51;:87;;;;4628:32;4645:5;4652:7;4628:16;:32::i;:::-;4573:87;4565:96;;;4321:348;;;;:::o;5808:516::-;5967:4;5940:31;;:23;5955:7;5940:14;:23::i;:::-;:31;;;5932:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6050:1;6036:16;;:2;:16;;;;6028:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;6106:39;6127:4;6133:2;6137:7;6106:20;:39::i;:::-;6210:29;6227:1;6231:7;6210:8;:29::i;:::-;6269:2;6250:7;6258;6250:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;6308:7;6304:2;6289:27;;6298:4;6289:27;;;;;;;;;;;;5808:516;;;:::o;2097:173:13:-;2153:16;2172:6;;;;;;;;;;;2153:25;;2198:8;2189:6;;:17;;;;;;;;;;;;;;;;;;2253:8;2222:40;;2243:8;2222:40;;;;;;;;;;;;2142:128;2097:173;:::o;2464:223:6:-;2559:9;2571:13;:11;:13::i;:::-;2559:25;;2624:1;2611:10;:14;;;;:::i;:::-;2595:13;:30;;;;2641:38;2654:13;;2669:9;2641:38;;;;;;;:::i;:::-;;;;;;;;2548:139;2464:223;;:::o;4791:321:3:-;4921:18;4927:2;4931:7;4921:5;:18::i;:::-;4972:54;5003:1;5007:2;5011:7;5020:5;4972:22;:54::i;:::-;4950:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;4791:321;;;:::o;3839:315::-;3996:28;4006:4;4012:2;4016:7;3996:9;:28::i;:::-;4043:48;4066:4;4072:2;4076:7;4085:5;4043:22;:48::i;:::-;4035:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;3839:315;;;;:::o;4857:99:6:-;4908:13;4941:7;4934:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4857:99;:::o;288:723:16:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;7885:1088:17:-;7962:17;7992:4;:20;;;8013:14;8029:4;8046:8;6709:1;8035:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7992:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8330:15;8348:82;8365:8;6709:1;8406:4;8413:6;:16;8420:8;8413:16;;;;;;;;;;;;8348;:82::i;:::-;8330:100;;8914:1;8895:6;:16;8902:8;8895:16;;;;;;;;;;;;:20;;;;:::i;:::-;8876:6;:16;8883:8;8876:16;;;;;;;;;;;:39;;;;8933:32;8947:8;8957:7;8933:13;:32::i;:::-;8926:39;;;7885:1088;;;;:::o;785:157:2:-;870:4;909:25;894:40;;;:11;:40;;;;887:47;;785:157;;;:::o;7315:126:3:-;;;;:::o;5118:346::-;5212:1;5198:16;;:2;:16;;;;5190:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;5271:16;5279:7;5271;:16::i;:::-;5270:17;5262:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;5333:45;5362:1;5366:2;5370:7;5333:20;:45::i;:::-;5389:7;5402:2;5389:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:7;5444:2;5423:33;;5440:1;5423:33;;;;;;;;;;;;5118:346;;:::o;6510:799::-;6665:4;6686:15;:2;:13;;;:15::i;:::-;6682:620;;;6738:2;6722:36;;;6759:12;:10;:12::i;:::-;6773:4;6779:7;6788:5;6722:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6718:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6981:1;6964:6;:13;:18;6960:272;;;7007:60;;;;;;;;;;:::i;:::-;;;;;;;;6960:272;7182:6;7176:13;7167:6;7163:2;7159:15;7152:38;6718:529;6855:41;;;6845:51;;;:6;:51;;;;6838:58;;;;;6682:620;7286:4;7279:11;;6510:799;;;;;;;:::o;820:271:18:-;985:7;1041:8;1051:9;1062:10;1074:6;1030:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1020:62;;;;;;1012:71;;1005:78;;820:271;;;;;;:::o;1488:174::-;1575:7;1629:8;1639:13;1612:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1602:52;;;;;;1595:59;;1488:174;;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:19:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:117::-;2530:1;2527;2520:12;2544:117;2653:1;2650;2643:12;2667:102;2708:6;2759:2;2755:7;2750:2;2743:5;2739:14;2735:28;2725:38;;2667:102;;;:::o;2775:180::-;2823:77;2820:1;2813:88;2920:4;2917:1;2910:15;2944:4;2941:1;2934:15;2961:281;3044:27;3066:4;3044:27;:::i;:::-;3036:6;3032:40;3174:6;3162:10;3159:22;3138:18;3126:10;3123:34;3120:62;3117:88;;;3185:18;;:::i;:::-;3117:88;3225:10;3221:2;3214:22;3004:238;2961:281;;:::o;3248:129::-;3282:6;3309:20;;:::i;:::-;3299:30;;3338:33;3366:4;3358:6;3338:33;:::i;:::-;3248:129;;;:::o;3383:308::-;3445:4;3535:18;3527:6;3524:30;3521:56;;;3557:18;;:::i;:::-;3521:56;3595:29;3617:6;3595:29;:::i;:::-;3587:37;;3679:4;3673;3669:15;3661:23;;3383:308;;;:::o;3697:154::-;3781:6;3776:3;3771;3758:30;3843:1;3834:6;3829:3;3825:16;3818:27;3697:154;;;:::o;3857:412::-;3935:5;3960:66;3976:49;4018:6;3976:49;:::i;:::-;3960:66;:::i;:::-;3951:75;;4049:6;4042:5;4035:21;4087:4;4080:5;4076:16;4125:3;4116:6;4111:3;4107:16;4104:25;4101:112;;;4132:79;;:::i;:::-;4101:112;4222:41;4256:6;4251:3;4246;4222:41;:::i;:::-;3941:328;3857:412;;;;;:::o;4289:340::-;4345:5;4394:3;4387:4;4379:6;4375:17;4371:27;4361:122;;4402:79;;:::i;:::-;4361:122;4519:6;4506:20;4544:79;4619:3;4611:6;4604:4;4596:6;4592:17;4544:79;:::i;:::-;4535:88;;4351:278;4289:340;;;;:::o;4635:509::-;4704:6;4753:2;4741:9;4732:7;4728:23;4724:32;4721:119;;;4759:79;;:::i;:::-;4721:119;4907:1;4896:9;4892:17;4879:31;4937:18;4929:6;4926:30;4923:117;;;4959:79;;:::i;:::-;4923:117;5064:63;5119:7;5110:6;5099:9;5095:22;5064:63;:::i;:::-;5054:73;;4850:287;4635:509;;;;:::o;5150:99::-;5202:6;5236:5;5230:12;5220:22;;5150:99;;;:::o;5255:169::-;5339:11;5373:6;5368:3;5361:19;5413:4;5408:3;5404:14;5389:29;;5255:169;;;;:::o;5430:307::-;5498:1;5508:113;5522:6;5519:1;5516:13;5508:113;;;5607:1;5602:3;5598:11;5592:18;5588:1;5583:3;5579:11;5572:39;5544:2;5541:1;5537:10;5532:15;;5508:113;;;5639:6;5636:1;5633:13;5630:101;;;5719:1;5710:6;5705:3;5701:16;5694:27;5630:101;5479:258;5430:307;;;:::o;5743:364::-;5831:3;5859:39;5892:5;5859:39;:::i;:::-;5914:71;5978:6;5973:3;5914:71;:::i;:::-;5907:78;;5994:52;6039:6;6034:3;6027:4;6020:5;6016:16;5994:52;:::i;:::-;6071:29;6093:6;6071:29;:::i;:::-;6066:3;6062:39;6055:46;;5835:272;5743:364;;;;:::o;6113:313::-;6226:4;6264:2;6253:9;6249:18;6241:26;;6313:9;6307:4;6303:20;6299:1;6288:9;6284:17;6277:47;6341:78;6414:4;6405:6;6341:78;:::i;:::-;6333:86;;6113:313;;;;:::o;6432:122::-;6505:24;6523:5;6505:24;:::i;:::-;6498:5;6495:35;6485:63;;6544:1;6541;6534:12;6485:63;6432:122;:::o;6560:139::-;6606:5;6644:6;6631:20;6622:29;;6660:33;6687:5;6660:33;:::i;:::-;6560:139;;;;:::o;6705:329::-;6764:6;6813:2;6801:9;6792:7;6788:23;6784:32;6781:119;;;6819:79;;:::i;:::-;6781:119;6939:1;6964:53;7009:7;7000:6;6989:9;6985:22;6964:53;:::i;:::-;6954:63;;6910:117;6705:329;;;;:::o;7040:222::-;7133:4;7171:2;7160:9;7156:18;7148:26;;7184:71;7252:1;7241:9;7237:17;7228:6;7184:71;:::i;:::-;7040:222;;;;:::o;7268:122::-;7341:24;7359:5;7341:24;:::i;:::-;7334:5;7331:35;7321:63;;7380:1;7377;7370:12;7321:63;7268:122;:::o;7396:139::-;7442:5;7480:6;7467:20;7458:29;;7496:33;7523:5;7496:33;:::i;:::-;7396:139;;;;:::o;7541:474::-;7609:6;7617;7666:2;7654:9;7645:7;7641:23;7637:32;7634:119;;;7672:79;;:::i;:::-;7634:119;7792:1;7817:53;7862:7;7853:6;7842:9;7838:22;7817:53;:::i;:::-;7807:63;;7763:117;7919:2;7945:53;7990:7;7981:6;7970:9;7966:22;7945:53;:::i;:::-;7935:63;;7890:118;7541:474;;;;;:::o;8021:222::-;8114:4;8152:2;8141:9;8137:18;8129:26;;8165:71;8233:1;8222:9;8218:17;8209:6;8165:71;:::i;:::-;8021:222;;;;:::o;8249:104::-;8294:7;8323:24;8341:5;8323:24;:::i;:::-;8312:35;;8249:104;;;:::o;8359:138::-;8440:32;8466:5;8440:32;:::i;:::-;8433:5;8430:43;8420:71;;8487:1;8484;8477:12;8420:71;8359:138;:::o;8503:155::-;8557:5;8595:6;8582:20;8573:29;;8611:41;8646:5;8611:41;:::i;:::-;8503:155;;;;:::o;8664:345::-;8731:6;8780:2;8768:9;8759:7;8755:23;8751:32;8748:119;;;8786:79;;:::i;:::-;8748:119;8906:1;8931:61;8984:7;8975:6;8964:9;8960:22;8931:61;:::i;:::-;8921:71;;8877:125;8664:345;;;;:::o;9015:329::-;9074:6;9123:2;9111:9;9102:7;9098:23;9094:32;9091:119;;;9129:79;;:::i;:::-;9091:119;9249:1;9274:53;9319:7;9310:6;9299:9;9295:22;9274:53;:::i;:::-;9264:63;;9220:117;9015:329;;;;:::o;9350:619::-;9427:6;9435;9443;9492:2;9480:9;9471:7;9467:23;9463:32;9460:119;;;9498:79;;:::i;:::-;9460:119;9618:1;9643:53;9688:7;9679:6;9668:9;9664:22;9643:53;:::i;:::-;9633:63;;9589:117;9745:2;9771:53;9816:7;9807:6;9796:9;9792:22;9771:53;:::i;:::-;9761:63;;9716:118;9873:2;9899:53;9944:7;9935:6;9924:9;9920:22;9899:53;:::i;:::-;9889:63;;9844:118;9350:619;;;;;:::o;9975:474::-;10043:6;10051;10100:2;10088:9;10079:7;10075:23;10071:32;10068:119;;;10106:79;;:::i;:::-;10068:119;10226:1;10251:53;10296:7;10287:6;10276:9;10272:22;10251:53;:::i;:::-;10241:63;;10197:117;10353:2;10379:53;10424:7;10415:6;10404:9;10400:22;10379:53;:::i;:::-;10369:63;;10324:118;9975:474;;;;;:::o;10455:116::-;10525:21;10540:5;10525:21;:::i;:::-;10518:5;10515:32;10505:60;;10561:1;10558;10551:12;10505:60;10455:116;:::o;10577:133::-;10620:5;10658:6;10645:20;10636:29;;10674:30;10698:5;10674:30;:::i;:::-;10577:133;;;;:::o;10716:323::-;10772:6;10821:2;10809:9;10800:7;10796:23;10792:32;10789:119;;;10827:79;;:::i;:::-;10789:119;10947:1;10972:50;11014:7;11005:6;10994:9;10990:22;10972:50;:::i;:::-;10962:60;;10918:114;10716:323;;;;:::o;11045:114::-;11112:6;11146:5;11140:12;11130:22;;11045:114;;;:::o;11165:184::-;11264:11;11298:6;11293:3;11286:19;11338:4;11333:3;11329:14;11314:29;;11165:184;;;;:::o;11355:132::-;11422:4;11445:3;11437:11;;11475:4;11470:3;11466:14;11458:22;;11355:132;;;:::o;11493:108::-;11570:24;11588:5;11570:24;:::i;:::-;11565:3;11558:37;11493:108;;:::o;11607:179::-;11676:10;11697:46;11739:3;11731:6;11697:46;:::i;:::-;11775:4;11770:3;11766:14;11752:28;;11607:179;;;;:::o;11792:113::-;11862:4;11894;11889:3;11885:14;11877:22;;11792:113;;;:::o;11941:732::-;12060:3;12089:54;12137:5;12089:54;:::i;:::-;12159:86;12238:6;12233:3;12159:86;:::i;:::-;12152:93;;12269:56;12319:5;12269:56;:::i;:::-;12348:7;12379:1;12364:284;12389:6;12386:1;12383:13;12364:284;;;12465:6;12459:13;12492:63;12551:3;12536:13;12492:63;:::i;:::-;12485:70;;12578:60;12631:6;12578:60;:::i;:::-;12568:70;;12424:224;12411:1;12408;12404:9;12399:14;;12364:284;;;12368:14;12664:3;12657:10;;12065:608;;;11941:732;;;;:::o;12679:373::-;12822:4;12860:2;12849:9;12845:18;12837:26;;12909:9;12903:4;12899:20;12895:1;12884:9;12880:17;12873:47;12937:108;13040:4;13031:6;12937:108;:::i;:::-;12929:116;;12679:373;;;;:::o;13058:77::-;13095:7;13124:5;13113:16;;13058:77;;;:::o;13141:122::-;13214:24;13232:5;13214:24;:::i;:::-;13207:5;13204:35;13194:63;;13253:1;13250;13243:12;13194:63;13141:122;:::o;13269:139::-;13315:5;13353:6;13340:20;13331:29;;13369:33;13396:5;13369:33;:::i;:::-;13269:139;;;;:::o;13414:474::-;13482:6;13490;13539:2;13527:9;13518:7;13514:23;13510:32;13507:119;;;13545:79;;:::i;:::-;13507:119;13665:1;13690:53;13735:7;13726:6;13715:9;13711:22;13690:53;:::i;:::-;13680:63;;13636:117;13792:2;13818:53;13863:7;13854:6;13843:9;13839:22;13818:53;:::i;:::-;13808:63;;13763:118;13414:474;;;;;:::o;13894:117::-;14003:1;14000;13993:12;14017:117;14126:1;14123;14116:12;14157:568;14230:8;14240:6;14290:3;14283:4;14275:6;14271:17;14267:27;14257:122;;14298:79;;:::i;:::-;14257:122;14411:6;14398:20;14388:30;;14441:18;14433:6;14430:30;14427:117;;;14463:79;;:::i;:::-;14427:117;14577:4;14569:6;14565:17;14553:29;;14631:3;14623:4;14615:6;14611:17;14601:8;14597:32;14594:41;14591:128;;;14638:79;;:::i;:::-;14591:128;14157:568;;;;;:::o;14748:::-;14821:8;14831:6;14881:3;14874:4;14866:6;14862:17;14858:27;14848:122;;14889:79;;:::i;:::-;14848:122;15002:6;14989:20;14979:30;;15032:18;15024:6;15021:30;15018:117;;;15054:79;;:::i;:::-;15018:117;15168:4;15160:6;15156:17;15144:29;;15222:3;15214:4;15206:6;15202:17;15192:8;15188:32;15185:41;15182:128;;;15229:79;;:::i;:::-;15182:128;14748:568;;;;;:::o;15322:934::-;15444:6;15452;15460;15468;15517:2;15505:9;15496:7;15492:23;15488:32;15485:119;;;15523:79;;:::i;:::-;15485:119;15671:1;15660:9;15656:17;15643:31;15701:18;15693:6;15690:30;15687:117;;;15723:79;;:::i;:::-;15687:117;15836:80;15908:7;15899:6;15888:9;15884:22;15836:80;:::i;:::-;15818:98;;;;15614:312;15993:2;15982:9;15978:18;15965:32;16024:18;16016:6;16013:30;16010:117;;;16046:79;;:::i;:::-;16010:117;16159:80;16231:7;16222:6;16211:9;16207:22;16159:80;:::i;:::-;16141:98;;;;15936:313;15322:934;;;;;;;:::o;16262:468::-;16327:6;16335;16384:2;16372:9;16363:7;16359:23;16355:32;16352:119;;;16390:79;;:::i;:::-;16352:119;16510:1;16535:53;16580:7;16571:6;16560:9;16556:22;16535:53;:::i;:::-;16525:63;;16481:117;16637:2;16663:50;16705:7;16696:6;16685:9;16681:22;16663:50;:::i;:::-;16653:60;;16608:115;16262:468;;;;;:::o;16736:307::-;16797:4;16887:18;16879:6;16876:30;16873:56;;;16909:18;;:::i;:::-;16873:56;16947:29;16969:6;16947:29;:::i;:::-;16939:37;;17031:4;17025;17021:15;17013:23;;16736:307;;;:::o;17049:410::-;17126:5;17151:65;17167:48;17208:6;17167:48;:::i;:::-;17151:65;:::i;:::-;17142:74;;17239:6;17232:5;17225:21;17277:4;17270:5;17266:16;17315:3;17306:6;17301:3;17297:16;17294:25;17291:112;;;17322:79;;:::i;:::-;17291:112;17412:41;17446:6;17441:3;17436;17412:41;:::i;:::-;17132:327;17049:410;;;;;:::o;17478:338::-;17533:5;17582:3;17575:4;17567:6;17563:17;17559:27;17549:122;;17590:79;;:::i;:::-;17549:122;17707:6;17694:20;17732:78;17806:3;17798:6;17791:4;17783:6;17779:17;17732:78;:::i;:::-;17723:87;;17539:277;17478:338;;;;:::o;17822:943::-;17917:6;17925;17933;17941;17990:3;17978:9;17969:7;17965:23;17961:33;17958:120;;;17997:79;;:::i;:::-;17958:120;18117:1;18142:53;18187:7;18178:6;18167:9;18163:22;18142:53;:::i;:::-;18132:63;;18088:117;18244:2;18270:53;18315:7;18306:6;18295:9;18291:22;18270:53;:::i;:::-;18260:63;;18215:118;18372:2;18398:53;18443:7;18434:6;18423:9;18419:22;18398:53;:::i;:::-;18388:63;;18343:118;18528:2;18517:9;18513:18;18500:32;18559:18;18551:6;18548:30;18545:117;;;18581:79;;:::i;:::-;18545:117;18686:62;18740:7;18731:6;18720:9;18716:22;18686:62;:::i;:::-;18676:72;;18471:287;17822:943;;;;;;;:::o;18771:118::-;18858:24;18876:5;18858:24;:::i;:::-;18853:3;18846:37;18771:118;;:::o;18895:222::-;18988:4;19026:2;19015:9;19011:18;19003:26;;19039:71;19107:1;19096:9;19092:17;19083:6;19039:71;:::i;:::-;18895:222;;;;:::o;19123:559::-;19209:6;19217;19266:2;19254:9;19245:7;19241:23;19237:32;19234:119;;;19272:79;;:::i;:::-;19234:119;19420:1;19409:9;19405:17;19392:31;19450:18;19442:6;19439:30;19436:117;;;19472:79;;:::i;:::-;19436:117;19585:80;19657:7;19648:6;19637:9;19633:22;19585:80;:::i;:::-;19567:98;;;;19363:312;19123:559;;;;;:::o;19688:474::-;19756:6;19764;19813:2;19801:9;19792:7;19788:23;19784:32;19781:119;;;19819:79;;:::i;:::-;19781:119;19939:1;19964:53;20009:7;20000:6;19989:9;19985:22;19964:53;:::i;:::-;19954:63;;19910:117;20066:2;20092:53;20137:7;20128:6;20117:9;20113:22;20092:53;:::i;:::-;20082:63;;20037:118;19688:474;;;;;:::o;20168:182::-;20308:34;20304:1;20296:6;20292:14;20285:58;20168:182;:::o;20356:366::-;20498:3;20519:67;20583:2;20578:3;20519:67;:::i;:::-;20512:74;;20595:93;20684:3;20595:93;:::i;:::-;20713:2;20708:3;20704:12;20697:19;;20356:366;;;:::o;20728:419::-;20894:4;20932:2;20921:9;20917:18;20909:26;;20981:9;20975:4;20971:20;20967:1;20956:9;20952:17;20945:47;21009:131;21135:4;21009:131;:::i;:::-;21001:139;;20728:419;;;:::o;21153:180::-;21201:77;21198:1;21191:88;21298:4;21295:1;21288:15;21322:4;21319:1;21312:15;21339:320;21383:6;21420:1;21414:4;21410:12;21400:22;;21467:1;21461:4;21457:12;21488:18;21478:81;;21544:4;21536:6;21532:17;21522:27;;21478:81;21606:2;21598:6;21595:14;21575:18;21572:38;21569:84;;;21625:18;;:::i;:::-;21569:84;21390:269;21339:320;;;:::o;21665:231::-;21805:34;21801:1;21793:6;21789:14;21782:58;21874:14;21869:2;21861:6;21857:15;21850:39;21665:231;:::o;21902:366::-;22044:3;22065:67;22129:2;22124:3;22065:67;:::i;:::-;22058:74;;22141:93;22230:3;22141:93;:::i;:::-;22259:2;22254:3;22250:12;22243:19;;21902:366;;;:::o;22274:419::-;22440:4;22478:2;22467:9;22463:18;22455:26;;22527:9;22521:4;22517:20;22513:1;22502:9;22498:17;22491:47;22555:131;22681:4;22555:131;:::i;:::-;22547:139;;22274:419;;;:::o;22699:220::-;22839:34;22835:1;22827:6;22823:14;22816:58;22908:3;22903:2;22895:6;22891:15;22884:28;22699:220;:::o;22925:366::-;23067:3;23088:67;23152:2;23147:3;23088:67;:::i;:::-;23081:74;;23164:93;23253:3;23164:93;:::i;:::-;23282:2;23277:3;23273:12;23266:19;;22925:366;;;:::o;23297:419::-;23463:4;23501:2;23490:9;23486:18;23478:26;;23550:9;23544:4;23540:20;23536:1;23525:9;23521:17;23514:47;23578:131;23704:4;23578:131;:::i;:::-;23570:139;;23297:419;;;:::o;23722:243::-;23862:34;23858:1;23850:6;23846:14;23839:58;23931:26;23926:2;23918:6;23914:15;23907:51;23722:243;:::o;23971:366::-;24113:3;24134:67;24198:2;24193:3;24134:67;:::i;:::-;24127:74;;24210:93;24299:3;24210:93;:::i;:::-;24328:2;24323:3;24319:12;24312:19;;23971:366;;;:::o;24343:419::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24343:419;;;:::o;24768:225::-;24908:34;24904:1;24896:6;24892:14;24885:58;24977:8;24972:2;24964:6;24960:15;24953:33;24768:225;:::o;24999:366::-;25141:3;25162:67;25226:2;25221:3;25162:67;:::i;:::-;25155:74;;25238:93;25327:3;25238:93;:::i;:::-;25356:2;25351:3;25347:12;25340:19;;24999:366;;;:::o;25371:419::-;25537:4;25575:2;25564:9;25560:18;25552:26;;25624:9;25618:4;25614:20;25610:1;25599:9;25595:17;25588:47;25652:131;25778:4;25652:131;:::i;:::-;25644:139;;25371:419;;;:::o;25796:180::-;25844:77;25841:1;25834:88;25941:4;25938:1;25931:15;25965:4;25962:1;25955:15;25982:305;26022:3;26041:20;26059:1;26041:20;:::i;:::-;26036:25;;26075:20;26093:1;26075:20;:::i;:::-;26070:25;;26229:1;26161:66;26157:74;26154:1;26151:81;26148:107;;;26235:18;;:::i;:::-;26148:107;26279:1;26276;26272:9;26265:16;;25982:305;;;;:::o;26293:348::-;26333:7;26356:20;26374:1;26356:20;:::i;:::-;26351:25;;26390:20;26408:1;26390:20;:::i;:::-;26385:25;;26578:1;26510:66;26506:74;26503:1;26500:81;26495:1;26488:9;26481:17;26477:105;26474:131;;;26585:18;;:::i;:::-;26474:131;26633:1;26630;26626:9;26615:20;;26293:348;;;;:::o;26647:180::-;26695:77;26692:1;26685:88;26792:4;26789:1;26782:15;26816:4;26813:1;26806:15;26833:185;26873:1;26890:20;26908:1;26890:20;:::i;:::-;26885:25;;26924:20;26942:1;26924:20;:::i;:::-;26919:25;;26963:1;26953:35;;26968:18;;:::i;:::-;26953:35;27010:1;27007;27003:9;26998:14;;26833:185;;;;:::o;27024:191::-;27064:4;27084:20;27102:1;27084:20;:::i;:::-;27079:25;;27118:20;27136:1;27118:20;:::i;:::-;27113:25;;27157:1;27154;27151:8;27148:34;;;27162:18;;:::i;:::-;27148:34;27207:1;27204;27200:9;27192:17;;27024:191;;;;:::o;27221:230::-;27361:34;27357:1;27349:6;27345:14;27338:58;27430:13;27425:2;27417:6;27413:15;27406:38;27221:230;:::o;27457:366::-;27599:3;27620:67;27684:2;27679:3;27620:67;:::i;:::-;27613:74;;27696:93;27785:3;27696:93;:::i;:::-;27814:2;27809:3;27805:12;27798:19;;27457:366;;;:::o;27829:419::-;27995:4;28033:2;28022:9;28018:18;28010:26;;28082:9;28076:4;28072:20;28068:1;28057:9;28053:17;28046:47;28110:131;28236:4;28110:131;:::i;:::-;28102:139;;27829:419;;;:::o;28254:60::-;28282:3;28303:5;28296:12;;28254:60;;;:::o;28320:142::-;28370:9;28403:53;28421:34;28430:24;28448:5;28430:24;:::i;:::-;28421:34;:::i;:::-;28403:53;:::i;:::-;28390:66;;28320:142;;;:::o;28468:126::-;28518:9;28551:37;28582:5;28551:37;:::i;:::-;28538:50;;28468:126;;;:::o;28600:134::-;28658:9;28691:37;28722:5;28691:37;:::i;:::-;28678:50;;28600:134;;;:::o;28740:147::-;28835:45;28874:5;28835:45;:::i;:::-;28830:3;28823:58;28740:147;;:::o;28893:348::-;29022:4;29060:2;29049:9;29045:18;29037:26;;29073:79;29149:1;29138:9;29134:17;29125:6;29073:79;:::i;:::-;29162:72;29230:2;29219:9;29215:18;29206:6;29162:72;:::i;:::-;28893:348;;;;;:::o;29247:180::-;29295:77;29292:1;29285:88;29392:4;29389:1;29382:15;29416:4;29413:1;29406:15;29433:233;29472:3;29495:24;29513:5;29495:24;:::i;:::-;29486:33;;29541:66;29534:5;29531:77;29528:103;;;29611:18;;:::i;:::-;29528:103;29658:1;29651:5;29647:13;29640:20;;29433:233;;;:::o;29672:236::-;29812:34;29808:1;29800:6;29796:14;29789:58;29881:19;29876:2;29868:6;29864:15;29857:44;29672:236;:::o;29914:366::-;30056:3;30077:67;30141:2;30136:3;30077:67;:::i;:::-;30070:74;;30153:93;30242:3;30153:93;:::i;:::-;30271:2;30266:3;30262:12;30255:19;;29914:366;;;:::o;30286:419::-;30452:4;30490:2;30479:9;30475:18;30467:26;;30539:9;30533:4;30529:20;30525:1;30514:9;30510:17;30503:47;30567:131;30693:4;30567:131;:::i;:::-;30559:139;;30286:419;;;:::o;30711:172::-;30851:24;30847:1;30839:6;30835:14;30828:48;30711:172;:::o;30889:366::-;31031:3;31052:67;31116:2;31111:3;31052:67;:::i;:::-;31045:74;;31128:93;31217:3;31128:93;:::i;:::-;31246:2;31241:3;31237:12;31230:19;;30889:366;;;:::o;31261:419::-;31427:4;31465:2;31454:9;31450:18;31442:26;;31514:9;31508:4;31504:20;31500:1;31489:9;31485:17;31478:47;31542:131;31668:4;31542:131;:::i;:::-;31534:139;;31261:419;;;:::o;31686:147::-;31787:11;31824:3;31809:18;;31686:147;;;;:::o;31839:114::-;;:::o;31959:398::-;32118:3;32139:83;32220:1;32215:3;32139:83;:::i;:::-;32132:90;;32231:93;32320:3;32231:93;:::i;:::-;32349:1;32344:3;32340:11;32333:18;;31959:398;;;:::o;32363:379::-;32547:3;32569:147;32712:3;32569:147;:::i;:::-;32562:154;;32733:3;32726:10;;32363:379;;;:::o;32748:173::-;32888:25;32884:1;32876:6;32872:14;32865:49;32748:173;:::o;32927:366::-;33069:3;33090:67;33154:2;33149:3;33090:67;:::i;:::-;33083:74;;33166:93;33255:3;33166:93;:::i;:::-;33284:2;33279:3;33275:12;33268:19;;32927:366;;;:::o;33299:419::-;33465:4;33503:2;33492:9;33488:18;33480:26;;33552:9;33546:4;33542:20;33538:1;33527:9;33523:17;33516:47;33580:131;33706:4;33580:131;:::i;:::-;33572:139;;33299:419;;;:::o;33724:228::-;33864:34;33860:1;33852:6;33848:14;33841:58;33933:11;33928:2;33920:6;33916:15;33909:36;33724:228;:::o;33958:366::-;34100:3;34121:67;34185:2;34180:3;34121:67;:::i;:::-;34114:74;;34197:93;34286:3;34197:93;:::i;:::-;34315:2;34310:3;34306:12;34299:19;;33958:366;;;:::o;34330:419::-;34496:4;34534:2;34523:9;34519:18;34511:26;;34583:9;34577:4;34573:20;34569:1;34558:9;34554:17;34547:47;34611:131;34737:4;34611:131;:::i;:::-;34603:139;;34330:419;;;:::o;34755:229::-;34895:34;34891:1;34883:6;34879:14;34872:58;34964:12;34959:2;34951:6;34947:15;34940:37;34755:229;:::o;34990:366::-;35132:3;35153:67;35217:2;35212:3;35153:67;:::i;:::-;35146:74;;35229:93;35318:3;35229:93;:::i;:::-;35347:2;35342:3;35338:12;35331:19;;34990:366;;;:::o;35362:419::-;35528:4;35566:2;35555:9;35551:18;35543:26;;35615:9;35609:4;35605:20;35601:1;35590:9;35586:17;35579:47;35643:131;35769:4;35643:131;:::i;:::-;35635:139;;35362:419;;;:::o;35787:181::-;35927:33;35923:1;35915:6;35911:14;35904:57;35787:181;:::o;35974:366::-;36116:3;36137:67;36201:2;36196:3;36137:67;:::i;:::-;36130:74;;36213:93;36302:3;36213:93;:::i;:::-;36331:2;36326:3;36322:12;36315:19;;35974:366;;;:::o;36346:419::-;36512:4;36550:2;36539:9;36535:18;36527:26;;36599:9;36593:4;36589:20;36585:1;36574:9;36570:17;36563:47;36627:131;36753:4;36627:131;:::i;:::-;36619:139;;36346:419;;;:::o;36771:158::-;36911:10;36907:1;36899:6;36895:14;36888:34;36771:158;:::o;36935:365::-;37077:3;37098:66;37162:1;37157:3;37098:66;:::i;:::-;37091:73;;37173:93;37262:3;37173:93;:::i;:::-;37291:2;37286:3;37282:12;37275:19;;36935:365;;;:::o;37306:419::-;37472:4;37510:2;37499:9;37495:18;37487:26;;37559:9;37553:4;37549:20;37545:1;37534:9;37530:17;37523:47;37587:131;37713:4;37587:131;:::i;:::-;37579:139;;37306:419;;;:::o;37731:173::-;37871:25;37867:1;37859:6;37855:14;37848:49;37731:173;:::o;37910:366::-;38052:3;38073:67;38137:2;38132:3;38073:67;:::i;:::-;38066:74;;38149:93;38238:3;38149:93;:::i;:::-;38267:2;38262:3;38258:12;38251:19;;37910:366;;;:::o;38282:419::-;38448:4;38486:2;38475:9;38471:18;38463:26;;38535:9;38529:4;38525:20;38521:1;38510:9;38506:17;38499:47;38563:131;38689:4;38563:131;:::i;:::-;38555:139;;38282:419;;;:::o;38707:174::-;38847:26;38843:1;38835:6;38831:14;38824:50;38707:174;:::o;38887:366::-;39029:3;39050:67;39114:2;39109:3;39050:67;:::i;:::-;39043:74;;39126:93;39215:3;39126:93;:::i;:::-;39244:2;39239:3;39235:12;39228:19;;38887:366;;;:::o;39259:419::-;39425:4;39463:2;39452:9;39448:18;39440:26;;39512:9;39506:4;39502:20;39498:1;39487:9;39483:17;39476:47;39540:131;39666:4;39540:131;:::i;:::-;39532:139;;39259:419;;;:::o;39684:177::-;39824:29;39820:1;39812:6;39808:14;39801:53;39684:177;:::o;39867:366::-;40009:3;40030:67;40094:2;40089:3;40030:67;:::i;:::-;40023:74;;40106:93;40195:3;40106:93;:::i;:::-;40224:2;40219:3;40215:12;40208:19;;39867:366;;;:::o;40239:419::-;40405:4;40443:2;40432:9;40428:18;40420:26;;40492:9;40486:4;40482:20;40478:1;40467:9;40463:17;40456:47;40520:131;40646:4;40520:131;:::i;:::-;40512:139;;40239:419;;;:::o;40664:159::-;40804:11;40800:1;40792:6;40788:14;40781:35;40664:159;:::o;40829:365::-;40971:3;40992:66;41056:1;41051:3;40992:66;:::i;:::-;40985:73;;41067:93;41156:3;41067:93;:::i;:::-;41185:2;41180:3;41176:12;41169:19;;40829:365;;;:::o;41200:419::-;41366:4;41404:2;41393:9;41389:18;41381:26;;41453:9;41447:4;41443:20;41439:1;41428:9;41424:17;41417:47;41481:131;41607:4;41481:131;:::i;:::-;41473:139;;41200:419;;;:::o;41625:170::-;41765:22;41761:1;41753:6;41749:14;41742:46;41625:170;:::o;41801:366::-;41943:3;41964:67;42028:2;42023:3;41964:67;:::i;:::-;41957:74;;42040:93;42129:3;42040:93;:::i;:::-;42158:2;42153:3;42149:12;42142:19;;41801:366;;;:::o;42173:419::-;42339:4;42377:2;42366:9;42362:18;42354:26;;42426:9;42420:4;42416:20;42412:1;42401:9;42397:17;42390:47;42454:131;42580:4;42454:131;:::i;:::-;42446:139;;42173:419;;;:::o;42598:175::-;42738:27;42734:1;42726:6;42722:14;42715:51;42598:175;:::o;42779:366::-;42921:3;42942:67;43006:2;43001:3;42942:67;:::i;:::-;42935:74;;43018:93;43107:3;43018:93;:::i;:::-;43136:2;43131:3;43127:12;43120:19;;42779:366;;;:::o;43151:419::-;43317:4;43355:2;43344:9;43340:18;43332:26;;43404:9;43398:4;43394:20;43390:1;43379:9;43375:17;43368:47;43432:131;43558:4;43432:131;:::i;:::-;43424:139;;43151:419;;;:::o;43576:173::-;43716:25;43712:1;43704:6;43700:14;43693:49;43576:173;:::o;43755:366::-;43897:3;43918:67;43982:2;43977:3;43918:67;:::i;:::-;43911:74;;43994:93;44083:3;43994:93;:::i;:::-;44112:2;44107:3;44103:12;44096:19;;43755:366;;;:::o;44127:419::-;44293:4;44331:2;44320:9;44316:18;44308:26;;44380:9;44374:4;44370:20;44366:1;44355:9;44351:17;44344:47;44408:131;44534:4;44408:131;:::i;:::-;44400:139;;44127:419;;;:::o;44552:148::-;44654:11;44691:3;44676:18;;44552:148;;;;:::o;44706:377::-;44812:3;44840:39;44873:5;44840:39;:::i;:::-;44895:89;44977:6;44972:3;44895:89;:::i;:::-;44888:96;;44993:52;45038:6;45033:3;45026:4;45019:5;45015:16;44993:52;:::i;:::-;45070:6;45065:3;45061:16;45054:23;;44816:267;44706:377;;;;:::o;45089:435::-;45269:3;45291:95;45382:3;45373:6;45291:95;:::i;:::-;45284:102;;45403:95;45494:3;45485:6;45403:95;:::i;:::-;45396:102;;45515:3;45508:10;;45089:435;;;;;:::o;45530:141::-;45579:4;45602:3;45594:11;;45625:3;45622:1;45615:14;45659:4;45656:1;45646:18;45638:26;;45530:141;;;:::o;45701:802::-;45786:3;45823:5;45817:12;45852:36;45878:9;45852:36;:::i;:::-;45904:71;45968:6;45963:3;45904:71;:::i;:::-;45897:78;;46006:1;45995:9;45991:17;46022:1;46017:135;;;;46166:1;46161:336;;;;45984:513;;46017:135;46101:4;46097:9;46086;46082:25;46077:3;46070:38;46137:4;46132:3;46128:14;46121:21;;46017:135;;46161:336;46228:38;46260:5;46228:38;:::i;:::-;46288:1;46302:154;46316:6;46313:1;46310:13;46302:154;;;46390:7;46384:14;46380:1;46375:3;46371:11;46364:35;46440:1;46431:7;46427:15;46416:26;;46338:4;46335:1;46331:12;46326:17;;46302:154;;;46485:1;46480:3;46476:11;46469:18;;46168:329;;45984:513;;45790:713;;45701:802;;;;:::o;46509:307::-;46619:4;46657:2;46646:9;46642:18;46634:26;;46706:9;46700:4;46696:20;46692:1;46681:9;46677:17;46670:47;46734:75;46804:4;46795:6;46734:75;:::i;:::-;46726:83;;46509:307;;;;:::o;46822:143::-;46879:5;46910:6;46904:13;46895:22;;46926:33;46953:5;46926:33;:::i;:::-;46822:143;;;;:::o;46971:351::-;47041:6;47090:2;47078:9;47069:7;47065:23;47061:32;47058:119;;;47096:79;;:::i;:::-;47058:119;47216:1;47241:64;47297:7;47288:6;47277:9;47273:22;47241:64;:::i;:::-;47231:74;;47187:128;46971:351;;;;:::o;47328:166::-;47468:18;47464:1;47456:6;47452:14;47445:42;47328:166;:::o;47500:366::-;47642:3;47663:67;47727:2;47722:3;47663:67;:::i;:::-;47656:74;;47739:93;47828:3;47739:93;:::i;:::-;47857:2;47852:3;47848:12;47841:19;;47500:366;;;:::o;47872:419::-;48038:4;48076:2;48065:9;48061:18;48053:26;;48125:9;48119:4;48115:20;48111:1;48100:9;48096:17;48089:47;48153:131;48279:4;48153:131;:::i;:::-;48145:139;;47872:419;;;:::o;48297:225::-;48437:34;48433:1;48425:6;48421:14;48414:58;48506:8;48501:2;48493:6;48489:15;48482:33;48297:225;:::o;48528:366::-;48670:3;48691:67;48755:2;48750:3;48691:67;:::i;:::-;48684:74;;48767:93;48856:3;48767:93;:::i;:::-;48885:2;48880:3;48876:12;48869:19;;48528:366;;;:::o;48900:419::-;49066:4;49104:2;49093:9;49089:18;49081:26;;49153:9;49147:4;49143:20;49139:1;49128:9;49124:17;49117:47;49181:131;49307:4;49181:131;:::i;:::-;49173:139;;48900:419;;;:::o;49325:179::-;49465:31;49461:1;49453:6;49449:14;49442:55;49325:179;:::o;49510:366::-;49652:3;49673:67;49737:2;49732:3;49673:67;:::i;:::-;49666:74;;49749:93;49838:3;49749:93;:::i;:::-;49867:2;49862:3;49858:12;49851:19;;49510:366;;;:::o;49882:419::-;50048:4;50086:2;50075:9;50071:18;50063:26;;50135:9;50129:4;50125:20;50121:1;50110:9;50106:17;50099:47;50163:131;50289:4;50163:131;:::i;:::-;50155:139;;49882:419;;;:::o;50307:245::-;50447:34;50443:1;50435:6;50431:14;50424:58;50516:28;50511:2;50503:6;50499:15;50492:53;50307:245;:::o;50558:366::-;50700:3;50721:67;50785:2;50780:3;50721:67;:::i;:::-;50714:74;;50797:93;50886:3;50797:93;:::i;:::-;50915:2;50910:3;50906:12;50899:19;;50558:366;;;:::o;50930:419::-;51096:4;51134:2;51123:9;51119:18;51111:26;;51183:9;51177:4;51173:20;51169:1;51158:9;51154:17;51147:47;51211:131;51337:4;51211:131;:::i;:::-;51203:139;;50930:419;;;:::o;51355:231::-;51495:34;51491:1;51483:6;51479:14;51472:58;51564:14;51559:2;51551:6;51547:15;51540:39;51355:231;:::o;51592:366::-;51734:3;51755:67;51819:2;51814:3;51755:67;:::i;:::-;51748:74;;51831:93;51920:3;51831:93;:::i;:::-;51949:2;51944:3;51940:12;51933:19;;51592:366;;;:::o;51964:419::-;52130:4;52168:2;52157:9;52153:18;52145:26;;52217:9;52211:4;52207:20;52203:1;52192:9;52188:17;52181:47;52245:131;52371:4;52245:131;:::i;:::-;52237:139;;51964:419;;;:::o;52389:228::-;52529:34;52525:1;52517:6;52513:14;52506:58;52598:11;52593:2;52585:6;52581:15;52574:36;52389:228;:::o;52623:366::-;52765:3;52786:67;52850:2;52845:3;52786:67;:::i;:::-;52779:74;;52862:93;52951:3;52862:93;:::i;:::-;52980:2;52975:3;52971:12;52964:19;;52623:366;;;:::o;52995:419::-;53161:4;53199:2;53188:9;53184:18;53176:26;;53248:9;53242:4;53238:20;53234:1;53223:9;53219:17;53212:47;53276:131;53402:4;53276:131;:::i;:::-;53268:139;;52995:419;;;:::o;53420:223::-;53560:34;53556:1;53548:6;53544:14;53537:58;53629:6;53624:2;53616:6;53612:15;53605:31;53420:223;:::o;53649:366::-;53791:3;53812:67;53876:2;53871:3;53812:67;:::i;:::-;53805:74;;53888:93;53977:3;53888:93;:::i;:::-;54006:2;54001:3;53997:12;53990:19;;53649:366;;;:::o;54021:419::-;54187:4;54225:2;54214:9;54210:18;54202:26;;54274:9;54268:4;54264:20;54260:1;54249:9;54245:17;54238:47;54302:131;54428:4;54302:131;:::i;:::-;54294:139;;54021:419;;;:::o;54446:176::-;54478:1;54495:20;54513:1;54495:20;:::i;:::-;54490:25;;54529:20;54547:1;54529:20;:::i;:::-;54524:25;;54568:1;54558:35;;54573:18;;:::i;:::-;54558:35;54614:1;54611;54607:9;54602:14;;54446:176;;;;:::o;54628:332::-;54749:4;54787:2;54776:9;54772:18;54764:26;;54800:71;54868:1;54857:9;54853:17;54844:6;54800:71;:::i;:::-;54881:72;54949:2;54938:9;54934:18;54925:6;54881:72;:::i;:::-;54628:332;;;;;:::o;54966:237::-;55106:34;55102:1;55094:6;55090:14;55083:58;55175:20;55170:2;55162:6;55158:15;55151:45;54966:237;:::o;55209:366::-;55351:3;55372:67;55436:2;55431:3;55372:67;:::i;:::-;55365:74;;55448:93;55537:3;55448:93;:::i;:::-;55566:2;55561:3;55557:12;55550:19;;55209:366;;;:::o;55581:419::-;55747:4;55785:2;55774:9;55770:18;55762:26;;55834:9;55828:4;55824:20;55820:1;55809:9;55805:17;55798:47;55862:131;55988:4;55862:131;:::i;:::-;55854:139;;55581:419;;;:::o;56006:332::-;56127:4;56165:2;56154:9;56150:18;56142:26;;56178:71;56246:1;56235:9;56231:17;56222:6;56178:71;:::i;:::-;56259:72;56327:2;56316:9;56312:18;56303:6;56259:72;:::i;:::-;56006:332;;;;;:::o;56344:98::-;56395:6;56429:5;56423:12;56413:22;;56344:98;;;:::o;56448:168::-;56531:11;56565:6;56560:3;56553:19;56605:4;56600:3;56596:14;56581:29;;56448:168;;;;:::o;56622:360::-;56708:3;56736:38;56768:5;56736:38;:::i;:::-;56790:70;56853:6;56848:3;56790:70;:::i;:::-;56783:77;;56869:52;56914:6;56909:3;56902:4;56895:5;56891:16;56869:52;:::i;:::-;56946:29;56968:6;56946:29;:::i;:::-;56941:3;56937:39;56930:46;;56712:270;56622:360;;;;:::o;56988:529::-;57155:4;57193:2;57182:9;57178:18;57170:26;;57206:71;57274:1;57263:9;57259:17;57250:6;57206:71;:::i;:::-;57287:72;57355:2;57344:9;57340:18;57331:6;57287:72;:::i;:::-;57406:9;57400:4;57396:20;57391:2;57380:9;57376:18;57369:48;57434:76;57505:4;57496:6;57434:76;:::i;:::-;57426:84;;56988:529;;;;;;:::o;57523:137::-;57577:5;57608:6;57602:13;57593:22;;57624:30;57648:5;57624:30;:::i;:::-;57523:137;;;;:::o;57666:345::-;57733:6;57782:2;57770:9;57761:7;57757:23;57753:32;57750:119;;;57788:79;;:::i;:::-;57750:119;57908:1;57933:61;57986:7;57977:6;57966:9;57962:22;57933:61;:::i;:::-;57923:71;;57879:125;57666:345;;;;:::o;58017:182::-;58157:34;58153:1;58145:6;58141:14;58134:58;58017:182;:::o;58205:366::-;58347:3;58368:67;58432:2;58427:3;58368:67;:::i;:::-;58361:74;;58444:93;58533:3;58444:93;:::i;:::-;58562:2;58557:3;58553:12;58546:19;;58205:366;;;:::o;58577:419::-;58743:4;58781:2;58770:9;58766:18;58758:26;;58830:9;58824:4;58820:20;58816:1;58805:9;58801:17;58794:47;58858:131;58984:4;58858:131;:::i;:::-;58850:139;;58577:419;;;:::o;59002:178::-;59142:30;59138:1;59130:6;59126:14;59119:54;59002:178;:::o;59186:366::-;59328:3;59349:67;59413:2;59408:3;59349:67;:::i;:::-;59342:74;;59425:93;59514:3;59425:93;:::i;:::-;59543:2;59538:3;59534:12;59527:19;;59186:366;;;:::o;59558:419::-;59724:4;59762:2;59751:9;59747:18;59739:26;;59811:9;59805:4;59801:20;59797:1;59786:9;59782:17;59775:47;59839:131;59965:4;59839:131;:::i;:::-;59831:139;;59558:419;;;:::o;59983:640::-;60178:4;60216:3;60205:9;60201:19;60193:27;;60230:71;60298:1;60287:9;60283:17;60274:6;60230:71;:::i;:::-;60311:72;60379:2;60368:9;60364:18;60355:6;60311:72;:::i;:::-;60393;60461:2;60450:9;60446:18;60437:6;60393:72;:::i;:::-;60512:9;60506:4;60502:20;60497:2;60486:9;60482:18;60475:48;60540:76;60611:4;60602:6;60540:76;:::i;:::-;60532:84;;59983:640;;;;;;;:::o;60629:141::-;60685:5;60716:6;60710:13;60701:22;;60732:32;60758:5;60732:32;:::i;:::-;60629:141;;;;:::o;60776:349::-;60845:6;60894:2;60882:9;60873:7;60869:23;60865:32;60862:119;;;60900:79;;:::i;:::-;60862:119;61020:1;61045:63;61100:7;61091:6;61080:9;61076:22;61045:63;:::i;:::-;61035:73;;60991:127;60776:349;;;;:::o;61131:553::-;61308:4;61346:3;61335:9;61331:19;61323:27;;61360:71;61428:1;61417:9;61413:17;61404:6;61360:71;:::i;:::-;61441:72;61509:2;61498:9;61494:18;61485:6;61441:72;:::i;:::-;61523;61591:2;61580:9;61576:18;61567:6;61523:72;:::i;:::-;61605;61673:2;61662:9;61658:18;61649:6;61605:72;:::i;:::-;61131:553;;;;;;;:::o;61690:79::-;61729:7;61758:5;61747:16;;61690:79;;;:::o;61775:157::-;61880:45;61900:24;61918:5;61900:24;:::i;:::-;61880:45;:::i;:::-;61875:3;61868:58;61775:157;;:::o;61938:79::-;61977:7;62006:5;61995:16;;61938:79;;;:::o;62023:157::-;62128:45;62148:24;62166:5;62148:24;:::i;:::-;62128:45;:::i;:::-;62123:3;62116:58;62023:157;;:::o;62186:397::-;62326:3;62341:75;62412:3;62403:6;62341:75;:::i;:::-;62441:2;62436:3;62432:12;62425:19;;62454:75;62525:3;62516:6;62454:75;:::i;:::-;62554:2;62549:3;62545:12;62538:19;;62574:3;62567:10;;62186:397;;;;;:::o
Swarm Source
ipfs://b93eba5bb9c2f0e803901101fd1196ff097e89a137be11ab2de89448c259d800
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.