ETH Price: $3,265.49 (-0.56%)
Gas: 1 Gwei

Token

Sparkster (SPRK)
 

Overview

Max Total Supply

435,000,000 SPRK

Holders

1,819 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
trueinsider.eth
Balance
5,421 SPRK

Value
$0.00
0x4b915f324160ea3440d3c4d11015711c172e91e2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Decentralized cloud. Enabling users to build software written in plain English.

ICO Information

ICO Start Date : Jul 07, 2018  
ICO End Date : Jul 09, 2018
Raised : $30,000,000
ICO Price  : $0.15 | 0.00035714 ETH
Country : United Kingdom

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SparksterTokenSwap

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-08-18
*/

pragma solidity 0.5.8;
// From: https://github.com/mixbytes/solidity/blob/master/contracts/ownership/multiowned.sol
// Copyright (C) 2017  MixBytes, LLC

// Licensed under the Apache License, Version 2.0 (the "License").
// You may not use this file except in compliance with the License.

// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND (express or implied).

// Code taken from https://github.com/ethereum/dapp-bin/blob/master/wallet/wallet.sol
// Audit, refactoring and improvements by github.com/Eenae

// @authors:
// Gav Wood <[email protected]>
// inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a
// single, or, crucially, each of a number of, designated owners.
// usage:
// use modifiers onlyOwner (just own owned) or onlyManyOwners(hash), whereby the same hash must be provided by
// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the
// interior is executed.


/// note: during any ownership changes all pending operations (waiting for more signatures) are cancelled
// TODO acceptOwnership
contract multiowned {

	// TYPES

	// struct for the status of a pending operation.
	struct MultiOwnedOperationPendingState {
		// count of confirmations needed
		uint256 yetNeeded;

		// bitmap of confirmations where owner #ownerIndex's decision corresponds to 2**ownerIndex bit
		uint256 ownersDone;

		// position of this operation key in m_multiOwnedPendingIndex
		uint256 index;
	}

	// EVENTS

	event Confirmation(address owner, bytes32 operation);
	event Revoke(address owner, bytes32 operation);
	event FinalConfirmation(address owner, bytes32 operation);

	// some others are in the case of an owner changing.
	event OwnerChanged(address oldOwner, address newOwner);
	event OwnerAdded(address newOwner);
	event OwnerRemoved(address oldOwner);

	// the last one is emitted if the required signatures change
	event RequirementChanged(uint256 newRequirement);

	// MODIFIERS

	// simple single-sig function modifier.
	modifier onlyOwner {
		require(isOwner(msg.sender), "Auth");
		_;
	}
	// multi-sig function modifier: the operation must have an intrinsic hash in order
	// that later attempts can be realised as the same underlying operation and
	// thus count as confirmations.
	modifier onlyManyOwners(bytes32 _operation) {
		if (confirmAndCheck(_operation)) {
			_;
		}
		// Even if required number of confirmations has't been collected yet,
		// we can't throw here - because changes to the state have to be preserved.
		// But, confirmAndCheck itself will throw in case sender is not an owner.
	}

	modifier validNumOwners(uint256 _numOwners) {
		require(_numOwners > 0 && _numOwners <= c_maxOwners, "NumOwners OOR");
		_;
	}

	modifier multiOwnedValidRequirement(uint256 _required, uint256 _numOwners) {
		require(_required > 0 && _required <= _numOwners, "Req OOR");
		_;
	}

	modifier ownerExists(address _address) {
		require(isOwner(_address), "Auth");
		_;
	}

	modifier ownerDoesNotExist(address _address) {
		require(!isOwner(_address), "Is owner");
		_;
	}

	modifier multiOwnedOperationIsActive(bytes32 _operation) {
		require(isOperationActive(_operation), "NoOp");
		_;
	}

	// METHODS

	// constructor is given number of sigs required to do protected "onlyManyOwners" transactions
	// as well as the selection of addresses capable of confirming them (msg.sender is not added to the owners!).
	constructor (address[] memory _owners, uint256 _required)
		public
		validNumOwners(_owners.length)
		multiOwnedValidRequirement(_required, _owners.length)
	{
		assert(c_maxOwners <= 255);

		m_numOwners = _owners.length;
		m_multiOwnedRequired = _required;

		for (uint256 i = 0; i < _owners.length; ++i)
		{
			address owner = _owners[i];
			// invalid and duplicate addresses are not allowed
			require(address(0) != owner && !isOwner(owner), "Exists");  /* not isOwner yet! */

			uint256 currentOwnerIndex = checkOwnerIndex(i + 1);  /* first slot is unused */
			m_owners[currentOwnerIndex] = owner;
			m_ownerIndex[owner] = currentOwnerIndex;
		}

		assertOwnersAreConsistent();
	}

	/// @notice replaces an owner `_from` with another `_to`.
	/// @param _from address of owner to replace
	/// @param _to address of new owner
	// All pending operations will be canceled!
	function changeOwner(address _from, address _to)
		external
		ownerExists(_from)
		ownerDoesNotExist(_to)
		onlyManyOwners(keccak256(msg.data))
	{
		assertOwnersAreConsistent();

		clearPending();
		uint256 ownerIndex = checkOwnerIndex(m_ownerIndex[_from]);
		m_owners[ownerIndex] = _to;
		m_ownerIndex[_from] = 0;
		m_ownerIndex[_to] = ownerIndex;

		assertOwnersAreConsistent();
		emit OwnerChanged(_from, _to);
	}

	/// @notice adds an owner
	/// @param _owner address of new owner
	// All pending operations will be canceled!
	function addOwner(address _owner)
		external
		ownerDoesNotExist(_owner)
		validNumOwners(m_numOwners + 1)
		onlyManyOwners(keccak256(msg.data))
	{
		assertOwnersAreConsistent();

		clearPending();
		m_numOwners++;
		m_owners[m_numOwners] = _owner;
		m_ownerIndex[_owner] = checkOwnerIndex(m_numOwners);

		assertOwnersAreConsistent();
		emit OwnerAdded(_owner);
	}

	/// @notice removes an owner
	/// @param _owner address of owner to remove
	// All pending operations will be canceled!
	function removeOwner(address _owner)
		external
		ownerExists(_owner)
		validNumOwners(m_numOwners - 1)
		multiOwnedValidRequirement(m_multiOwnedRequired, m_numOwners - 1)
		onlyManyOwners(keccak256(msg.data))
	{
		assertOwnersAreConsistent();

		clearPending();
		uint256 ownerIndex = checkOwnerIndex(m_ownerIndex[_owner]);
		m_owners[ownerIndex] = address(0);
		m_ownerIndex[_owner] = 0;
		//make sure m_numOwners is equal to the number of owners and always points to the last owner
		reorganizeOwners();

		assertOwnersAreConsistent();
		emit OwnerRemoved(_owner);
	}

	/// @notice changes the required number of owner signatures
	/// @param _newRequired new number of signatures required
	// All pending operations will be canceled!
	function changeRequirement(uint256 _newRequired)
		external
		multiOwnedValidRequirement(_newRequired, m_numOwners)
		onlyManyOwners(keccak256(msg.data))
	{
		m_multiOwnedRequired = _newRequired;
		clearPending();
		emit RequirementChanged(_newRequired);
	}

	/// @notice Gets an owner by 0-indexed position
	/// @param ownerIndex 0-indexed owner position
	function getOwner(uint256 ownerIndex) public view returns (address) {
		return m_owners[ownerIndex + 1];
	}

	/// @notice Gets owners
	/// @return memory array of owners
	function getOwners() public view returns (address[] memory) {
		address[] memory result = new address[](m_numOwners);
		for (uint256 i = 0; i < m_numOwners; i++)
			result[i] = getOwner(i);

		return result;
	}

	/// @notice checks if provided address is an owner address
	/// @param _addr address to check
	/// @return true if it's an owner
	function isOwner(address _addr) public view returns (bool) {
		return m_ownerIndex[_addr] > 0;
	}

	/// @notice Tests ownership of the current caller.
	/// @return true if it's an owner
	// It's advisable to call it by new owner to make sure that the same erroneous address is not copy-pasted to
	// addOwner/changeOwner and to isOwner.
	function amIOwner() external view onlyOwner returns (bool) {
		return true;
	}

	/// @notice Revokes a prior confirmation of the given operation
	/// @param _operation operation value, typically keccak256(msg.data)
	function revoke(bytes32 _operation)
		external
		multiOwnedOperationIsActive(_operation)
		onlyOwner
	{
		uint256 ownerIndexBit = makeOwnerBitmapBit(msg.sender);
		MultiOwnedOperationPendingState storage pending = m_multiOwnedPending[_operation];
		require(pending.ownersDone & ownerIndexBit > 0, "Auth");

		assertOperationIsConsistent(_operation);

		pending.yetNeeded++;
		pending.ownersDone -= ownerIndexBit;

		assertOperationIsConsistent(_operation);
		emit Revoke(msg.sender, _operation);
	}

	/// @notice Checks if owner confirmed given operation
	/// @param _operation operation value, typically keccak256(msg.data)
	/// @param _owner an owner address
	function hasConfirmed(bytes32 _operation, address _owner)
		external
		view
		multiOwnedOperationIsActive(_operation)
		ownerExists(_owner)
		returns (bool)
	{
		return !(m_multiOwnedPending[_operation].ownersDone & makeOwnerBitmapBit(_owner) == 0);
	}

	// INTERNAL METHODS

	function confirmAndCheck(bytes32 _operation)
		internal
		onlyOwner
		returns (bool)
	{
		if (512 == m_multiOwnedPendingIndex.length)
			// In case m_multiOwnedPendingIndex grows too much we have to shrink it: otherwise at some point
			// we won't be able to do it because of block gas limit.
			// Yes, pending confirmations will be lost. Dont see any security or stability implications.
			// TODO use more graceful approach like compact or removal of clearPending completely
			clearPending();

		MultiOwnedOperationPendingState storage pending = m_multiOwnedPending[_operation];

		// if we're not yet working on this operation, switch over and reset the confirmation status.
		if (! isOperationActive(_operation)) {
			// reset count of confirmations needed.
			pending.yetNeeded = m_multiOwnedRequired;
			// reset which owners have confirmed (none) - set our bitmap to 0.
			pending.ownersDone = 0;
			pending.index = m_multiOwnedPendingIndex.length++;
			m_multiOwnedPendingIndex[pending.index] = _operation;
			assertOperationIsConsistent(_operation);
		}

		// determine the bit to set for this owner.
		uint256 ownerIndexBit = makeOwnerBitmapBit(msg.sender);
		// make sure we (the message sender) haven't confirmed this operation previously.
		if (pending.ownersDone & ownerIndexBit == 0) {
			// ok - check if count is enough to go ahead.
			assert(pending.yetNeeded > 0);
			if (pending.yetNeeded == 1) {
				// enough confirmations: reset and run interior.
				delete m_multiOwnedPendingIndex[m_multiOwnedPending[_operation].index];
				delete m_multiOwnedPending[_operation];
				emit FinalConfirmation(msg.sender, _operation);
				return true;
			}
			else
			{
				// not enough: record that this owner in particular confirmed.
				pending.yetNeeded--;
				pending.ownersDone |= ownerIndexBit;
				assertOperationIsConsistent(_operation);
				emit Confirmation(msg.sender, _operation);
			}
		}
	}

	// Reclaims free slots between valid owners in m_owners.
	// TODO given that its called after each removal, it could be simplified.
	function reorganizeOwners() private {
		uint256 free = 1;
		uint256 numberOfOwners = m_numOwners;
		while (free < numberOfOwners)
		{
			// iterating to the first free slot from the beginning
			while (free < numberOfOwners && m_owners[free] != address(0)) free++;

			// iterating to the first occupied slot from the end
			while (numberOfOwners > 1 && m_owners[numberOfOwners] == address(0)) numberOfOwners--;

			// swap, if possible, so free slot is located at the end after the swap
			if (free < numberOfOwners && m_owners[numberOfOwners] != address(0) && m_owners[free] == address(0))
			{
				// owners between swapped slots should't be renumbered - that saves a lot of gas
				m_owners[free] = m_owners[numberOfOwners];
				m_ownerIndex[m_owners[free]] = free;
				m_owners[numberOfOwners] = address(0);
			}
		}
		m_numOwners = numberOfOwners;
	}

	function clearPending() private onlyOwner {
		uint256 length = m_multiOwnedPendingIndex.length;
		// TODO block gas limit
		for (uint256 i = 0; i < length; ++i) {
			if (m_multiOwnedPendingIndex[i] != 0)
				delete m_multiOwnedPending[m_multiOwnedPendingIndex[i]];
		}
		delete m_multiOwnedPendingIndex;
	}

	function checkOwnerIndex(uint256 ownerIndex) internal pure returns (uint256) {
		assert(0 != ownerIndex && ownerIndex <= c_maxOwners);
		return ownerIndex;
	}

	function makeOwnerBitmapBit(address owner) private view returns (uint256) {
		uint256 ownerIndex = checkOwnerIndex(m_ownerIndex[owner]);
		return 2 ** ownerIndex;
	}

	function isOperationActive(bytes32 _operation) private view returns (bool) {
		return 0 != m_multiOwnedPending[_operation].yetNeeded;
	}


	function assertOwnersAreConsistent() private view {
		assert(m_numOwners > 0);
		assert(m_numOwners <= c_maxOwners);
		assert(m_owners[0] == address(0));
		assert(0 != m_multiOwnedRequired && m_multiOwnedRequired <= m_numOwners);
	}

	function assertOperationIsConsistent(bytes32 _operation) private view {
		MultiOwnedOperationPendingState storage pending = m_multiOwnedPending[_operation];
		assert(0 != pending.yetNeeded);
		assert(m_multiOwnedPendingIndex[pending.index] == _operation);
		assert(pending.yetNeeded <= m_multiOwnedRequired);
	}


	// FIELDS

	uint256 constant c_maxOwners = 250;

	// the number of owners that must confirm the same operation before it is run.
	uint256 public m_multiOwnedRequired;


	// pointer used to find a free slot in m_owners
	uint256 public m_numOwners;

	// list of owners (addresses),
	// slot 0 is unused so there are no owner which index is 0.
	// TODO could we save space at the end of the array for the common case of <10 owners? and should we?
	address[256] internal m_owners;

	// index on the list of owners to allow reverse lookup: owner address => index in m_owners
	mapping(address => uint256) internal m_ownerIndex;


	// the ongoing operations.
	mapping(bytes32 => MultiOwnedOperationPendingState) internal m_multiOwnedPending;
	bytes32[] internal m_multiOwnedPendingIndex;
}


/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* See https://github.com/ethereum/EIPs/issues/179
*/
contract ERC20Basic {
	function totalSupply() public view returns (uint256);
	function balanceOf(address who) public view returns (uint256);
	function transfer(address to, uint256 value) public returns (bool);
	event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {

	/**
	* @dev Multiplies two numbers, throws on overflow.
	*/
	function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
		// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
		// benefit is lost if 'b' is also tested.
		// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
		if (a == 0) {
			return 0;
		}

		c = a * b;
		assert(c / a == b);
		return c;
	}

	/**
	* @dev Integer division of two numbers, truncating the quotient.
	*/
	/*
	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		// assert(b > 0); // Solidity automatically throws when dividing by 0
		// uint256 c = a / b;
		// assert(a == b * c + a % b); // There is no case in which this doesn't hold
		return a / b;
	}
	*/

	/**
	* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
	*/
	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		assert(b <= a);
		return a - b;
	}

	/**
	* @dev Adds two numbers, throws on overflow.
	*/
	function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
		c = a + b;
		assert(c >= a);
		return c;
	}
}


/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
*/
contract BasicToken is ERC20Basic {
	using SafeMath for uint256;

	mapping(address => uint256) balances;

	uint256 totalSupply_;

	/**
	* @dev Total number of tokens in existence
	*/
	function totalSupply() public view returns (uint256) {
		return totalSupply_;
	}

	/**
	* @dev Transfer token for a specified address
	* @param _to The address to transfer to.
	* @param _value The amount to be transferred.
	*/
	function transfer(address _to, uint256 _value) public returns (bool) {
		require(_to != address(0), "Self");
		require(_value <= balances[msg.sender], "NSF");

		balances[msg.sender] = balances[msg.sender].sub(_value);
		balances[_to] = balances[_to].add(_value);
		emit Transfer(msg.sender, _to, _value);
		return true;
	}

	/**
	* @dev Gets the balance of the specified address.
	* @param _owner The address to query the the balance of.
	* @return An uint256 representing the amount owned by the passed address.
	*/
	function balanceOf(address _owner) public view returns (uint256) {
		return balances[_owner];
	}

}


/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 is ERC20Basic {
	function allowance(address owner, address spender) public view returns (uint256);

	function transferFrom(address from, address to, uint256 value) public returns (bool);

	function approve(address spender, uint256 value) public returns (bool);
	event Approval(
		address indexed owner,
		address indexed spender,
		uint256 value
	);
}


/**
* @title Standard ERC20 token
*
* @dev Implementation of the basic standard token.
* https://github.com/ethereum/EIPs/issues/20
* Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract StandardToken is ERC20, BasicToken {

	mapping (address => mapping (address => uint256)) internal allowed;


	/**
	* @dev Transfer tokens from one address to another
	* @param _from address The address which you want to send tokens from
	* @param _to address The address which you want to transfer to
	* @param _value uint256 the amount of tokens to be transferred
	*/
	function transferFrom(
		address _from,
		address _to,
		uint256 _value
	)
	public
	returns (bool)
	{
		require(_to != address(0), "Invl");
		require(_value <= balances[_from], "NSF");
		require(_value <= allowed[_from][msg.sender], "NFAllowance");

		balances[_from] = balances[_from].sub(_value);
		balances[_to] = balances[_to].add(_value);
		allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
		emit Transfer(_from, _to, _value);
		return true;
	}

	/**
	* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
	* Beware that changing an allowance with this method brings the risk that someone may use both the old
	* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
	* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
	* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
	* @param _spender The address which will spend the funds.
	* @param _value The amount of tokens to be spent.
	*/
	function approve(address _spender, uint256 _value) public returns (bool) {
		allowed[msg.sender][_spender] = _value;
		emit Approval(msg.sender, _spender, _value);
		return true;
	}

	/**
	* @dev Function to check the amount of tokens that an owner allowed to a spender.
	* @param _owner address The address which owns the funds.
	* @param _spender address The address which will spend the funds.
	* @return A uint256 specifying the amount of tokens still available for the spender.
	*/
	function allowance(
		address _owner,
		address _spender
	)
	public
	view
	returns (uint256)
	{
		return allowed[_owner][_spender];
	}

	/**
	* @dev Increase the amount of tokens that an owner allowed to a spender.
	* approve should be called when allowed[_spender] == 0. To increment
	* allowed value is better to use this function to avoid 2 calls (and wait until
	* the first transaction is mined)
	* From MonolithDAO Token.sol
	* @param _spender The address which will spend the funds.
	* @param _addedValue The amount of tokens to increase the allowance by.
	*/
	function increaseApproval(
		address _spender,
		uint256 _addedValue
	)
	public
	returns (bool)
	{
		allowed[msg.sender][_spender] = (
		allowed[msg.sender][_spender].add(_addedValue));
		emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
		return true;
	}

	/**
	* @dev Decrease the amount of tokens that an owner allowed to a spender.
	* approve should be called when allowed[_spender] == 0. To decrement
	* allowed value is better to use this function to avoid 2 calls (and wait until
	* the first transaction is mined)
	* From MonolithDAO Token.sol
	* @param _spender The address which will spend the funds.
	* @param _subtractedValue The amount of tokens to decrease the allowance by.
	*/
	function decreaseApproval(
		address _spender,
		uint256 _subtractedValue
	)
	public
	returns (bool)
	{
		uint256 oldValue = allowed[msg.sender][_spender];
		if (_subtractedValue > oldValue) {
			allowed[msg.sender][_spender] = 0;
		} else {
			allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
		}
		emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
		return true;
	}

}

contract SparksterTokenSwap is StandardToken, multiowned {
	using SafeMath for uint256;
	struct Member {
		mapping(uint256 => uint256) weiBalance; // How much wei has this member contributed for this group?
		uint256[] groups; // A list of groups this member belongs to.
		// Used to see how many locked tokens this user has so we don't have to iterate over all groups;
		// we can just iterate over the groups this user belongs to.
	}

	enum GroupStates {
		none,
		distributing,
		distributed,
		unlocked // This value is only set for groups that don't define an unlock time.
		// For groups that define an unlock time, the group is unlocked if Group.state == GroupStates.distributed and the unlock time has elapsed; the GroupStates.unlocked state will be ignored.
	}

	struct Group {
		GroupStates state; // Indicates whether the group is distributed or unlocked.
		mapping(address => bool) exists; // If exists[address] is true, this address has made a purchase on this group before.
		string name;
		uint256 ratio; // 1 eth:ratio tokens. This amount represents the decimal amount. ratio*10**decimal = ratio sparks.
		uint256 unlockTime; // The timestamp after which tokens in this group are unlocked.
		// If set to a truthy value, the group will be considered unlocked after this time elapses and the group is distributed.
		uint256 startTime; // Epoch of crowdsale start time.
		uint256 phase1endTime; // Epoch of phase1 end time.
		uint256 phase2endTime; // Epoch of phase2 end time.
		uint256 deadline; // No contributions allowed after this epoch.
		uint256 max2; // cap of phase2
		uint256 max3; // Total ether this group can collect in phase 3.
		uint256 weiTotal; // How much ether has this group collected?
		uint256 cap; // The hard ether cap.
		uint256 nextDistributionIndex; // The next index to start distributing at.
		address[] addresses; // List of addresses that have made a purchase on this group.
	}

	address[] internal initialSigners = [0xCdF06E2F49F7445098CFA54F52C7f43eE40fa016, 0x0D2b5b40F88cCb05e011509830c2E5003d73FE92, 0x363d591196d3004Ca708DB2049501440718594f5];
	address public oracleAddress;
	address constant public oldSprkAddress = 0x971d048E737619884f2df75e31c7Eb6412392328;
	address public owner; // We call this the owner simply because so many ERC-20 contracts have an owner variable,
	// so if an API implements getting the balance of the original token holder by querying balanceOf(owner()), this contract won't break the API.
	// But in our implementation, the contract is multiowned so this owner field has no owning significance besides being the token generator.
	bool public transferLock = true; // A Global transfer lock. Set to lock down all tokens from all groups.
	bool public allowedToBuyBack = false;
	bool public allowedToPurchase = false;
	string public name;									 // name for display
	string public symbol;								 //An identifier
	uint8 public decimals;							//How many decimals to show.
	uint8 constant internal maxGroups = 100; // Total number of groups we are allowed to create.
	uint256 public penalty;
	uint256 public maxGasPrice; // The maximum allowed gas for the purchase function.
	uint256 internal nextGroupNumber;
	uint256 public sellPrice; // sellPrice wei:1 spark token; we won't allow to sell back parts of a token.
	uint256 public minimumRequiredBalance; // How much wei is required for the contract to hold that will cover all refunds.
	// Owners must leave this much in the contract.
	uint256 public openGroupNumber;
	mapping(address => Member) internal members; // For reverse member lookup.
	mapping(uint256 => Group) internal groups; // For reverse group lookup.
	mapping(address => uint256) internal withdrawableBalances; // How much wei is this address allowed to withdraw?
	ERC20 oldSprk; // The old Sparkster token contract
	event WantsToPurchase(address walletAddress, uint256 weiAmount, uint256 groupNumber, bool inPhase1);
	event PurchasedCallbackOnAccept(uint256 groupNumber, address[] addresses);
	event WantsToDistribute(uint256 groupNumber);
	event NearingHardCap(uint256 groupNumber, uint256 remainder);
	event ReachedHardCap(uint256 groupNumber);
	event DistributeDone(uint256 groupNumber);
	event DistributedBatch(uint256 groupNumber, uint256 howMany);
	event ShouldCallDoneDistributing();
	event AirdroppedBatch(address[] addresses);
	event RefundedBatch(address[] addresses);
	event AddToGroup(address walletAddress, uint256 groupNumber);
	event ChangedTransferLock(bool transferLock);
	event ChangedAllowedToPurchase(bool allowedToPurchase);
	event ChangedAllowedToBuyBack(bool allowedToBuyBack);
	event SetSellPrice(uint256 sellPrice);

	modifier onlyOwnerOrOracle() {
		require(isOwner(msg.sender) || msg.sender == oracleAddress, "Auth");
		_;
	}

	modifier onlyManyOwnersOrOracle(bytes32 _operation) {
		if (confirmAndCheck(_operation) || msg.sender == oracleAddress)
			_;
		// Don't throw here since confirmAndCheck needs to preserve state.
	}

	modifier canTransfer() {
		if (!isOwner(msg.sender)) { // Owners are immuned from the transfer lock.
			require(!transferLock, "Locked");
		}
		_;
	}

	modifier canPurchase() {
		require(allowedToPurchase, "Disallowed");
		_;
	}

	modifier canSell() {
		require(allowedToBuyBack, "Denied");
		_;
	}

	function() external payable {
		purchase();
	}

	constructor()
	multiowned( initialSigners, 2) public {
		require(isOwner(msg.sender), "NaO");
		oldSprk = ERC20(oldSprkAddress);
		owner = msg.sender;
		name = "Sparkster";									// Set the name for display purposes
		decimals = 18;					 // Amount of decimals for display purposes
		symbol = "SPRK";							// Set the symbol for display purposes
		maxGasPrice = 40 * 10**9; // Set max gas to 40 Gwei to start with.
		uint256 amount = 435000000;
		uint256 decimalAmount = amount.mul(uint(10)**decimals);
		totalSupply_ = decimalAmount;
		balances[msg.sender] = decimalAmount;
		emit Transfer(address(0), msg.sender, decimalAmount); // Per erc20 standards-compliance.
	}

	function swapTokens() public returns(bool) {
		require(msg.sender != address(this), "Self"); // Don't let this contract swap tokens with itself.
		// First, find out how much the sender has allowed us to spend. This is the amount of Sprk we're allowed to move.
		// Sender can set this value by calling increaseApproval on the old contract.
		uint256 amountToTransfer = oldSprk.allowance(msg.sender, address(this));
		require(amountToTransfer > 0, "Amount==0");
		// However many tokens we took away from the user in the old contract, give that amount in our new contract.
		balances[msg.sender] = balances[msg.sender].add(amountToTransfer);
		balances[owner] = balances[owner].sub(amountToTransfer);
		// Finally, transfer the old tokens away from the sender and to our address. This will effectively freeze the tokens because no one can transact on this contract's behalf except the contract.
		require(oldSprk.transferFrom(msg.sender, address(this), amountToTransfer), "Transfer");
		emit Transfer(owner, msg.sender, amountToTransfer);
		return true;
	}

	function setOwnerAddress(address newAddress) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		require(newAddress != address(0), "Invl");
		require(newAddress != owner, "Self");
		uint256 oldOwnerBalance = balances[owner];
		balances[newAddress] = balances[newAddress].add(oldOwnerBalance);
		balances[owner] = 0;
		emit Transfer(owner, newAddress, oldOwnerBalance);
		owner = newAddress;
		return true;
	}

	function setOracleAddress(address newAddress) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		oracleAddress = newAddress;
		return true;
	}

	function removeOracleAddress() public onlyOwner returns(bool) {
		oracleAddress = address(0);
		return true;
	}

	function setMaximumGasPrice(uint256 gweiPrice) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		maxGasPrice = gweiPrice.mul(10**9); // Convert the gwei value to wei.
		return true;
	}

	function purchase() public canPurchase payable returns(bool) {
		Member storage memberRecord = members[msg.sender];
		Group storage openGroup = groups[openGroupNumber];
		require(openGroup.ratio > 0, "Not initialized"); // Group must be initialized.
		uint256 currentTimestamp = block.timestamp;
		require(currentTimestamp >= openGroup.startTime && currentTimestamp <= openGroup.deadline, "OOR");
		// The timestamp must be greater than or equal to the start time and less than or equal to the deadline time
		require(openGroup.state == GroupStates.none, "State");
		// Don't allow to purchase if we're in the middle of distributing, have already distributed, or have unlocked.
		require(tx.gasprice <= maxGasPrice, "Gas price"); // Restrict maximum gas this transaction is allowed to consume.
		uint256 weiAmount = msg.value;																		// The amount purchased by the current member
		// Updated in purchaseCallbackOnAccept.
		require(weiAmount >= 0.1 ether, "Amount<0.1 ether");
		uint256 weiTotal = openGroup.weiTotal.add(weiAmount); // Calculate total contribution of all members in this group.
		// WeiTotals are updated in purchaseCallbackOnAccept
		require(weiTotal <= openGroup.cap, "Cap exceeded");														// Check to see if accepting these funds will put us above the hard ether cap.
		uint256 userWeiTotal = memberRecord.weiBalance[openGroupNumber].add(weiAmount); // Calculate the total amount purchased by the current member
		if (!openGroup.exists[msg.sender]) { // Has this person not purchased on this group before?
			openGroup.addresses.push(msg.sender);
			openGroup.exists[msg.sender] = true;
			memberRecord.groups.push(openGroupNumber);
		}
		if(currentTimestamp <= openGroup.phase1endTime){																			 // whether the current timestamp is in the first phase
			emit WantsToPurchase(msg.sender, weiAmount, openGroupNumber, true);
			return true;
		} else if (currentTimestamp <= openGroup.phase2endTime) { // Are we in phase 2?
			require(userWeiTotal <= openGroup.max2, "Phase2 cap exceeded"); // Allow to contribute no more than max2 in phase 2.
			emit WantsToPurchase(msg.sender, weiAmount, openGroupNumber, false);
			return true;
		} else { // We've passed both phases 1 and 2.
			require(userWeiTotal <= openGroup.max3, "Phase3 cap exceeded"); // Don't allow to contribute more than max3 in phase 3.
			emit WantsToPurchase(msg.sender, weiAmount, openGroupNumber, false);
			return true;
		}
	}

	function purchaseCallbackOnAccept(
		uint256 groupNumber, address[] memory addresses, uint256[] memory weiAmounts)
	public onlyManyOwnersOrOracle(keccak256(msg.data)) returns(bool success) {
		return accept(groupNumber, addresses, weiAmounts);
	}

	// Base function for accepts.
	// Calling functions should be multisig.
	function accept(
		uint256 groupNumber, address[] memory addresses, uint256[] memory weiAmounts)
	private onlyOwnerOrOracle returns(bool) {
		uint256 n = addresses.length;
		require(n == weiAmounts.length, "Length");
		Group storage theGroup = groups[groupNumber];
		uint256 weiTotal = theGroup.weiTotal;
		for (uint256 i = 0; i < n; i++) {
			Member storage memberRecord = members[addresses[i]];
			uint256 weiAmount = weiAmounts[i];
			weiTotal = weiTotal.add(weiAmount);								 // Calculate the total amount purchased by all members in this group.
			memberRecord.weiBalance[groupNumber] = memberRecord.weiBalance[groupNumber].add(weiAmount);
			// Record the total amount purchased by the current member
		}
		theGroup.weiTotal = weiTotal;
		if (getHowMuchUntilHardCap_(groupNumber) <= 100 ether) {
			emit NearingHardCap(groupNumber, getHowMuchUntilHardCap_(groupNumber));
			if (weiTotal >= theGroup.cap) {
				emit ReachedHardCap(groupNumber);
			}
		}
		emit PurchasedCallbackOnAccept(groupNumber, addresses);
		return true;
	}

	function insertAndApprove(uint256 groupNumber, address[] memory addresses, uint256[] memory weiAmounts)
	public onlyManyOwnersOrOracle(keccak256(msg.data)) returns(bool) {
		uint256 n = addresses.length;
		require(n == weiAmounts.length, "Length");
		Group storage theGroup = groups[groupNumber];
		for (uint256 i = 0; i < n; i++) {
			address theAddress = addresses[i];
			if (!theGroup.exists[theAddress]) {
				theGroup.addresses.push(theAddress);
				theGroup.exists[theAddress] = true;
				members[theAddress].groups.push(groupNumber);
			}
		}
		return accept(groupNumber, addresses, weiAmounts);
	}

	function callbackInsertApproveAndDistribute(
		uint256 groupNumber, address[] memory addresses, uint256[] memory weiAmounts)
	public onlyManyOwnersOrOracle(keccak256(msg.data)) returns(bool) {
		uint256 n = addresses.length;
		require(n == weiAmounts.length, "Length");
		require(getGroupState(groupNumber) != GroupStates.unlocked, "Unlocked");
		Group storage theGroup = groups[groupNumber];
		uint256 newOwnerSupply = balances[owner];
		for (uint256 i = 0; i < n; i++) {
			address theAddress = addresses[i];
			Member storage memberRecord = members[theAddress];
			uint256 weiAmount = weiAmounts[i];
			memberRecord.weiBalance[groupNumber] = memberRecord.weiBalance[groupNumber].add(weiAmount);
			// Record the total amount purchased by the current member
			if (!theGroup.exists[theAddress]) {
				theGroup.addresses.push(theAddress);
				theGroup.exists[theAddress] = true;
				memberRecord.groups.push(groupNumber);
			}
			uint256 additionalBalance = weiAmount.mul(theGroup.ratio); // Don't give cumulative tokens; one address can be distributed multiple times.
			if (additionalBalance > 0) {
				balances[theAddress] = balances[theAddress].add(additionalBalance);
				newOwnerSupply = newOwnerSupply.sub(additionalBalance); // Update the available number of tokens.
				emit Transfer(owner, theAddress, additionalBalance); // Notify exchanges of the distribution.
			}
		}
		balances[owner] = newOwnerSupply;
		emit PurchasedCallbackOnAccept(groupNumber, addresses);
		if (getGroupState(groupNumber) != GroupStates.distributed)
			theGroup.state = GroupStates.distributed;
		return true;
	}

	function getWithdrawableAmount() public view returns(uint256) {
		return withdrawableBalances[msg.sender];
	}

	function withdraw() public returns (bool) {
		uint256 amount = withdrawableBalances[msg.sender];
		require(amount > 0, "NSF");
		withdrawableBalances[msg.sender] = 0;
		minimumRequiredBalance = minimumRequiredBalance.sub(amount);
		msg.sender.transfer(amount);
		return true;
	}

	function refund(address[] memory addresses, uint256[] memory weiAmounts) public onlyManyOwners(keccak256(msg.data)) returns(bool success) {
		uint256 n = addresses.length;
		require (n == weiAmounts.length, "Length");
		uint256 thePenalty = penalty;
		uint256 totalRefund = 0;
		for(uint256 i = 0; i < n; i++) {
			uint256 weiAmount = weiAmounts[i];
			address payable theAddress = address(uint160(address(addresses[i])));
			if (thePenalty < weiAmount) {
				weiAmount = weiAmount.sub(thePenalty);
				totalRefund = totalRefund.add(weiAmount);
				withdrawableBalances[theAddress] = withdrawableBalances[theAddress].add(weiAmount);
			}
		}
		require(address(this).balance >= minimumRequiredBalance + totalRefund, "NSF"); // The contract must have enough to refund these addresses.
		minimumRequiredBalance = minimumRequiredBalance.add(totalRefund);
		emit RefundedBatch(addresses);
		return true;
	}

	function signalDoneDistributing(uint256 groupNumber) public onlyManyOwnersOrOracle(keccak256(msg.data)) {
		Group storage theGroup = groups[groupNumber];
		theGroup.state = GroupStates.distributed;
		emit DistributeDone(groupNumber);
	}

	function drain(address payable to) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		uint256 amountAllowedToDrain = address(this).balance.sub(minimumRequiredBalance);
		require(amountAllowedToDrain > 0, "NSF");
		to.transfer(amountAllowedToDrain);
		return true;
	}

	function setPenalty(uint256 newPenalty) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		penalty = newPenalty;
		return true;
	}

	function buyback(uint256 amount) public canSell {
		require(sellPrice>0, "sellPrice==0");
		uint256 decimalAmount = amount.mul(uint(10)**decimals); // convert the full token value to the smallest unit possible.
		require(balances[msg.sender].sub(decimalAmount) >= getLockedTokens_(msg.sender), "NSF"); // Don't allow to sell locked tokens.
		balances[msg.sender] = balances[msg.sender].sub(decimalAmount);
		// Amount is considered to be how many full tokens the user wants to sell.
		uint256 totalCost = amount.mul(sellPrice); // sellPrice is the per-full-token value.
		minimumRequiredBalance = minimumRequiredBalance.add(totalCost);
		require(address(this).balance >= minimumRequiredBalance, "NSF"); // The contract must have enough funds to cover the selling.
		balances[owner] = balances[owner].add(decimalAmount); // Put these tokens back into the available pile.
		withdrawableBalances[msg.sender] = withdrawableBalances[msg.sender].add(totalCost); // Pay the seller for their tokens.
		emit Transfer(msg.sender, owner, decimalAmount); // Notify exchanges of the sell.
	}

	function fundContract() public onlyOwnerOrOracle payable { // For the owner to put funds into the contract.
	}

	function setSellPrice(uint256 thePrice) public onlyManyOwners(keccak256(msg.data)) returns (bool) {
		sellPrice = thePrice;
		emit SetSellPrice(thePrice);
		return true;
	}

	function setAllowedToBuyBack(bool value) public onlyManyOwners(keccak256(msg.data)) {
		allowedToBuyBack = value;
		emit ChangedAllowedToBuyBack(value);
	}

	function setAllowedToPurchase(bool value) public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		allowedToPurchase = value;
		emit ChangedAllowedToPurchase(value);
		return true;
	}

	function createGroup(
		string memory groupName, uint256 startEpoch, uint256 phase1endEpoch, uint256 phase2endEpoch, uint256 deadlineEpoch,
		uint256 unlockAfterEpoch, uint256 phase2weiCap, uint256 phase3weiCap, uint256 hardWeiCap, uint256 ratio) public
	onlyManyOwners(keccak256(msg.data)) returns (bool success, uint256 createdGroupNumber) {
		require(nextGroupNumber < maxGroups, "Too many groups");
		createdGroupNumber = nextGroupNumber;
		Group storage theGroup = groups[createdGroupNumber];
		theGroup.name = groupName;
		theGroup.startTime = startEpoch;
		theGroup.phase1endTime = phase1endEpoch;
		theGroup.phase2endTime = phase2endEpoch;
		theGroup.deadline = deadlineEpoch;
		theGroup.unlockTime = unlockAfterEpoch;
		theGroup.max2 = phase2weiCap;
		theGroup.max3 = phase3weiCap;
		theGroup.cap = hardWeiCap;
		theGroup.ratio = ratio;
		nextGroupNumber++;
		success = true;
	}

	function getGroup(uint256 groupNumber) public view returns(string memory groupName, string memory status, uint256 phase2cap,
	uint256 phase3cap, uint256 cap, uint256 ratio, uint256 startTime, uint256 phase1endTime, uint256 phase2endTime, uint256 deadline,
	uint256 weiTotal) {
		require(groupNumber < nextGroupNumber, "OOR");
		Group storage theGroup = groups[groupNumber];
		groupName = theGroup.name;
		GroupStates state = getGroupState(groupNumber);
		status = (state == GroupStates.none)? "none"
		:(state == GroupStates.distributing)? "distributing"
		:(state == GroupStates.distributed)? "distributed":"unlocked";
		phase2cap = theGroup.max2;
		phase3cap = theGroup.max3;
		cap = theGroup.cap;
		ratio = theGroup.ratio;
		startTime = theGroup.startTime;
		phase1endTime = theGroup.phase1endTime;
		phase2endTime = theGroup.phase2endTime;
		deadline = theGroup.deadline;
		weiTotal = theGroup.weiTotal;
	}

	function getGroupUnlockTime(uint256 groupNumber) public view returns(uint256) {
		require(groupNumber < nextGroupNumber, "OOR");
		Group storage theGroup = groups[groupNumber];
		return theGroup.unlockTime;
	}

	function getHowMuchUntilHardCap_(uint256 groupNumber) internal view returns(uint256) {
		Group storage theGroup = groups[groupNumber];
		if (theGroup.weiTotal > theGroup.cap) { // calling .sub in this situation will throw.
			return 0;
		}
		return theGroup.cap.sub(theGroup.weiTotal);
	}

	function getHowMuchUntilHardCap() public view returns(uint256) {
		return getHowMuchUntilHardCap_(openGroupNumber);
	}

	function addMemberToGroup(address walletAddress, uint256 groupNumber) public onlyOwner returns(bool) {
		emit AddToGroup(walletAddress, groupNumber);
		return true;
	}

	function instructOracleToDistribute(uint256 groupNumber) public onlyOwnerOrOracle returns(bool) {
		require(groupNumber < nextGroupNumber && getGroupState(groupNumber) < GroupStates.distributed, "Dist");
		emit WantsToDistribute(groupNumber);
		return true;
	}

	function distributeCallback(uint256 groupNumber, uint256 howMany) public onlyManyOwnersOrOracle(keccak256(msg.data)) returns (bool success) {
		Group storage theGroup = groups[groupNumber];
		GroupStates state = getGroupState(groupNumber);
		require(state < GroupStates.distributed, "Dist");
		if (state != GroupStates.distributing) {
			theGroup.state = GroupStates.distributing;
		}
		uint256 n = theGroup.addresses.length;
		uint256 nextDistributionIndex = theGroup.nextDistributionIndex;
		uint256 exclusiveEndIndex = nextDistributionIndex + howMany;
		if (exclusiveEndIndex > n) {
			exclusiveEndIndex = n;
		}
		uint256 newOwnerSupply = balances[owner];
		for (uint256 i = nextDistributionIndex; i < exclusiveEndIndex; i++) {
			address theAddress = theGroup.addresses[i];
			uint256 balance = getUndistributedBalanceOf_(theAddress, groupNumber);
			if (balance > 0) { // No need to waste ticks if they have no tokens to distribute
				balances[theAddress] = balances[theAddress].add(balance);
				newOwnerSupply = newOwnerSupply.sub(balance); // Update the available number of tokens.
				emit Transfer(owner, theAddress, balance); // Notify exchanges of the distribution.
			}
		}
		balances[owner] = newOwnerSupply;
		if (exclusiveEndIndex < n) {
			emit DistributedBatch(groupNumber, howMany);
		} else { // We've finished distributing people
			// However, signalDoneDistributing needs to be manually called since it's multisig. So if we're calling this function from multiple owners then calling signalDoneDistributing from here won't work.
			emit ShouldCallDoneDistributing();
		}
		theGroup.nextDistributionIndex = exclusiveEndIndex; // Usually not necessary if we've finished distribution,
		// but if we don't update this, getHowManyLeftToDistribute will never show 0.
		return true;
	}

	function getHowManyLeftToDistribute(uint256 groupNumber) public view returns(uint256 remainder) {
		Group storage theGroup = groups[groupNumber];
		return theGroup.addresses.length - theGroup.nextDistributionIndex;
	}

	function unlock(uint256 groupNumber) public onlyManyOwners(keccak256(msg.data)) returns (bool success) {
		Group storage theGroup = groups[groupNumber];
		require(getGroupState(groupNumber) == GroupStates.distributed, "Undist"); // Distribution must have occurred first.
		require(theGroup.unlockTime == 0, "Unlocktime");
		// If the group has set an explicit unlock time, the admins cannot force an unlock and the unlock will happen automatically.
		theGroup.state = GroupStates.unlocked;
		return true;
	}

	function liftGlobalLock() public onlyManyOwners(keccak256(msg.data)) returns(bool) {
		transferLock = false;
		emit ChangedTransferLock(transferLock);
		return true;
	}

	function airdrop( address[] memory addresses, uint256[] memory tokenDecimalAmounts) public onlyManyOwnersOrOracle(keccak256(msg.data))
	returns (bool) {
		uint256 n = addresses.length;
		require(n == tokenDecimalAmounts.length, "Length");
		uint256 newOwnerBalance = balances[owner];
		for (uint256 i = 0; i < n; i++) {
			address theAddress = addresses[i];
			uint256 airdropAmount = tokenDecimalAmounts[i];
			if (airdropAmount > 0) {
				uint256 currentBalance = balances[theAddress];
				balances[theAddress] = currentBalance.add(airdropAmount);
				newOwnerBalance = newOwnerBalance.sub(airdropAmount);
				emit Transfer(owner, theAddress, airdropAmount);
			}
		}
		balances[owner] = newOwnerBalance;
		emit AirdroppedBatch(addresses);
		return true;
	}

	function transfer(address _to, uint256 _value) public canTransfer returns (bool success) {
		// If the transferrer has purchased tokens, they must be unlocked before they can be used.
		require(balances[msg.sender].sub(_value) >= getLockedTokens_(msg.sender), "Not enough tokens");
		return super.transfer(_to, _value);
	}

	function transferFrom(address _from, address _to, uint256 _value) public canTransfer returns (bool success) {
		// If the transferrer has purchased tokens, they must be unlocked before they can be used.
		require(balances[_from].sub(_value) >= getLockedTokens_(_from), "Not enough tokens");
		return super.transferFrom(_from, _to, _value);
	}

	function setOpenGroup(uint256 groupNumber) public onlyManyOwners(keccak256(msg.data)) returns (bool) {
		require(groupNumber < nextGroupNumber, "OOR");
		openGroupNumber = groupNumber;
		return true;
	}

	function getGroupState(uint256 groupNumber) public view returns(GroupStates) {
		require(groupNumber < nextGroupNumber, "out of range"); // Must have created at least one group.
		Group storage theGroup = groups[groupNumber];
		if (theGroup.state < GroupStates.distributed)
			return theGroup.state;
		// Here, we have two cases.
		// If this is a time-based group, tokens will only unlock after a certain time. Otherwise, we depend on the group's state being set to unlock.
		if (block.timestamp < theGroup.unlockTime)
			return GroupStates.distributed;
		else if (theGroup.unlockTime > 0) // Here, blocktime exceeds the group unlock time, and we've set an unlock time explicitly
			return GroupStates.unlocked;
		return theGroup.state;
	}

	function getLockedTokensInGroup_(address walletAddress, uint256 groupNumber) internal view returns (uint256 balance) {
		Member storage theMember = members[walletAddress];
		if (getGroupState(groupNumber) == GroupStates.unlocked) {
			return 0;
		}
		return theMember.weiBalance[groupNumber].mul(groups[groupNumber].ratio);
	}

	function getLockedTokens_(address walletAddress) internal view returns(uint256 balance) {
		uint256[] storage memberGroups = members[walletAddress].groups;
		uint256 n = memberGroups.length;
		for (uint256 i = 0; i < n; i++) {
			balance = balance.add(getLockedTokensInGroup_(walletAddress, memberGroups[i]));
		}
		return balance;
	}

	function getLockedTokens(address walletAddress) public view returns(uint256 balance) {
		return getLockedTokens_(walletAddress);
	}

	function getUndistributedBalanceOf_(address walletAddress, uint256 groupNumber) internal view returns (uint256 balance) {
		Member storage theMember = members[walletAddress];
		Group storage theGroup = groups[groupNumber];
		if (getGroupState(groupNumber) > GroupStates.distributing) {
			return 0;
		}
		return theMember.weiBalance[groupNumber].mul(theGroup.ratio);
	}

	function getUndistributedBalanceOf(address walletAddress, uint256 groupNumber) public view returns (uint256 balance) {
		return getUndistributedBalanceOf_(walletAddress, groupNumber);
	}

	function checkMyUndistributedBalance(uint256 groupNumber) public view returns (uint256 balance) {
		return getUndistributedBalanceOf_(msg.sender, groupNumber);
	}
	
	function burn(uint256 amount) public onlyManyOwners(keccak256(msg.data)) {
		balances[owner] = balances[owner].sub(amount);
		totalSupply_ = totalSupply_.sub(amount);
		emit Transfer(owner, address(0), amount);
	}
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"signalDoneDistributing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"penalty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"},{"name":"addresses","type":"address[]"},{"name":"weiAmounts","type":"uint256[]"}],"name":"purchaseCallbackOnAccept","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"checkMyUndistributedBalance","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"setOpenGroup","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"setOwnerAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"getGroupUnlockTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"instructOracleToDistribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowedToPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newPenalty","type":"uint256"}],"name":"setPenalty","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"setOracleAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"amIOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"walletAddress","type":"address"},{"name":"groupNumber","type":"uint256"}],"name":"getUndistributedBalanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"walletAddress","type":"address"},{"name":"groupNumber","type":"uint256"}],"name":"addMemberToGroup","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"unlock","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getHowMuchUntilHardCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"purchase","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[]"},{"name":"tokenDecimalAmounts","type":"uint256[]"}],"name":"airdrop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"walletAddress","type":"address"}],"name":"getLockedTokens","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openGroupNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"liftGlobalLock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferLock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"swapTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_multiOwnedRequired","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"buyback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"gweiPrice","type":"uint256"}],"name":"setMaximumGasPrice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minimumRequiredBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"},{"name":"addresses","type":"address[]"},{"name":"weiAmounts","type":"uint256[]"}],"name":"insertAndApprove","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowedToBuyBack","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setAllowedToBuyBack","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getWithdrawableAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"getGroupState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"getHowManyLeftToDistribute","outputs":[{"name":"remainder","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"fundContract","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addresses","type":"address[]"},{"name":"weiAmounts","type":"uint256[]"}],"name":"refund","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"groupNumber","type":"uint256"}],"name":"getGroup","outputs":[{"name":"groupName","type":"string"},{"name":"status","type":"string"},{"name":"phase2cap","type":"uint256"},{"name":"phase3cap","type":"uint256"},{"name":"cap","type":"uint256"},{"name":"ratio","type":"uint256"},{"name":"startTime","type":"uint256"},{"name":"phase1endTime","type":"uint256"},{"name":"phase2endTime","type":"uint256"},{"name":"deadline","type":"uint256"},{"name":"weiTotal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"removeOracleAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"oldSprkAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"},{"name":"howMany","type":"uint256"}],"name":"distributeCallback","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"drain","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setAllowedToPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"groupName","type":"string"},{"name":"startEpoch","type":"uint256"},{"name":"phase1endEpoch","type":"uint256"},{"name":"phase2endEpoch","type":"uint256"},{"name":"deadlineEpoch","type":"uint256"},{"name":"unlockAfterEpoch","type":"uint256"},{"name":"phase2weiCap","type":"uint256"},{"name":"phase3weiCap","type":"uint256"},{"name":"hardWeiCap","type":"uint256"},{"name":"ratio","type":"uint256"}],"name":"createGroup","outputs":[{"name":"success","type":"bool"},{"name":"createdGroupNumber","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"thePrice","type":"uint256"}],"name":"setSellPrice","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"groupNumber","type":"uint256"},{"name":"addresses","type":"address[]"},{"name":"weiAmounts","type":"uint256[]"}],"name":"callbackInsertApproveAndDistribute","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"walletAddress","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"groupNumber","type":"uint256"},{"indexed":false,"name":"inPhase1","type":"bool"}],"name":"WantsToPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"},{"indexed":false,"name":"addresses","type":"address[]"}],"name":"PurchasedCallbackOnAccept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"}],"name":"WantsToDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"},{"indexed":false,"name":"remainder","type":"uint256"}],"name":"NearingHardCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"}],"name":"ReachedHardCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"}],"name":"DistributeDone","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"groupNumber","type":"uint256"},{"indexed":false,"name":"howMany","type":"uint256"}],"name":"DistributedBatch","type":"event"},{"anonymous":false,"inputs":[],"name":"ShouldCallDoneDistributing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addresses","type":"address[]"}],"name":"AirdroppedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addresses","type":"address[]"}],"name":"RefundedBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"walletAddress","type":"address"},{"indexed":false,"name":"groupNumber","type":"uint256"}],"name":"AddToGroup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"transferLock","type":"bool"}],"name":"ChangedTransferLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"allowedToPurchase","type":"bool"}],"name":"ChangedAllowedToPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"allowedToBuyBack","type":"bool"}],"name":"ChangedAllowedToBuyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sellPrice","type":"uint256"}],"name":"SetSellPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"FinalConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60e060405273cdf06e2f49f7445098cfa54f52c7f43ee40fa0166080908152730d2b5b40f88ccb05e011509830c2e5003d73fe9260a05273363d591196d3004ca708db2049501440718594f560c0526200005f90610108906003620005e0565b5061010a8054600160a81b61ffff0219600160a01b60ff02199091167401000000000000000000000000000000000000000017169055348015620000a257600080fd5b50610108805480602002602001604051908101604052809291908181526020018280548015620000fc57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620000dd575b50505050506002815160008111801562000117575060fa8111155b6200018357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e756d4f776e657273204f4f5200000000000000000000000000000000000000604482015290519081900360640190fd5b818351600082118015620001975750808211155b6200020357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f526571204f4f5200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b8451600455600384905560005b8551811015620003315760008682815181106200022957fe5b60200260200101519050806001600160a01b031660006001600160a01b03161415801562000265575062000263816200052760201b60201c565b155b620002d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f4578697374730000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000620002e7836001016200054560201b60201c565b9050816005826101008110620002f957fe5b0180546001600160a01b0319166001600160a01b03928316179055919091166000908152610105602052604090205560010162000210565b50620003426200056360201b60201c565b505050505062000358336200052760201b60201c565b620003c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f4e614f0000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61011780546001600160a01b031990811673971d048e737619884f2df75e31c7eb64123923281790915561010a8054909116331790556040805180820190915260098082527f537061726b7374657200000000000000000000000000000000000000000000006020909201918252620004419161010b9162000646565b5061010d805460ff191660121790556040805180820190915260048082527f5350524b000000000000000000000000000000000000000000000000000000006020909201918252620004979161010c9162000646565b506409502f900061010f5561010d546319ed92c090600090620004ce90839060ff16600a0a620005b1602090811b620055fa17901c565b60018190553360008181526020818152604080832085905580518581529051949550929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a350506200070e565b6001600160a01b031660009081526101056020526040902054151590565b6000811580159062000558575060fa8211155b6200055f57fe5b5090565b6000600454116200057057fe5b60fa60045411156200057e57fe5b6005546001600160a01b0316156200059257fe5b60035415801590620005a8575060045460035411155b620005af57fe5b565b600082620005c257506000620005da565b5081810281838281620005d157fe5b0414620005da57fe5b92915050565b82805482825590600052602060002090810192821562000638579160200282015b828111156200063857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000601565b506200055f929150620006c7565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200068957805160ff1916838001178555620006b9565b82800160010185558215620006b9579182015b82811115620006b95782518255916020019190600101906200069c565b506200055f929150620006f1565b620006ee91905b808211156200055f5780546001600160a01b0319168155600101620006ce565b90565b620006ee91905b808211156200055f5760008155600101620006f8565b615973806200071e6000396000f3fe6080604052600436106104105760003560e01c80637241f5ff1161021e578063b75c7dc611610123578063db74fb37116100ab578063ed9ca4ff1161007a578063ed9ca4ff14611407578063f00d4b5d14611433578063f323ff761461146e578063fc6634b91461156b578063fed8a53b1461159557610410565b8063db74fb3714611354578063dbd2ac6014611369578063dd62ed3e14611399578063ece53132146113d457610410565b8063c2cf7326116100f2578063c2cf73261461115c578063c41a360a14611195578063ceb60654146111bf578063d73dd62314611306578063d98b43f71461133f57610410565b8063b75c7dc614610fd0578063ba51a6df14610ffa578063bd097e2114611024578063c091c4351461102c57610410565b80638c2a5938116101a6578063a0e67e2b11610175578063a0e67e2b14610ea5578063a1ae1dfb14610f0a578063a89ae4ba14610f58578063a9059cbb14610f6d578063b499a26f14610fa657610410565b80638c2a593814610e1e5780638da5cb5b14610e4a57806390be10cc14610e7b57806395d89b4114610e9057610410565b806379a9fa1c116101ed57806379a9fa1c14610c6957806379c8fe3014610c935780637a42ee7114610cbd57806381edc30814610cd25780638a4db4fa14610e0957610410565b80637241f5ff14610c1557806373124ced14610c2a57806373d0022414610c3f578063787d64e414610c5457610410565b80634123cb6b116103245780636198e339116102ac578063672434821161027b5780636724348214610a375780636b2d95d414610b675780636d991cce14610b9a5780637065cb4814610baf57806370a0823114610be257610410565b80636198e339146109b757806361c2c9c0146109e157806364edfbf0146109f657806366188463146109fe57610410565b80634b750334116102f35780634b750334146108e85780634c69c00f146108fd5780634e4ab830146109305780634fc28f6814610945578063530e35431461097e57610410565b80634123cb6b1461086a57806342966c681461087f57806348e4e297146108a95780634a4b674a146108be57610410565b80632caeb8fc116103a7578063331a6bf511610376578063331a6bf5146107b957806336fba8a8146107ec5780633ccfd60b146108165780633de39c111461082b5780633ebb2d6b1461084057610410565b80632caeb8fc146107075780632f54bf6e14610731578063304a87b714610764578063313ce5671461078e57610410565b8063173825d9116103e3578063173825d91461054557806318160ddd14610578578063215b54111461058d57806323b872dd146106c457610410565b806306fdde031461041b578063095ea7b3146104a55780630d4891ad146104f25780630edd2ffc1461051e575b6104186116cc565b50005b34801561042757600080fd5b50610430611b85565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046a578181015183820152602001610452565b50505050905090810190601f1680156104975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b157600080fd5b506104de600480360360408110156104c857600080fd5b506001600160a01b038135169060200135611c14565b604080519115158252519081900360200190f35b3480156104fe57600080fd5b5061051c6004803603602081101561051557600080fd5b5035611c7b565b005b34801561052a57600080fd5b50610533611d15565b60408051918252519081900360200190f35b34801561055157600080fd5b5061051c6004803603602081101561056857600080fd5b50356001600160a01b0316611d1c565b34801561058457600080fd5b50610533611f14565b34801561059957600080fd5b506104de600480360360608110156105b057600080fd5b81359190810190604081016020820135600160201b8111156105d157600080fd5b8201836020820111156105e357600080fd5b803590602001918460208302840111600160201b8311171561060457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065357600080fd5b82018360208201111561066557600080fd5b803590602001918460208302840111600160201b8311171561068657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611f1a945050505050565b3480156106d057600080fd5b506104de600480360360608110156106e757600080fd5b506001600160a01b03813581169160208101359091169060400135611f75565b34801561071357600080fd5b506105336004803603602081101561072a57600080fd5b5035612065565b34801561073d57600080fd5b506104de6004803603602081101561075457600080fd5b50356001600160a01b0316612079565b34801561077057600080fd5b506104de6004803603602081101561078757600080fd5b5035612097565b34801561079a57600080fd5b506107a361211a565b6040805160ff9092168252519081900360200190f35b3480156107c557600080fd5b506104de600480360360208110156107dc57600080fd5b50356001600160a01b0316612124565b3480156107f857600080fd5b506105336004803603602081101561080f57600080fd5b50356122a5565b34801561082257600080fd5b506104de612301565b34801561083757600080fd5b506105336123af565b34801561084c57600080fd5b506104de6004803603602081101561086357600080fd5b50356123b6565b34801561087657600080fd5b506105336124b7565b34801561088b57600080fd5b5061051c600480360360208110156108a257600080fd5b50356124bd565b3480156108b557600080fd5b506104de612580565b3480156108ca57600080fd5b506104de600480360360208110156108e157600080fd5b5035612591565b3480156108f457600080fd5b506105336125cb565b34801561090957600080fd5b506104de6004803603602081101561092057600080fd5b50356001600160a01b03166125d2565b34801561093c57600080fd5b506104de612629565b34801561095157600080fd5b506105336004803603604081101561096857600080fd5b506001600160a01b03813516906020013561267a565b34801561098a57600080fd5b506104de600480360360408110156109a157600080fd5b506001600160a01b03813516906020013561268d565b3480156109c357600080fd5b506104de600480360360208110156109da57600080fd5b5035612725565b3480156109ed57600080fd5b50610533612818565b6104de6116cc565b348015610a0a57600080fd5b506104de60048036036040811015610a2157600080fd5b506001600160a01b03813516906020013561282b565b348015610a4357600080fd5b506104de60048036036040811015610a5a57600080fd5b810190602081018135600160201b811115610a7457600080fd5b820183602082011115610a8657600080fd5b803590602001918460208302840111600160201b83111715610aa757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610af657600080fd5b820183602082011115610b0857600080fd5b803590602001918460208302840111600160201b83111715610b2957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061291b945050505050565b348015610b7357600080fd5b5061053360048036036020811015610b8a57600080fd5b50356001600160a01b0316612b3a565b348015610ba657600080fd5b50610533612b45565b348015610bbb57600080fd5b5061051c60048036036020811015610bd257600080fd5b50356001600160a01b0316612b4c565b348015610bee57600080fd5b5061053360048036036020811015610c0557600080fd5b50356001600160a01b0316612ce0565b348015610c2157600080fd5b506104de612cfb565b348015610c3657600080fd5b506104de612d92565b348015610c4b57600080fd5b506104de612da3565b348015610c6057600080fd5b5061053361301e565b348015610c7557600080fd5b5061051c60048036036020811015610c8c57600080fd5b5035613024565b348015610c9f57600080fd5b506104de60048036036020811015610cb657600080fd5b50356132ab565b348015610cc957600080fd5b506105336132fb565b348015610cde57600080fd5b506104de60048036036060811015610cf557600080fd5b81359190810190604081016020820135600160201b811115610d1657600080fd5b820183602082011115610d2857600080fd5b803590602001918460208302840111600160201b83111715610d4957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d9857600080fd5b820183602082011115610daa57600080fd5b803590602001918460208302840111600160201b83111715610dcb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613302945050505050565b348015610e1557600080fd5b506104de61346b565b348015610e2a57600080fd5b5061051c60048036036020811015610e4157600080fd5b5035151561347c565b348015610e5657600080fd5b50610e5f613502565b604080516001600160a01b039092168252519081900360200190f35b348015610e8757600080fd5b50610533613512565b348015610e9c57600080fd5b50610430613526565b348015610eb157600080fd5b50610eba613582565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ef6578181015183820152602001610ede565b505050509050019250505060405180910390f35b348015610f1657600080fd5b50610f3460048036036020811015610f2d57600080fd5b50356135fc565b60405180826003811115610f4457fe5b60ff16815260200191505060405180910390f35b348015610f6457600080fd5b50610e5f6136be565b348015610f7957600080fd5b506104de60048036036040811015610f9057600080fd5b506001600160a01b0381351690602001356136ce565b348015610fb257600080fd5b5061053360048036036020811015610fc957600080fd5b50356137ac565b348015610fdc57600080fd5b5061051c60048036036020811015610ff357600080fd5b50356137ca565b34801561100657600080fd5b5061051c6004803603602081101561101d57600080fd5b5035613927565b61051c6139f0565b34801561103857600080fd5b506104de6004803603604081101561104f57600080fd5b810190602081018135600160201b81111561106957600080fd5b82018360208201111561107b57600080fd5b803590602001918460208302840111600160201b8311171561109c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156110eb57600080fd5b8201836020820111156110fd57600080fd5b803590602001918460208302840111600160201b8311171561111e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613a51945050505050565b34801561116857600080fd5b506104de6004803603604081101561117f57600080fd5b50803590602001356001600160a01b0316613c61565b3480156111a157600080fd5b50610e5f600480360360208110156111b857600080fd5b5035613d20565b3480156111cb57600080fd5b506111e9600480360360208110156111e257600080fd5b5035613d44565b6040518080602001806020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183810383528e818151815260200191508051906020019080838360005b83811015611260578181015183820152602001611248565b50505050905090810190601f16801561128d5780820380516001836020036101000a031916815260200191505b5083810382528d5181528d516020918201918f019080838360005b838110156112c05781810151838201526020016112a8565b50505050905090810190601f1680156112ed5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b34801561131257600080fd5b506104de6004803603604081101561132957600080fd5b506001600160a01b038135169060200135613f82565b34801561134b57600080fd5b506104de61401b565b34801561136057600080fd5b50610e5f61407d565b34801561137557600080fd5b506104de6004803603604081101561138c57600080fd5b5080359060200135614095565b3480156113a557600080fd5b50610533600480360360408110156113bc57600080fd5b506001600160a01b0381358116916020013516614317565b3480156113e057600080fd5b506104de600480360360208110156113f757600080fd5b50356001600160a01b0316614342565b34801561141357600080fd5b506104de6004803603602081101561142a57600080fd5b5035151561440e565b34801561143f57600080fd5b5061051c6004803603604081101561145657600080fd5b506001600160a01b038135811691602001351661449a565b34801561147a57600080fd5b50611550600480360361014081101561149257600080fd5b810190602081018135600160201b8111156114ac57600080fd5b8201836020820111156114be57600080fd5b803590602001918460018302840111600160201b831117156114df57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906101000135614633565b60408051921515835260208301919091528051918290030190f35b34801561157757600080fd5b506104de6004803603602081101561158e57600080fd5b5035614754565b3480156115a157600080fd5b506104de600480360360608110156115b857600080fd5b81359190810190604081016020820135600160201b8111156115d957600080fd5b8201836020820111156115eb57600080fd5b803590602001918460208302840111600160201b8311171561160c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561165b57600080fd5b82018360208201111561166d57600080fd5b803590602001918460208302840111600160201b8311171561168e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506147c5945050505050565b61010a54600090600160b01b900460ff166117215760408051600160e51b62461bcd02815260206004820152600a6024820152600160b21b69111a5cd85b1b1bddd95902604482015290519081900360640190fd5b33600090815261011460209081526040808320610113548452610115909252909120600381015461179c5760408051600160e51b62461bcd02815260206004820152600f60248201527f4e6f7420696e697469616c697a65640000000000000000000000000000000000604482015290519081900360640190fd5b6005810154429081108015906117b6575081600801548111155b6117f35760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b6000825460ff16600381111561180557fe5b146118455760408051600160e51b62461bcd0281526020600482015260056024820152600160d81b64537461746502604482015290519081900360640190fd5b61010f543a111561188f5760408051600160e51b62461bcd0281526020600482015260096024820152600160b81b6847617320707269636502604482015290519081900360640190fd5b3467016345785d8a00008110156118f05760408051600160e51b62461bcd02815260206004820152601060248201527f416d6f756e743c302e3120657468657200000000000000000000000000000000604482015290519081900360640190fd5b600b830154600090611908908363ffffffff614b7916565b905083600c01548111156119665760408051600160e51b62461bcd02815260206004820152600c60248201527f4361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b61011354600090815260208690526040812054611989908463ffffffff614b7916565b33600090815260018701602052604090205490915060ff16611a0057600e85018054600181810183556000928352602080842090920180546001600160a01b031916339081179091558352808801825260408320805460ff1916821790556101135489820180549283018155845291909220909101555b84600601548411611a65576101135460408051338152602081018690528082019290925260016060830152517fdd26f741705a89a641bf9670936db6583982b27ad123d2e52c16f52501e643149181900360800190a160019650505050505050611b82565b84600701548411611b26578460090154811115611acc5760408051600160e51b62461bcd02815260206004820152601360248201527f5068617365322063617020657863656564656400000000000000000000000000604482015290519081900360640190fd5b6101135460408051338152602081018690528082019290925260006060830152517fdd26f741705a89a641bf9670936db6583982b27ad123d2e52c16f52501e643149181900360800190a160019650505050505050611b82565b84600a0154811115611acc5760408051600160e51b62461bcd02815260206004820152601360248201527f5068617365332063617020657863656564656400000000000000000000000000604482015290519081900360640190fd5b90565b61010b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081565b3360008181526002602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6000366040518083838082843780830192505050925050506040518091039020611ca481614b86565b80611cba5750610109546001600160a01b031633145b15611d115760008281526101156020908152604091829020805460ff191660021781558251858152925190927f29c357a5c8d0a88d3bec7f98eadbf69c499098b797af76665f424431f4dbf0e192908290030190a1505b5050565b61010e5481565b80611d2681612079565b611d665760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b600160045403600081118015611d7d575060fa8111155b611dc45760408051600160e51b62461bcd02815260206004820152600d6024820152600160991b6c273ab6a7bbb732b9399027a7a902604482015290519081900360640190fd5b600354600160045403600082118015611ddd5750808211155b611e1e5760408051600160e51b62461bcd0281526020600482015260076024820152600160c91b662932b89027a7a902604482015290519081900360640190fd5b6000366040518083838082843780830192505050925050506040518091039020611e4781614b86565b15611f0c57611e54614d70565b611e5c614db7565b6001600160a01b03861660009081526101056020526040812054611e7f90614e84565b905060006005826101008110611e9157fe5b0180546001600160a01b0319166001600160a01b03928316179055871660009081526101056020526040812055611ec6614e9c565b611ece614d70565b604080516001600160a01b038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a1505b505050505050565b60015490565b600080366040518083838082843780830192505050925050506040518091039020611f4481614b86565b80611f5a5750610109546001600160a01b031633145b15611f6d57611f6a85858561501f565b91505b509392505050565b6000611f8033612079565b611fd35761010a54600160a01b900460ff1615611fd35760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65131bd8dad95902604482015290519081900360640190fd5b611fdc846152b8565b6001600160a01b038516600090815260208190526040902054612005908463ffffffff61532216565b10156120525760408051600160e51b62461bcd0281526020600482015260116024820152600160781b704e6f7420656e6f75676820746f6b656e7302604482015290519081900360640190fd5b61205d848484615334565b949350505050565b6000612071338361553e565b90505b919050565b6001600160a01b031660009081526101056020526040902054151590565b6000803660405180838380828437808301925050509250505060405180910390206120c181614b86565b15612114576101105483106121095760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b610113839055600191505b50919050565b61010d5460ff1681565b60008036604051808383808284378083019250505092505050604051809103902061214e81614b86565b15612114576001600160a01b03831661219d5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63125b9d9b02604482015290519081900360640190fd5b61010a546001600160a01b03848116911614156121f05760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b61010a546001600160a01b03908116600090815260208190526040808220549286168252902054612227908263ffffffff614b7916565b6001600160a01b038086166000818152602081815260408083209590955561010a805485168352858320929092559054845186815294519294931692600080516020615928833981519152929081900390910190a35061010a80546001600160a01b0385166001600160a01b03199091161790556001915050919050565b60006101105482106122ea5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b506000908152610115602052604090206004015490565b3360009081526101166020526040812054806123505760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b336000908152610116602052604081205561011254612375908263ffffffff61532216565b61011255604051339082156108fc029083906000818181858888f193505050501580156123a6573d6000803e3d6000fd5b50600191505090565b61010f5481565b60006123c133612079565b806123d75750610109546001600160a01b031633145b6124175760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b610110548210801561243c5750600261242f836135fc565b600381111561243a57fe5b105b61247c5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63111a5cdd02604482015290519081900360640190fd5b6040805183815290517f802eff881699fa025d411df3fd011f381e2a10e9e6ef38c35b8c76e146966fbe9181900360200190a1506001919050565b60045481565b60003660405180838380828437808301925050509250505060405180910390206124e681614b86565b15611d115761010a546001600160a01b0316600090815260208190526040902054612517908363ffffffff61532216565b61010a546001600160a01b0316600090815260208190526040902055600154612546908363ffffffff61532216565b60015561010a546040805184815290516000926001600160a01b031691600080516020615928833981519152919081900360200190a35050565b61010a54600160b01b900460ff1681565b6000803660405180838380828437808301925050509250505060405180910390206125bb81614b86565b1561211457505061010e55600190565b6101115481565b6000803660405180838380828437808301925050509250505060405180910390206125fc81614b86565b156121145761010980546001600160a01b0385166001600160a01b03199091161790556001915050919050565b600061263433612079565b6126745760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b50600190565b6000612686838361553e565b9392505050565b600061269833612079565b6126d85760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b604080516001600160a01b03851681526020810184905281517ff9951fbb46b09e4116221a0fdbd49ff3f8ec4ee8e893e45327e063235ad07183929181900390910190a150600192915050565b60008036604051808383808284378083019250505092505050604051809103902061274f81614b86565b1561211457600083815261011560205260409020600261276e856135fc565b600381111561277957fe5b146127ba5760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65155b991a5cdd02604482015290519081900360640190fd5b6004810154156128045760408051600160e51b62461bcd02815260206004820152600a6024820152600160b01b69556e6c6f636b74696d6502604482015290519081900360640190fd5b805460ff1916600317905550600192915050565b6000612826610113546155b8565b905090565b3360009081526002602090815260408083206001600160a01b038616845290915281205480831115612880573360009081526002602090815260408083206001600160a01b03881684529091528120556128b5565b612890818463ffffffff61532216565b3360009081526002602090815260408083206001600160a01b03891684529091529020555b3360008181526002602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b60008036604051808383808284378083019250505092505050604051809103902061294581614b86565b8061295b5750610109546001600160a01b031633145b15612b33578351835181146129a65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b61010a546001600160a01b0316600090815260208190526040812054905b82811015612a9a5760008782815181106129da57fe5b6020026020010151905060008783815181106129f257fe5b602002602001015190506000811115612a90576001600160a01b038216600090815260208190526040902054612a2e818363ffffffff614b7916565b6001600160a01b038416600090815260208190526040902055612a57858363ffffffff61532216565b61010a546040805185815290519297506001600160a01b03808716939216916000805160206159288339815191529181900360200190a3505b50506001016129c4565b5061010a546001600160a01b0316600090815260208181526040808320849055805182815289518184015289517f6bd09b018bf088558f7ca2a5f8ec81d0fa727ecf41a5eff5ca5420915509d374948b949293849390840192868201929102908190849084905b83811015612b19578181015183820152602001612b01565b505050509050019250505060405180910390a16001935050505b5092915050565b6000612071826152b8565b6101135481565b80612b5681612079565b15612b995760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b6724b99037bbb732b902604482015290519081900360640190fd5b600454600101600081118015612bb0575060fa8111155b612bf75760408051600160e51b62461bcd02815260206004820152600d6024820152600160991b6c273ab6a7bbb732b9399027a7a902604482015290519081900360640190fd5b6000366040518083838082843780830192505050925050506040518091039020612c2081614b86565b15612cda57612c2d614d70565b612c35614db7565b600480546001019081905584906005906101008110612c5057fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600454612c7b90614e84565b6001600160a01b03851660009081526101056020526040902055612c9d614d70565b604080516001600160a01b038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a15b50505050565b6001600160a01b031660009081526020819052604090205490565b600080366040518083838082843780830192505050925050506040518091039020612d2581614b86565b15612d8e5761010a805474ff000000000000000000000000000000000000000019169081905560408051600160a01b90920460ff1615158252517f7772b54b7aa3898aee10d476009b352b8b0542eaa2563ebd6a12d50d0edfacde9181900360200190a1600191505b5090565b61010a54600160a01b900460ff1681565b600033301415612de95760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b6101175460408051600160e11b636eb1769f02815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015612e3e57600080fd5b505afa158015612e52573d6000803e3d6000fd5b505050506040513d6020811015612e6857600080fd5b5051905080612eb05760408051600160e51b62461bcd0281526020600482015260096024820152600160bc1b680416d6f756e743d3d302604482015290519081900360640190fd5b33600090815260208190526040902054612ed0908263ffffffff614b7916565b336000908152602081905260408082209290925561010a546001600160a01b031681522054612f05908263ffffffff61532216565b61010a546001600160a01b0390811660009081526020818152604080832094909455610117548451600160e01b6323b872dd0281523360048201523060248201526044810187905294519316936323b872dd9360648083019491928390030190829087803b158015612f7657600080fd5b505af1158015612f8a573d6000803e3d6000fd5b505050506040513d6020811015612fa057600080fd5b5051612fe45760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b672a3930b739b332b902604482015290519081900360640190fd5b61010a5460408051838152905133926001600160a01b031691600080516020615928833981519152919081900360200190a3600191505090565b60035481565b61010a54600160a81b900460ff166130725760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b6511195b9a595902604482015290519081900360640190fd5b600061011154116130cd5760408051600160e51b62461bcd02815260206004820152600c60248201527f73656c6c50726963653d3d300000000000000000000000000000000000000000604482015290519081900360640190fd5b61010d546000906130eb90839060ff16600a0a63ffffffff6155fa16565b90506130f6336152b8565b33600090815260208190526040902054613116908363ffffffff61532216565b10156131555760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b33600090815260208190526040902054613175908263ffffffff61532216565b336000908152602081905260408120919091556101115461319d90849063ffffffff6155fa16565b610112549091506131b4908263ffffffff614b7916565b610112819055303110156131fb5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b61010a546001600160a01b0316600090815260208190526040902054613227908363ffffffff614b7916565b61010a546001600160a01b03166000908152602081815260408083209390935533825261011690522054613261908263ffffffff614b7916565b33600081815261011660209081526040918290209390935561010a54815186815291516001600160a01b0390911693600080516020615928833981519152928290030190a3505050565b6000803660405180838380828437808301925050509250505060405180910390206132d581614b86565b15612114576132ee83633b9aca0063ffffffff6155fa16565b61010f5550600192915050565b6101125481565b60008036604051808383808284378083019250505092505050604051809103902061332c81614b86565b806133425750610109546001600160a01b031633145b15611f6d5783518351811461338d5760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600086815261011560205260408120905b828110156134545760008782815181106133b457fe5b6020908102919091018101516001600160a01b03811660009081526001860190925260409091205490915060ff1661344b57600e83018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b038616908117909155835280860182526040808420805460ff1916831790556101148352832081018054918201815583529120018990555b5060010161339e565b5061346087878761501f565b979650505050505050565b61010a54600160a81b900460ff1681565b60003660405180838380828437808301925050509250505060405180910390206134a581614b86565b15611d115761010a8054831515600160a81b8102600160a81b60ff02199092169190911790915560408051918252517f7005e1991959ce579ccf48eb6da4e420123f4f7bdfdb6c0796738d6c3f432f0b9181900360200190a15050565b61010a546001600160a01b031681565b336000908152610116602052604090205490565b61010c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c0c5780601f10611be157610100808354040283529160200191611c0c565b6060806004546040519080825280602002602001820160405280156135b1578160200160208202803883390190505b50905060005b6004548110156135f6576135ca81613d20565b8282815181106135d657fe5b6001600160a01b03909216602092830291909101909101526001016135b7565b50905090565b60006101105482106136585760408051600160e51b62461bcd02815260206004820152600c60248201527f6f7574206f662072616e67650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000828152610115602052604090206002815460ff16600381111561367957fe5b101561368a575460ff169050612074565b80600401544210156136a0576002915050612074565b6004810154156136b4576003915050612074565b5460ff1692915050565b610109546001600160a01b031681565b60006136d933612079565b61372c5761010a54600160a01b900460ff161561372c5760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65131bd8dad95902604482015290519081900360640190fd5b613735336152b8565b33600090815260208190526040902054613755908463ffffffff61532216565b10156137a25760408051600160e51b62461bcd0281526020600482015260116024820152600160781b704e6f7420656e6f75676820746f6b656e7302604482015290519081900360640190fd5b612686838361561f565b600090815261011560205260409020600d810154600e909101540390565b806137d481615757565b6138145760408051600160e51b62461bcd02815260206004808301919091526024820152600160e41b6304e6f4f702604482015290519081900360640190fd5b61381d33612079565b61385d5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b60006138683361576c565b60008481526101066020526040902060018101549192509082166138c25760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b6138cb8461579b565b8054600190810182558101805483900390556138e68461579b565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b8060045460008211801561393b5750808211155b61397c5760408051600160e51b62461bcd0281526020600482015260076024820152600160c91b662932b89027a7a902604482015290519081900360640190fd5b60003660405180838380828437808301925050509250505060405180910390206139a581614b86565b15612cda5760038490556139b7614db7565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b6139f933612079565b80613a0f5750610109546001600160a01b031633145b613a4f5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b565b600080366040518083838082843780830192505050925050506040518091039020613a7b81614b86565b15612b3357835183518114613ac65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b61010e546000805b83811015613b82576000878281518110613ae457fe5b602002602001015190506000898381518110613afc57fe5b6020026020010151905081851015613b7857613b1e828663ffffffff61532216565b9150613b30848363ffffffff614b7916565b6001600160a01b03821660009081526101166020526040902054909450613b5d908363ffffffff614b7916565b6001600160a01b038216600090815261011660205260409020555b5050600101613ace565b5061011254810130311015613bca5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b61011254613bde908263ffffffff614b7916565b6101125560408051602080825289518183015289517f3953e3f71784c01be5e0ad95d36e2fa536d6d0cc98205ed234665f2efcf0812e938b9392839291830191818601910280838360005b83811015613c41578181015183820152602001613c29565b505050509050019250505060405180910390a15060019695505050505050565b600082613c6d81615757565b613cad5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e41b6304e6f4f702604482015290519081900360640190fd5b82613cb781612079565b613cf75760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b613d008461576c565b600086815261010660205260409020600101541615159250505092915050565b60006005826001016101008110613d3357fe5b01546001600160a01b031692915050565b6060806000806000806000806000806000610110548c10613d985760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b60008c815261011560209081526040918290206002808201805485516001821615610100026000190190911692909204601f810185900485028301850190955284825291939092830182828015613e305780601f10613e0557610100808354040283529160200191613e30565b820191906000526020600020905b815481529060010190602001808311613e1357829003601f168201915b50505050509b506000613e428e6135fc565b90506000816003811115613e5257fe5b14613f0f576001816003811115613e6557fe5b14613ed3576002816003811115613e7857fe5b14613ea657604051806040016040528060088152602001600160c21b671d5b9b1bd8dad95902815250613ece565b6040518060400160405280600b8152602001600160aa1b6a191a5cdd1c9a589d5d1959028152505b613f0a565b6040518060400160405280600c81526020017f646973747269627574696e6700000000000000000000000000000000000000008152505b613f30565b604051806040016040528060048152602001600160e01b636e6f6e65028152505b9b5081600901549a5081600a0154995081600c01549850816003015497508160050154965081600601549550816007015494508160080154935081600b01549250505091939597999b90929496989a50565b3360009081526002602090815260408083206001600160a01b0386168452909152812054613fb6908363ffffffff614b7916565b3360008181526002602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600061402633612079565b6140665760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b5061010980546001600160a01b0319169055600190565b73971d048e737619884f2df75e31c7eb641239232881565b6000803660405180838380828437808301925050509250505060405180910390206140bf81614b86565b806140d55750610109546001600160a01b031633145b15612b3357600084815261011560205260408120906140f3866135fc565b9050600281600381111561410357fe5b106141445760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63111a5cdd02604482015290519081900360640190fd5b600181600381111561415257fe5b1461416357815460ff191660011782555b600e820154600d8301548681018281111561417b5750815b61010a546001600160a01b0316600090815260208190526040902054825b8281101561426e57600087600e0182815481106141b257fe5b60009182526020822001546001600160a01b031691506141d2828e61553e565b90508015614264576001600160a01b038216600090815260208190526040902054614203908263ffffffff614b7916565b6001600160a01b03831660009081526020819052604090205561422c848263ffffffff61532216565b61010a546040805184815290519296506001600160a01b03808616939216916000805160206159288339815191529181900360200190a35b5050600101614199565b5061010a546001600160a01b03166000908152602081905260409020819055838210156142d557604080518b8152602081018b905281517f49cfca8b5cce4cc1899d604dbced372d90766b107abaea147572edc4bfe22e4b929181900390910190a16142ff565b6040517f5ea8897d32f4d9ee2c11a418eb215f204a46e99a419872d709590495e5eca0ff90600090a15b50600d90940193909355506001935050505092915050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60008036604051808383808284378083019250505092505050604051809103902061436c81614b86565b15612114576101125460009061438a9030319063ffffffff61532216565b9050600081116143cd5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015614403573d6000803e3d6000fd5b506001949350505050565b60008036604051808383808284378083019250505092505050604051809103902061443881614b86565b156121145761010a8054841515600160b01b8102600160b01b60ff02199092169190911790915560408051918252517faacaf402900fc42a1b9c12f73a8e872a8126b1559c6cc680d43e9c5e4053c3669181900360200190a150600192915050565b816144a481612079565b6144e45760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b816144ee81612079565b156145315760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b6724b99037bbb732b902604482015290519081900360640190fd5b600036604051808383808284378083019250505092505050604051809103902061455a81614b86565b1561462c57614567614d70565b61456f614db7565b6001600160a01b0385166000908152610105602052604081205461459290614e84565b90508460058261010081106145a357fe5b0180546001600160a01b0319166001600160a01b03928316179055868116600090815261010560205260408082208290559187168152208190556145e5614d70565b604080516001600160a01b0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a1505b5050505050565b600080600036604051808383808284378083019250505092505050604051809103902061465f81614b86565b1561474457610110546064116146bf5760408051600160e51b62461bcd02815260206004820152600f60248201527f546f6f206d616e792067726f7570730000000000000000000000000000000000604482015290519081900360640190fd5b6101105491506000610115600084815260200190815260200160002090508d8160020190805190602001906146f5929190615850565b50600581018d9055600681018c9055600781018b9055600881018a90556004810189905560098101889055600a8101879055600c81018690556003018490556101108054600190810190915592505b509a509a98505050505050505050565b60008036604051808383808284378083019250505092505050604051809103902061477e81614b86565b15612114576101118390556040805184815290517f4f8fd36d4a96a6788f79219d2123cd26eca1eab40a43278fab6b1dca64f883cf9181900360200190a150600192915050565b6000803660405180838380828437808301925050509250505060405180910390206147ef81614b86565b806148055750610109546001600160a01b031633145b15611f6d578351835181146148505760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600361485b876135fc565b600381111561486657fe5b14156148aa5760408051600160e51b62461bcd0281526020600482015260086024820152600160c21b67155b9b1bd8dad95902604482015290519081900360640190fd5b60008681526101156020908152604080832061010a546001600160a01b031684529183905282205490915b83811015614aa65760008882815181106148eb57fe5b6020026020010151905060006101146000836001600160a01b03166001600160a01b031681526020019081526020016000209050600089848151811061492d57fe5b6020026020010151905061495f818360000160008f815260200190815260200160002054614b7990919063ffffffff16565b60008d815260208481526040808320939093556001600160a01b0386168252600189019052205460ff166149eb57600e86018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b0388169081179091558352808901825260408320805460ff1916821790558481018054918201815583529120018c90555b6000614a048760030154836155fa90919063ffffffff16565b90508015614a96576001600160a01b038416600090815260208190526040902054614a35908263ffffffff614b7916565b6001600160a01b038516600090815260208190526040902055614a5e868263ffffffff61532216565b61010a546040805184815290519298506001600160a01b03808816939216916000805160206159288339815191529181900360200190a35b5050600190920191506148d59050565b5061010a546001600160a01b031660009081526020818152604080832084905580518b81528083018281528b51928201929092528a517f534eb4590ac348de6e66b31074d03cf96af9a0fab73aa98716c575e44f0b93db948d948d949260608501928683019291909102908190849084905b83811015614b30578181015183820152602001614b18565b50505050905001935050505060405180910390a16002614b4f896135fc565b6003811115614b5a57fe5b14614b6b57815460ff191660021782555b506001979650505050505050565b81810182811015611c7557fe5b6000614b9133612079565b614bd15760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b610107546102001415614be657614be6614db7565b600082815261010660205260409020614bfe83615757565b614c505760035481556000600180830191909155610107805491614c24919083016158ca565b6002820181905561010780548592908110614c3b57fe5b600091825260209091200155614c508361579b565b6000614c5b3361576c565b90508082600101541660001415614d69578154614c7457fe5b815460011415614d12576000848152610106602052604090206002015461010780549091908110614ca157fe5b60009182526020808320909101829055858252610106815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a1600192505050612074565b815460001901825560018201805482179055614d2d8461579b565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15b5050919050565b600060045411614d7c57fe5b60fa6004541115614d8957fe5b6005546001600160a01b031615614d9c57fe5b60035415801590614db1575060045460035411155b613a4f57fe5b614dc033612079565b614e005760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b6101075460005b81811015614e73576101078181548110614e1d57fe5b60009182526020909120015415614e6b5761010660006101078381548110614e4157fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101614e07565b50614e8161010760006158f3565b50565b60008115801590614e96575060fa8211155b612d8e57fe5b6004546001905b80821015615019575b8082108015614ed4575060006005836101008110614ec657fe5b01546001600160a01b031614155b15614ee457600190910190614eac565b600181118015614f0c575060006005826101008110614eff57fe5b01546001600160a01b0316145b15614f1a5760001901614ee4565b8082108015614f42575060006005826101008110614f3457fe5b01546001600160a01b031614155b8015614f66575060006005836101008110614f5957fe5b01546001600160a01b0316145b15615014576005816101008110614f7957fe5b01546001600160a01b03166005836101008110614f9257fe5b0180546001600160a01b0319166001600160a01b03929092169190911790558161010560006005836101008110614fc557fe5b01546001600160a01b0316815260208101919091526040016000908120919091556005826101008110614ff457fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b614ea3565b60045550565b600061502a33612079565b806150405750610109546001600160a01b031633145b6150805760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b8251825181146150c65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600085815261011560205260408120600b81015490915b8381101561518c57600061011460008984815181106150f857fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209050600087838151811061513057fe5b6020026020010151905061514d8185614b7990919063ffffffff16565b60008b81526020849052604090205490945061516f908263ffffffff614b7916565b60008b8152602093909352604090922091909155506001016150dd565b50600b820181905568056bc75e2d631000006151a7886155b8565b1161522e577f37230adc97de8473c3f7d8283beb37b23ba4f1237f08f8190a62b04e45218b70876151d7896155b8565b6040805192835260208301919091528051918290030190a181600c0154811061522e576040805188815290517f2097ed8c6ffdfed9e01ab18c5682eca607d3f4e1657d4abf32a51ea341782c699181900360200190a15b7f534eb4590ac348de6e66b31074d03cf96af9a0fab73aa98716c575e44f0b93db87876040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561529757818101518382015260200161527f565b50505050905001935050505060405180910390a15060019695505050505050565b6001600160a01b0381166000908152610114602052604081206001018054825b8181101561531a57615310615303868584815481106152f357fe5b90600052602060002001546157e4565b859063ffffffff614b7916565b93506001016152d8565b505050919050565b60008282111561532e57fe5b50900390565b60006001600160a01b0383166153805760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63125b9d9b02604482015290519081900360640190fd5b6001600160a01b0384166000908152602081905260409020548211156153d95760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b6001600160a01b03841660009081526002602090815260408083203384529091529020548211156154455760408051600160e51b62461bcd02815260206004820152600b6024820152600160a81b6a4e46416c6c6f77616e636502604482015290519081900360640190fd5b6001600160a01b03841660009081526020819052604090205461546e908363ffffffff61532216565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546154a3908363ffffffff614b7916565b6001600160a01b038085166000908152602081815260408083209490945591871681526002825282812033825290915220546154e5908363ffffffff61532216565b6001600160a01b0380861660008181526002602090815260408083203384528252918290209490945580518681529051928716939192600080516020615928833981519152929181900390910190a35060019392505050565b6001600160a01b03821660009081526101146020908152604080832084845261011590925282206001615570856135fc565b600381111561557b57fe5b111561558c57600092505050611c75565b60038101546000858152602084905260409020546155af9163ffffffff6155fa16565b95945050505050565b600081815261011560205260408120600c810154600b82015411156155e1576000915050612074565b600b810154600c8201546126869163ffffffff61532216565b60008261560957506000611c75565b508181028183828161561757fe5b0414611c7557fe5b60006001600160a01b03831661566b5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b336000908152602081905260409020548211156156bb5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b336000908152602081905260409020546156db908363ffffffff61532216565b33600090815260208190526040808220929092556001600160a01b0385168152205461570d908363ffffffff614b7916565b6001600160a01b038416600081815260208181526040918290209390935580518581529051919233926000805160206159288339815191529281900390910190a350600192915050565b60009081526101066020526040902054151590565b6001600160a01b03811660009081526101056020526040812054819061579190614e84565b60020a9392505050565b60008181526101066020526040902080546157b257fe5b816101078260020154815481106157c557fe5b9060005260206000200154146157d757fe5b60035481541115611d1157fe5b6001600160a01b0382166000908152610114602052604081206003615808846135fc565b600381111561581357fe5b1415615823576000915050611c75565b60008381526101156020908152604080832060030154918490529091205461205d9163ffffffff6155fa16565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061589157805160ff19168380011785556158be565b828001600101855582156158be579182015b828111156158be5782518255916020019190600101906158a3565b50612d8e92915061590d565b8154818355818111156158ee576000838152602090206158ee91810190830161590d565b505050565b5080546000825590600052602060002090810190614e8191905b611b8291905b80821115612d8e576000815560010161591356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820c3f1647d323e0cffef354e1b554cc7886ebd04e3ad3f4085375d6cb2486ddcdc0029

Deployed Bytecode

0x6080604052600436106104105760003560e01c80637241f5ff1161021e578063b75c7dc611610123578063db74fb37116100ab578063ed9ca4ff1161007a578063ed9ca4ff14611407578063f00d4b5d14611433578063f323ff761461146e578063fc6634b91461156b578063fed8a53b1461159557610410565b8063db74fb3714611354578063dbd2ac6014611369578063dd62ed3e14611399578063ece53132146113d457610410565b8063c2cf7326116100f2578063c2cf73261461115c578063c41a360a14611195578063ceb60654146111bf578063d73dd62314611306578063d98b43f71461133f57610410565b8063b75c7dc614610fd0578063ba51a6df14610ffa578063bd097e2114611024578063c091c4351461102c57610410565b80638c2a5938116101a6578063a0e67e2b11610175578063a0e67e2b14610ea5578063a1ae1dfb14610f0a578063a89ae4ba14610f58578063a9059cbb14610f6d578063b499a26f14610fa657610410565b80638c2a593814610e1e5780638da5cb5b14610e4a57806390be10cc14610e7b57806395d89b4114610e9057610410565b806379a9fa1c116101ed57806379a9fa1c14610c6957806379c8fe3014610c935780637a42ee7114610cbd57806381edc30814610cd25780638a4db4fa14610e0957610410565b80637241f5ff14610c1557806373124ced14610c2a57806373d0022414610c3f578063787d64e414610c5457610410565b80634123cb6b116103245780636198e339116102ac578063672434821161027b5780636724348214610a375780636b2d95d414610b675780636d991cce14610b9a5780637065cb4814610baf57806370a0823114610be257610410565b80636198e339146109b757806361c2c9c0146109e157806364edfbf0146109f657806366188463146109fe57610410565b80634b750334116102f35780634b750334146108e85780634c69c00f146108fd5780634e4ab830146109305780634fc28f6814610945578063530e35431461097e57610410565b80634123cb6b1461086a57806342966c681461087f57806348e4e297146108a95780634a4b674a146108be57610410565b80632caeb8fc116103a7578063331a6bf511610376578063331a6bf5146107b957806336fba8a8146107ec5780633ccfd60b146108165780633de39c111461082b5780633ebb2d6b1461084057610410565b80632caeb8fc146107075780632f54bf6e14610731578063304a87b714610764578063313ce5671461078e57610410565b8063173825d9116103e3578063173825d91461054557806318160ddd14610578578063215b54111461058d57806323b872dd146106c457610410565b806306fdde031461041b578063095ea7b3146104a55780630d4891ad146104f25780630edd2ffc1461051e575b6104186116cc565b50005b34801561042757600080fd5b50610430611b85565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046a578181015183820152602001610452565b50505050905090810190601f1680156104975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b157600080fd5b506104de600480360360408110156104c857600080fd5b506001600160a01b038135169060200135611c14565b604080519115158252519081900360200190f35b3480156104fe57600080fd5b5061051c6004803603602081101561051557600080fd5b5035611c7b565b005b34801561052a57600080fd5b50610533611d15565b60408051918252519081900360200190f35b34801561055157600080fd5b5061051c6004803603602081101561056857600080fd5b50356001600160a01b0316611d1c565b34801561058457600080fd5b50610533611f14565b34801561059957600080fd5b506104de600480360360608110156105b057600080fd5b81359190810190604081016020820135600160201b8111156105d157600080fd5b8201836020820111156105e357600080fd5b803590602001918460208302840111600160201b8311171561060457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065357600080fd5b82018360208201111561066557600080fd5b803590602001918460208302840111600160201b8311171561068657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611f1a945050505050565b3480156106d057600080fd5b506104de600480360360608110156106e757600080fd5b506001600160a01b03813581169160208101359091169060400135611f75565b34801561071357600080fd5b506105336004803603602081101561072a57600080fd5b5035612065565b34801561073d57600080fd5b506104de6004803603602081101561075457600080fd5b50356001600160a01b0316612079565b34801561077057600080fd5b506104de6004803603602081101561078757600080fd5b5035612097565b34801561079a57600080fd5b506107a361211a565b6040805160ff9092168252519081900360200190f35b3480156107c557600080fd5b506104de600480360360208110156107dc57600080fd5b50356001600160a01b0316612124565b3480156107f857600080fd5b506105336004803603602081101561080f57600080fd5b50356122a5565b34801561082257600080fd5b506104de612301565b34801561083757600080fd5b506105336123af565b34801561084c57600080fd5b506104de6004803603602081101561086357600080fd5b50356123b6565b34801561087657600080fd5b506105336124b7565b34801561088b57600080fd5b5061051c600480360360208110156108a257600080fd5b50356124bd565b3480156108b557600080fd5b506104de612580565b3480156108ca57600080fd5b506104de600480360360208110156108e157600080fd5b5035612591565b3480156108f457600080fd5b506105336125cb565b34801561090957600080fd5b506104de6004803603602081101561092057600080fd5b50356001600160a01b03166125d2565b34801561093c57600080fd5b506104de612629565b34801561095157600080fd5b506105336004803603604081101561096857600080fd5b506001600160a01b03813516906020013561267a565b34801561098a57600080fd5b506104de600480360360408110156109a157600080fd5b506001600160a01b03813516906020013561268d565b3480156109c357600080fd5b506104de600480360360208110156109da57600080fd5b5035612725565b3480156109ed57600080fd5b50610533612818565b6104de6116cc565b348015610a0a57600080fd5b506104de60048036036040811015610a2157600080fd5b506001600160a01b03813516906020013561282b565b348015610a4357600080fd5b506104de60048036036040811015610a5a57600080fd5b810190602081018135600160201b811115610a7457600080fd5b820183602082011115610a8657600080fd5b803590602001918460208302840111600160201b83111715610aa757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610af657600080fd5b820183602082011115610b0857600080fd5b803590602001918460208302840111600160201b83111715610b2957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061291b945050505050565b348015610b7357600080fd5b5061053360048036036020811015610b8a57600080fd5b50356001600160a01b0316612b3a565b348015610ba657600080fd5b50610533612b45565b348015610bbb57600080fd5b5061051c60048036036020811015610bd257600080fd5b50356001600160a01b0316612b4c565b348015610bee57600080fd5b5061053360048036036020811015610c0557600080fd5b50356001600160a01b0316612ce0565b348015610c2157600080fd5b506104de612cfb565b348015610c3657600080fd5b506104de612d92565b348015610c4b57600080fd5b506104de612da3565b348015610c6057600080fd5b5061053361301e565b348015610c7557600080fd5b5061051c60048036036020811015610c8c57600080fd5b5035613024565b348015610c9f57600080fd5b506104de60048036036020811015610cb657600080fd5b50356132ab565b348015610cc957600080fd5b506105336132fb565b348015610cde57600080fd5b506104de60048036036060811015610cf557600080fd5b81359190810190604081016020820135600160201b811115610d1657600080fd5b820183602082011115610d2857600080fd5b803590602001918460208302840111600160201b83111715610d4957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d9857600080fd5b820183602082011115610daa57600080fd5b803590602001918460208302840111600160201b83111715610dcb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613302945050505050565b348015610e1557600080fd5b506104de61346b565b348015610e2a57600080fd5b5061051c60048036036020811015610e4157600080fd5b5035151561347c565b348015610e5657600080fd5b50610e5f613502565b604080516001600160a01b039092168252519081900360200190f35b348015610e8757600080fd5b50610533613512565b348015610e9c57600080fd5b50610430613526565b348015610eb157600080fd5b50610eba613582565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ef6578181015183820152602001610ede565b505050509050019250505060405180910390f35b348015610f1657600080fd5b50610f3460048036036020811015610f2d57600080fd5b50356135fc565b60405180826003811115610f4457fe5b60ff16815260200191505060405180910390f35b348015610f6457600080fd5b50610e5f6136be565b348015610f7957600080fd5b506104de60048036036040811015610f9057600080fd5b506001600160a01b0381351690602001356136ce565b348015610fb257600080fd5b5061053360048036036020811015610fc957600080fd5b50356137ac565b348015610fdc57600080fd5b5061051c60048036036020811015610ff357600080fd5b50356137ca565b34801561100657600080fd5b5061051c6004803603602081101561101d57600080fd5b5035613927565b61051c6139f0565b34801561103857600080fd5b506104de6004803603604081101561104f57600080fd5b810190602081018135600160201b81111561106957600080fd5b82018360208201111561107b57600080fd5b803590602001918460208302840111600160201b8311171561109c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156110eb57600080fd5b8201836020820111156110fd57600080fd5b803590602001918460208302840111600160201b8311171561111e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613a51945050505050565b34801561116857600080fd5b506104de6004803603604081101561117f57600080fd5b50803590602001356001600160a01b0316613c61565b3480156111a157600080fd5b50610e5f600480360360208110156111b857600080fd5b5035613d20565b3480156111cb57600080fd5b506111e9600480360360208110156111e257600080fd5b5035613d44565b6040518080602001806020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183810383528e818151815260200191508051906020019080838360005b83811015611260578181015183820152602001611248565b50505050905090810190601f16801561128d5780820380516001836020036101000a031916815260200191505b5083810382528d5181528d516020918201918f019080838360005b838110156112c05781810151838201526020016112a8565b50505050905090810190601f1680156112ed5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390f35b34801561131257600080fd5b506104de6004803603604081101561132957600080fd5b506001600160a01b038135169060200135613f82565b34801561134b57600080fd5b506104de61401b565b34801561136057600080fd5b50610e5f61407d565b34801561137557600080fd5b506104de6004803603604081101561138c57600080fd5b5080359060200135614095565b3480156113a557600080fd5b50610533600480360360408110156113bc57600080fd5b506001600160a01b0381358116916020013516614317565b3480156113e057600080fd5b506104de600480360360208110156113f757600080fd5b50356001600160a01b0316614342565b34801561141357600080fd5b506104de6004803603602081101561142a57600080fd5b5035151561440e565b34801561143f57600080fd5b5061051c6004803603604081101561145657600080fd5b506001600160a01b038135811691602001351661449a565b34801561147a57600080fd5b50611550600480360361014081101561149257600080fd5b810190602081018135600160201b8111156114ac57600080fd5b8201836020820111156114be57600080fd5b803590602001918460018302840111600160201b831117156114df57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505082359350505060208101359060408101359060608101359060808101359060a08101359060c08101359060e0810135906101000135614633565b60408051921515835260208301919091528051918290030190f35b34801561157757600080fd5b506104de6004803603602081101561158e57600080fd5b5035614754565b3480156115a157600080fd5b506104de600480360360608110156115b857600080fd5b81359190810190604081016020820135600160201b8111156115d957600080fd5b8201836020820111156115eb57600080fd5b803590602001918460208302840111600160201b8311171561160c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561165b57600080fd5b82018360208201111561166d57600080fd5b803590602001918460208302840111600160201b8311171561168e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506147c5945050505050565b61010a54600090600160b01b900460ff166117215760408051600160e51b62461bcd02815260206004820152600a6024820152600160b21b69111a5cd85b1b1bddd95902604482015290519081900360640190fd5b33600090815261011460209081526040808320610113548452610115909252909120600381015461179c5760408051600160e51b62461bcd02815260206004820152600f60248201527f4e6f7420696e697469616c697a65640000000000000000000000000000000000604482015290519081900360640190fd5b6005810154429081108015906117b6575081600801548111155b6117f35760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b6000825460ff16600381111561180557fe5b146118455760408051600160e51b62461bcd0281526020600482015260056024820152600160d81b64537461746502604482015290519081900360640190fd5b61010f543a111561188f5760408051600160e51b62461bcd0281526020600482015260096024820152600160b81b6847617320707269636502604482015290519081900360640190fd5b3467016345785d8a00008110156118f05760408051600160e51b62461bcd02815260206004820152601060248201527f416d6f756e743c302e3120657468657200000000000000000000000000000000604482015290519081900360640190fd5b600b830154600090611908908363ffffffff614b7916565b905083600c01548111156119665760408051600160e51b62461bcd02815260206004820152600c60248201527f4361702065786365656465640000000000000000000000000000000000000000604482015290519081900360640190fd5b61011354600090815260208690526040812054611989908463ffffffff614b7916565b33600090815260018701602052604090205490915060ff16611a0057600e85018054600181810183556000928352602080842090920180546001600160a01b031916339081179091558352808801825260408320805460ff1916821790556101135489820180549283018155845291909220909101555b84600601548411611a65576101135460408051338152602081018690528082019290925260016060830152517fdd26f741705a89a641bf9670936db6583982b27ad123d2e52c16f52501e643149181900360800190a160019650505050505050611b82565b84600701548411611b26578460090154811115611acc5760408051600160e51b62461bcd02815260206004820152601360248201527f5068617365322063617020657863656564656400000000000000000000000000604482015290519081900360640190fd5b6101135460408051338152602081018690528082019290925260006060830152517fdd26f741705a89a641bf9670936db6583982b27ad123d2e52c16f52501e643149181900360800190a160019650505050505050611b82565b84600a0154811115611acc5760408051600160e51b62461bcd02815260206004820152601360248201527f5068617365332063617020657863656564656400000000000000000000000000604482015290519081900360640190fd5b90565b61010b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b505050505081565b3360008181526002602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6000366040518083838082843780830192505050925050506040518091039020611ca481614b86565b80611cba5750610109546001600160a01b031633145b15611d115760008281526101156020908152604091829020805460ff191660021781558251858152925190927f29c357a5c8d0a88d3bec7f98eadbf69c499098b797af76665f424431f4dbf0e192908290030190a1505b5050565b61010e5481565b80611d2681612079565b611d665760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b600160045403600081118015611d7d575060fa8111155b611dc45760408051600160e51b62461bcd02815260206004820152600d6024820152600160991b6c273ab6a7bbb732b9399027a7a902604482015290519081900360640190fd5b600354600160045403600082118015611ddd5750808211155b611e1e5760408051600160e51b62461bcd0281526020600482015260076024820152600160c91b662932b89027a7a902604482015290519081900360640190fd5b6000366040518083838082843780830192505050925050506040518091039020611e4781614b86565b15611f0c57611e54614d70565b611e5c614db7565b6001600160a01b03861660009081526101056020526040812054611e7f90614e84565b905060006005826101008110611e9157fe5b0180546001600160a01b0319166001600160a01b03928316179055871660009081526101056020526040812055611ec6614e9c565b611ece614d70565b604080516001600160a01b038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a1505b505050505050565b60015490565b600080366040518083838082843780830192505050925050506040518091039020611f4481614b86565b80611f5a5750610109546001600160a01b031633145b15611f6d57611f6a85858561501f565b91505b509392505050565b6000611f8033612079565b611fd35761010a54600160a01b900460ff1615611fd35760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65131bd8dad95902604482015290519081900360640190fd5b611fdc846152b8565b6001600160a01b038516600090815260208190526040902054612005908463ffffffff61532216565b10156120525760408051600160e51b62461bcd0281526020600482015260116024820152600160781b704e6f7420656e6f75676820746f6b656e7302604482015290519081900360640190fd5b61205d848484615334565b949350505050565b6000612071338361553e565b90505b919050565b6001600160a01b031660009081526101056020526040902054151590565b6000803660405180838380828437808301925050509250505060405180910390206120c181614b86565b15612114576101105483106121095760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b610113839055600191505b50919050565b61010d5460ff1681565b60008036604051808383808284378083019250505092505050604051809103902061214e81614b86565b15612114576001600160a01b03831661219d5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63125b9d9b02604482015290519081900360640190fd5b61010a546001600160a01b03848116911614156121f05760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b61010a546001600160a01b03908116600090815260208190526040808220549286168252902054612227908263ffffffff614b7916565b6001600160a01b038086166000818152602081815260408083209590955561010a805485168352858320929092559054845186815294519294931692600080516020615928833981519152929081900390910190a35061010a80546001600160a01b0385166001600160a01b03199091161790556001915050919050565b60006101105482106122ea5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b506000908152610115602052604090206004015490565b3360009081526101166020526040812054806123505760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b336000908152610116602052604081205561011254612375908263ffffffff61532216565b61011255604051339082156108fc029083906000818181858888f193505050501580156123a6573d6000803e3d6000fd5b50600191505090565b61010f5481565b60006123c133612079565b806123d75750610109546001600160a01b031633145b6124175760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b610110548210801561243c5750600261242f836135fc565b600381111561243a57fe5b105b61247c5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63111a5cdd02604482015290519081900360640190fd5b6040805183815290517f802eff881699fa025d411df3fd011f381e2a10e9e6ef38c35b8c76e146966fbe9181900360200190a1506001919050565b60045481565b60003660405180838380828437808301925050509250505060405180910390206124e681614b86565b15611d115761010a546001600160a01b0316600090815260208190526040902054612517908363ffffffff61532216565b61010a546001600160a01b0316600090815260208190526040902055600154612546908363ffffffff61532216565b60015561010a546040805184815290516000926001600160a01b031691600080516020615928833981519152919081900360200190a35050565b61010a54600160b01b900460ff1681565b6000803660405180838380828437808301925050509250505060405180910390206125bb81614b86565b1561211457505061010e55600190565b6101115481565b6000803660405180838380828437808301925050509250505060405180910390206125fc81614b86565b156121145761010980546001600160a01b0385166001600160a01b03199091161790556001915050919050565b600061263433612079565b6126745760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b50600190565b6000612686838361553e565b9392505050565b600061269833612079565b6126d85760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b604080516001600160a01b03851681526020810184905281517ff9951fbb46b09e4116221a0fdbd49ff3f8ec4ee8e893e45327e063235ad07183929181900390910190a150600192915050565b60008036604051808383808284378083019250505092505050604051809103902061274f81614b86565b1561211457600083815261011560205260409020600261276e856135fc565b600381111561277957fe5b146127ba5760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65155b991a5cdd02604482015290519081900360640190fd5b6004810154156128045760408051600160e51b62461bcd02815260206004820152600a6024820152600160b01b69556e6c6f636b74696d6502604482015290519081900360640190fd5b805460ff1916600317905550600192915050565b6000612826610113546155b8565b905090565b3360009081526002602090815260408083206001600160a01b038616845290915281205480831115612880573360009081526002602090815260408083206001600160a01b03881684529091528120556128b5565b612890818463ffffffff61532216565b3360009081526002602090815260408083206001600160a01b03891684529091529020555b3360008181526002602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b60008036604051808383808284378083019250505092505050604051809103902061294581614b86565b8061295b5750610109546001600160a01b031633145b15612b33578351835181146129a65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b61010a546001600160a01b0316600090815260208190526040812054905b82811015612a9a5760008782815181106129da57fe5b6020026020010151905060008783815181106129f257fe5b602002602001015190506000811115612a90576001600160a01b038216600090815260208190526040902054612a2e818363ffffffff614b7916565b6001600160a01b038416600090815260208190526040902055612a57858363ffffffff61532216565b61010a546040805185815290519297506001600160a01b03808716939216916000805160206159288339815191529181900360200190a3505b50506001016129c4565b5061010a546001600160a01b0316600090815260208181526040808320849055805182815289518184015289517f6bd09b018bf088558f7ca2a5f8ec81d0fa727ecf41a5eff5ca5420915509d374948b949293849390840192868201929102908190849084905b83811015612b19578181015183820152602001612b01565b505050509050019250505060405180910390a16001935050505b5092915050565b6000612071826152b8565b6101135481565b80612b5681612079565b15612b995760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b6724b99037bbb732b902604482015290519081900360640190fd5b600454600101600081118015612bb0575060fa8111155b612bf75760408051600160e51b62461bcd02815260206004820152600d6024820152600160991b6c273ab6a7bbb732b9399027a7a902604482015290519081900360640190fd5b6000366040518083838082843780830192505050925050506040518091039020612c2081614b86565b15612cda57612c2d614d70565b612c35614db7565b600480546001019081905584906005906101008110612c5057fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600454612c7b90614e84565b6001600160a01b03851660009081526101056020526040902055612c9d614d70565b604080516001600160a01b038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a15b50505050565b6001600160a01b031660009081526020819052604090205490565b600080366040518083838082843780830192505050925050506040518091039020612d2581614b86565b15612d8e5761010a805474ff000000000000000000000000000000000000000019169081905560408051600160a01b90920460ff1615158252517f7772b54b7aa3898aee10d476009b352b8b0542eaa2563ebd6a12d50d0edfacde9181900360200190a1600191505b5090565b61010a54600160a01b900460ff1681565b600033301415612de95760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b6101175460408051600160e11b636eb1769f02815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015612e3e57600080fd5b505afa158015612e52573d6000803e3d6000fd5b505050506040513d6020811015612e6857600080fd5b5051905080612eb05760408051600160e51b62461bcd0281526020600482015260096024820152600160bc1b680416d6f756e743d3d302604482015290519081900360640190fd5b33600090815260208190526040902054612ed0908263ffffffff614b7916565b336000908152602081905260408082209290925561010a546001600160a01b031681522054612f05908263ffffffff61532216565b61010a546001600160a01b0390811660009081526020818152604080832094909455610117548451600160e01b6323b872dd0281523360048201523060248201526044810187905294519316936323b872dd9360648083019491928390030190829087803b158015612f7657600080fd5b505af1158015612f8a573d6000803e3d6000fd5b505050506040513d6020811015612fa057600080fd5b5051612fe45760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b672a3930b739b332b902604482015290519081900360640190fd5b61010a5460408051838152905133926001600160a01b031691600080516020615928833981519152919081900360200190a3600191505090565b60035481565b61010a54600160a81b900460ff166130725760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b6511195b9a595902604482015290519081900360640190fd5b600061011154116130cd5760408051600160e51b62461bcd02815260206004820152600c60248201527f73656c6c50726963653d3d300000000000000000000000000000000000000000604482015290519081900360640190fd5b61010d546000906130eb90839060ff16600a0a63ffffffff6155fa16565b90506130f6336152b8565b33600090815260208190526040902054613116908363ffffffff61532216565b10156131555760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b33600090815260208190526040902054613175908263ffffffff61532216565b336000908152602081905260408120919091556101115461319d90849063ffffffff6155fa16565b610112549091506131b4908263ffffffff614b7916565b610112819055303110156131fb5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b61010a546001600160a01b0316600090815260208190526040902054613227908363ffffffff614b7916565b61010a546001600160a01b03166000908152602081815260408083209390935533825261011690522054613261908263ffffffff614b7916565b33600081815261011660209081526040918290209390935561010a54815186815291516001600160a01b0390911693600080516020615928833981519152928290030190a3505050565b6000803660405180838380828437808301925050509250505060405180910390206132d581614b86565b15612114576132ee83633b9aca0063ffffffff6155fa16565b61010f5550600192915050565b6101125481565b60008036604051808383808284378083019250505092505050604051809103902061332c81614b86565b806133425750610109546001600160a01b031633145b15611f6d5783518351811461338d5760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600086815261011560205260408120905b828110156134545760008782815181106133b457fe5b6020908102919091018101516001600160a01b03811660009081526001860190925260409091205490915060ff1661344b57600e83018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b038616908117909155835280860182526040808420805460ff1916831790556101148352832081018054918201815583529120018990555b5060010161339e565b5061346087878761501f565b979650505050505050565b61010a54600160a81b900460ff1681565b60003660405180838380828437808301925050509250505060405180910390206134a581614b86565b15611d115761010a8054831515600160a81b8102600160a81b60ff02199092169190911790915560408051918252517f7005e1991959ce579ccf48eb6da4e420123f4f7bdfdb6c0796738d6c3f432f0b9181900360200190a15050565b61010a546001600160a01b031681565b336000908152610116602052604090205490565b61010c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c0c5780601f10611be157610100808354040283529160200191611c0c565b6060806004546040519080825280602002602001820160405280156135b1578160200160208202803883390190505b50905060005b6004548110156135f6576135ca81613d20565b8282815181106135d657fe5b6001600160a01b03909216602092830291909101909101526001016135b7565b50905090565b60006101105482106136585760408051600160e51b62461bcd02815260206004820152600c60248201527f6f7574206f662072616e67650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000828152610115602052604090206002815460ff16600381111561367957fe5b101561368a575460ff169050612074565b80600401544210156136a0576002915050612074565b6004810154156136b4576003915050612074565b5460ff1692915050565b610109546001600160a01b031681565b60006136d933612079565b61372c5761010a54600160a01b900460ff161561372c5760408051600160e51b62461bcd0281526020600482015260066024820152600160d21b65131bd8dad95902604482015290519081900360640190fd5b613735336152b8565b33600090815260208190526040902054613755908463ffffffff61532216565b10156137a25760408051600160e51b62461bcd0281526020600482015260116024820152600160781b704e6f7420656e6f75676820746f6b656e7302604482015290519081900360640190fd5b612686838361561f565b600090815261011560205260409020600d810154600e909101540390565b806137d481615757565b6138145760408051600160e51b62461bcd02815260206004808301919091526024820152600160e41b6304e6f4f702604482015290519081900360640190fd5b61381d33612079565b61385d5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b60006138683361576c565b60008481526101066020526040902060018101549192509082166138c25760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b6138cb8461579b565b8054600190810182558101805483900390556138e68461579b565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b8060045460008211801561393b5750808211155b61397c5760408051600160e51b62461bcd0281526020600482015260076024820152600160c91b662932b89027a7a902604482015290519081900360640190fd5b60003660405180838380828437808301925050509250505060405180910390206139a581614b86565b15612cda5760038490556139b7614db7565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b6139f933612079565b80613a0f5750610109546001600160a01b031633145b613a4f5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b565b600080366040518083838082843780830192505050925050506040518091039020613a7b81614b86565b15612b3357835183518114613ac65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b61010e546000805b83811015613b82576000878281518110613ae457fe5b602002602001015190506000898381518110613afc57fe5b6020026020010151905081851015613b7857613b1e828663ffffffff61532216565b9150613b30848363ffffffff614b7916565b6001600160a01b03821660009081526101166020526040902054909450613b5d908363ffffffff614b7916565b6001600160a01b038216600090815261011660205260409020555b5050600101613ace565b5061011254810130311015613bca5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b61011254613bde908263ffffffff614b7916565b6101125560408051602080825289518183015289517f3953e3f71784c01be5e0ad95d36e2fa536d6d0cc98205ed234665f2efcf0812e938b9392839291830191818601910280838360005b83811015613c41578181015183820152602001613c29565b505050509050019250505060405180910390a15060019695505050505050565b600082613c6d81615757565b613cad5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e41b6304e6f4f702604482015290519081900360640190fd5b82613cb781612079565b613cf75760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b613d008461576c565b600086815261010660205260409020600101541615159250505092915050565b60006005826001016101008110613d3357fe5b01546001600160a01b031692915050565b6060806000806000806000806000806000610110548c10613d985760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b6227a7a902604482015290519081900360640190fd5b60008c815261011560209081526040918290206002808201805485516001821615610100026000190190911692909204601f810185900485028301850190955284825291939092830182828015613e305780601f10613e0557610100808354040283529160200191613e30565b820191906000526020600020905b815481529060010190602001808311613e1357829003601f168201915b50505050509b506000613e428e6135fc565b90506000816003811115613e5257fe5b14613f0f576001816003811115613e6557fe5b14613ed3576002816003811115613e7857fe5b14613ea657604051806040016040528060088152602001600160c21b671d5b9b1bd8dad95902815250613ece565b6040518060400160405280600b8152602001600160aa1b6a191a5cdd1c9a589d5d1959028152505b613f0a565b6040518060400160405280600c81526020017f646973747269627574696e6700000000000000000000000000000000000000008152505b613f30565b604051806040016040528060048152602001600160e01b636e6f6e65028152505b9b5081600901549a5081600a0154995081600c01549850816003015497508160050154965081600601549550816007015494508160080154935081600b01549250505091939597999b90929496989a50565b3360009081526002602090815260408083206001600160a01b0386168452909152812054613fb6908363ffffffff614b7916565b3360008181526002602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600061402633612079565b6140665760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b5061010980546001600160a01b0319169055600190565b73971d048e737619884f2df75e31c7eb641239232881565b6000803660405180838380828437808301925050509250505060405180910390206140bf81614b86565b806140d55750610109546001600160a01b031633145b15612b3357600084815261011560205260408120906140f3866135fc565b9050600281600381111561410357fe5b106141445760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63111a5cdd02604482015290519081900360640190fd5b600181600381111561415257fe5b1461416357815460ff191660011782555b600e820154600d8301548681018281111561417b5750815b61010a546001600160a01b0316600090815260208190526040902054825b8281101561426e57600087600e0182815481106141b257fe5b60009182526020822001546001600160a01b031691506141d2828e61553e565b90508015614264576001600160a01b038216600090815260208190526040902054614203908263ffffffff614b7916565b6001600160a01b03831660009081526020819052604090205561422c848263ffffffff61532216565b61010a546040805184815290519296506001600160a01b03808616939216916000805160206159288339815191529181900360200190a35b5050600101614199565b5061010a546001600160a01b03166000908152602081905260409020819055838210156142d557604080518b8152602081018b905281517f49cfca8b5cce4cc1899d604dbced372d90766b107abaea147572edc4bfe22e4b929181900390910190a16142ff565b6040517f5ea8897d32f4d9ee2c11a418eb215f204a46e99a419872d709590495e5eca0ff90600090a15b50600d90940193909355506001935050505092915050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60008036604051808383808284378083019250505092505050604051809103902061436c81614b86565b15612114576101125460009061438a9030319063ffffffff61532216565b9050600081116143cd5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015614403573d6000803e3d6000fd5b506001949350505050565b60008036604051808383808284378083019250505092505050604051809103902061443881614b86565b156121145761010a8054841515600160b01b8102600160b01b60ff02199092169190911790915560408051918252517faacaf402900fc42a1b9c12f73a8e872a8126b1559c6cc680d43e9c5e4053c3669181900360200190a150600192915050565b816144a481612079565b6144e45760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b816144ee81612079565b156145315760408051600160e51b62461bcd0281526020600482015260086024820152600160c11b6724b99037bbb732b902604482015290519081900360640190fd5b600036604051808383808284378083019250505092505050604051809103902061455a81614b86565b1561462c57614567614d70565b61456f614db7565b6001600160a01b0385166000908152610105602052604081205461459290614e84565b90508460058261010081106145a357fe5b0180546001600160a01b0319166001600160a01b03928316179055868116600090815261010560205260408082208290559187168152208190556145e5614d70565b604080516001600160a01b0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a1505b5050505050565b600080600036604051808383808284378083019250505092505050604051809103902061465f81614b86565b1561474457610110546064116146bf5760408051600160e51b62461bcd02815260206004820152600f60248201527f546f6f206d616e792067726f7570730000000000000000000000000000000000604482015290519081900360640190fd5b6101105491506000610115600084815260200190815260200160002090508d8160020190805190602001906146f5929190615850565b50600581018d9055600681018c9055600781018b9055600881018a90556004810189905560098101889055600a8101879055600c81018690556003018490556101108054600190810190915592505b509a509a98505050505050505050565b60008036604051808383808284378083019250505092505050604051809103902061477e81614b86565b15612114576101118390556040805184815290517f4f8fd36d4a96a6788f79219d2123cd26eca1eab40a43278fab6b1dca64f883cf9181900360200190a150600192915050565b6000803660405180838380828437808301925050509250505060405180910390206147ef81614b86565b806148055750610109546001600160a01b031633145b15611f6d578351835181146148505760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600361485b876135fc565b600381111561486657fe5b14156148aa5760408051600160e51b62461bcd0281526020600482015260086024820152600160c21b67155b9b1bd8dad95902604482015290519081900360640190fd5b60008681526101156020908152604080832061010a546001600160a01b031684529183905282205490915b83811015614aa65760008882815181106148eb57fe5b6020026020010151905060006101146000836001600160a01b03166001600160a01b031681526020019081526020016000209050600089848151811061492d57fe5b6020026020010151905061495f818360000160008f815260200190815260200160002054614b7990919063ffffffff16565b60008d815260208481526040808320939093556001600160a01b0386168252600189019052205460ff166149eb57600e86018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b0388169081179091558352808901825260408320805460ff1916821790558481018054918201815583529120018c90555b6000614a048760030154836155fa90919063ffffffff16565b90508015614a96576001600160a01b038416600090815260208190526040902054614a35908263ffffffff614b7916565b6001600160a01b038516600090815260208190526040902055614a5e868263ffffffff61532216565b61010a546040805184815290519298506001600160a01b03808816939216916000805160206159288339815191529181900360200190a35b5050600190920191506148d59050565b5061010a546001600160a01b031660009081526020818152604080832084905580518b81528083018281528b51928201929092528a517f534eb4590ac348de6e66b31074d03cf96af9a0fab73aa98716c575e44f0b93db948d948d949260608501928683019291909102908190849084905b83811015614b30578181015183820152602001614b18565b50505050905001935050505060405180910390a16002614b4f896135fc565b6003811115614b5a57fe5b14614b6b57815460ff191660021782555b506001979650505050505050565b81810182811015611c7557fe5b6000614b9133612079565b614bd15760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b610107546102001415614be657614be6614db7565b600082815261010660205260409020614bfe83615757565b614c505760035481556000600180830191909155610107805491614c24919083016158ca565b6002820181905561010780548592908110614c3b57fe5b600091825260209091200155614c508361579b565b6000614c5b3361576c565b90508082600101541660001415614d69578154614c7457fe5b815460011415614d12576000848152610106602052604090206002015461010780549091908110614ca157fe5b60009182526020808320909101829055858252610106815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a1600192505050612074565b815460001901825560018201805482179055614d2d8461579b565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15b5050919050565b600060045411614d7c57fe5b60fa6004541115614d8957fe5b6005546001600160a01b031615614d9c57fe5b60035415801590614db1575060045460035411155b613a4f57fe5b614dc033612079565b614e005760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b6101075460005b81811015614e73576101078181548110614e1d57fe5b60009182526020909120015415614e6b5761010660006101078381548110614e4157fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101614e07565b50614e8161010760006158f3565b50565b60008115801590614e96575060fa8211155b612d8e57fe5b6004546001905b80821015615019575b8082108015614ed4575060006005836101008110614ec657fe5b01546001600160a01b031614155b15614ee457600190910190614eac565b600181118015614f0c575060006005826101008110614eff57fe5b01546001600160a01b0316145b15614f1a5760001901614ee4565b8082108015614f42575060006005826101008110614f3457fe5b01546001600160a01b031614155b8015614f66575060006005836101008110614f5957fe5b01546001600160a01b0316145b15615014576005816101008110614f7957fe5b01546001600160a01b03166005836101008110614f9257fe5b0180546001600160a01b0319166001600160a01b03929092169190911790558161010560006005836101008110614fc557fe5b01546001600160a01b0316815260208101919091526040016000908120919091556005826101008110614ff457fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b614ea3565b60045550565b600061502a33612079565b806150405750610109546001600160a01b031633145b6150805760408051600160e51b62461bcd02815260206004808301919091526024820152600160e31b63082eae8d02604482015290519081900360640190fd5b8251825181146150c65760408051600160e51b62461bcd0281526020600482015260066024820152600160d31b65098cadccee8d02604482015290519081900360640190fd5b600085815261011560205260408120600b81015490915b8381101561518c57600061011460008984815181106150f857fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209050600087838151811061513057fe5b6020026020010151905061514d8185614b7990919063ffffffff16565b60008b81526020849052604090205490945061516f908263ffffffff614b7916565b60008b8152602093909352604090922091909155506001016150dd565b50600b820181905568056bc75e2d631000006151a7886155b8565b1161522e577f37230adc97de8473c3f7d8283beb37b23ba4f1237f08f8190a62b04e45218b70876151d7896155b8565b6040805192835260208301919091528051918290030190a181600c0154811061522e576040805188815290517f2097ed8c6ffdfed9e01ab18c5682eca607d3f4e1657d4abf32a51ea341782c699181900360200190a15b7f534eb4590ac348de6e66b31074d03cf96af9a0fab73aa98716c575e44f0b93db87876040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561529757818101518382015260200161527f565b50505050905001935050505060405180910390a15060019695505050505050565b6001600160a01b0381166000908152610114602052604081206001018054825b8181101561531a57615310615303868584815481106152f357fe5b90600052602060002001546157e4565b859063ffffffff614b7916565b93506001016152d8565b505050919050565b60008282111561532e57fe5b50900390565b60006001600160a01b0383166153805760408051600160e51b62461bcd02815260206004808301919091526024820152600160e21b63125b9d9b02604482015290519081900360640190fd5b6001600160a01b0384166000908152602081905260409020548211156153d95760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b6001600160a01b03841660009081526002602090815260408083203384529091529020548211156154455760408051600160e51b62461bcd02815260206004820152600b6024820152600160a81b6a4e46416c6c6f77616e636502604482015290519081900360640190fd5b6001600160a01b03841660009081526020819052604090205461546e908363ffffffff61532216565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546154a3908363ffffffff614b7916565b6001600160a01b038085166000908152602081815260408083209490945591871681526002825282812033825290915220546154e5908363ffffffff61532216565b6001600160a01b0380861660008181526002602090815260408083203384528252918290209490945580518681529051928716939192600080516020615928833981519152929181900390910190a35060019392505050565b6001600160a01b03821660009081526101146020908152604080832084845261011590925282206001615570856135fc565b600381111561557b57fe5b111561558c57600092505050611c75565b60038101546000858152602084905260409020546155af9163ffffffff6155fa16565b95945050505050565b600081815261011560205260408120600c810154600b82015411156155e1576000915050612074565b600b810154600c8201546126869163ffffffff61532216565b60008261560957506000611c75565b508181028183828161561757fe5b0414611c7557fe5b60006001600160a01b03831661566b5760408051600160e51b62461bcd02815260206004808301919091526024820152600160e11b6329b2b63302604482015290519081900360640190fd5b336000908152602081905260409020548211156156bb5760408051600160e51b62461bcd0281526020600482015260036024820152600160e91b622729a302604482015290519081900360640190fd5b336000908152602081905260409020546156db908363ffffffff61532216565b33600090815260208190526040808220929092556001600160a01b0385168152205461570d908363ffffffff614b7916565b6001600160a01b038416600081815260208181526040918290209390935580518581529051919233926000805160206159288339815191529281900390910190a350600192915050565b60009081526101066020526040902054151590565b6001600160a01b03811660009081526101056020526040812054819061579190614e84565b60020a9392505050565b60008181526101066020526040902080546157b257fe5b816101078260020154815481106157c557fe5b9060005260206000200154146157d757fe5b60035481541115611d1157fe5b6001600160a01b0382166000908152610114602052604081206003615808846135fc565b600381111561581357fe5b1415615823576000915050611c75565b60008381526101156020908152604080832060030154918490529091205461205d9163ffffffff6155fa16565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061589157805160ff19168380011785556158be565b828001600101855582156158be579182015b828111156158be5782518255916020019190600101906158a3565b50612d8e92915061590d565b8154818355818111156158ee576000838152602090206158ee91810190830161590d565b505050565b5080546000825590600052602060002090810190614e8191905b611b8291905b80821115612d8e576000815560010161591356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820c3f1647d323e0cffef354e1b554cc7886ebd04e3ad3f4085375d6cb2486ddcdc0029

Deployed Bytecode Sourcemap

21379:27889:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26768:10;:8;:10::i;:::-;;21379:27889;24220:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24220:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24220:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19133:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19133:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19133:185:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36928:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36928:240:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36928:240:0;;:::i;:::-;;24474:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24474:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;5651:588;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5651:588:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5651:588:0;-1:-1:-1;;;;;5651:588:0;;:::i;16035:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16035:82:0;;;:::i;31944:250::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31944:250:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31944:250:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31944:250:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31944:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31944:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31944:250:0;;;;;;;;-1:-1:-1;31944:250:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;31944:250:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31944:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31944:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31944:250:0;;-1:-1:-1;31944:250:0;;-1:-1:-1;;;;;31944:250:0:i;46164:346::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46164:346:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46164:346:0;;;;;;;;;;;;;;;;;:::i;48878:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48878:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48878:164:0;;:::i;7312:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7312:99:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7312:99:0;-1:-1:-1;;;;;7312:99:0;;:::i;46515:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46515:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46515:206:0;;:::i;24319:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24319:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28550:426;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28550:426:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28550:426:0;-1:-1:-1;;;;;28550:426:0;;:::i;41203:213::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41203:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41203:213:0;;:::i;35714:285::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35714:285:0;;;:::i;24500:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24500:26:0;;;:::i;42020:264::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42020:264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42020:264:0;;:::i;13433:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13433:26:0;;;:::i;49048:217::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49048:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49048:217:0;;:::i;24179:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24179:37:0;;;:::i;37459:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37459:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37459:143:0;;:::i;24620:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24620:24:0;;;:::i;28981:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28981:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28981:155:0;-1:-1:-1;;;;;28981:155:0;;:::i;7658:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7658:80:0;;;:::i;48685:188::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48685:188:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;48685:188:0;;;;;;;;:::i;41845:170::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41845:170:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41845:170:0;;;;;;;;:::i;44355:514::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44355:514:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44355:514:0;;:::i;41720:120::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41720:120:0;;;:::i;29463:2476::-;;;:::i;20955:415::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20955:415:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20955:415:0;;;;;;;;:::i;45051:777::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45051:777:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45051:777:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45051:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45051:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45051:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45051:777:0;;;;;;;;-1:-1:-1;45051:777:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;45051:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45051:777:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45051:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45051:777:0;;-1:-1:-1;45051:777:0;;-1:-1:-1;;;;;45051:777:0:i;48166:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48166:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48166:133:0;-1:-1:-1;;;;;48166:133:0;;:::i;24899:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24899:30:0;;;:::i;5142:380::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5142:380:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5142:380:0;-1:-1:-1;;;;;5142:380:0;;:::i;16806:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16806:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16806:98:0;-1:-1:-1;;;;;16806:98:0;;:::i;44874:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44874:172:0;;;:::i;24032:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24032:31:0;;;:::i;27476:1069::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27476:1069:0;;;:::i;13340:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13340:35:0;;;:::i;37607:1090::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37607:1090:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37607:1090:0;;:::i;29260:198::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29260:198:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29260:198:0;;:::i;24726:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24726:37:0;;;:::i;33338:619::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33338:619:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33338:619:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;33338:619:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33338:619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33338:619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33338:619:0;;;;;;;;-1:-1:-1;33338:619:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;33338:619:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33338:619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33338:619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33338:619:0;;-1:-1:-1;33338:619:0;;-1:-1:-1;;;;;33338:619:0:i;24139:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24139:36:0;;;:::i;38999:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38999:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38999:158:0;;;;:::i;23632:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23632:20:0;;;:::i;:::-;;;;-1:-1:-1;;;;;23632:20:0;;;;;;;;;;;;;;35598:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35598:111:0;;;:::i;24271:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24271:20:0;;;:::i;6958:216::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6958:216:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6958:216:0;;;;;;;;;;;;;;;;;46726:752;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46726:752:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46726:752:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23513:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23513:28:0;;;:::i;45833:326::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45833:326:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45833:326:0;;;;;;;;:::i;44130:220::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44130:220:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44130:220:0;;:::i;7880:514::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7880:514:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7880:514:0;;:::i;6412:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6412:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6412:265:0;;:::i;38702:111::-;;;:::i;36004:919::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36004:919:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36004:919:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;36004:919:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36004:919:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36004:919:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36004:919:0;;;;;;;;-1:-1:-1;36004:919:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;36004:919:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36004:919:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36004:919:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36004:919:0;;-1:-1:-1;36004:919:0;;-1:-1:-1;;;;;36004:919:0:i;8563:260::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8563:260:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8563:260:0;;;;;;-1:-1:-1;;;;;8563:260:0;;:::i;6781:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6781:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6781:109:0;;:::i;40269:929::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40269:929:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40269:929:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40269:929:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40269:929:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40269:929:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20221:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20221:284:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20221:284:0;;;;;;;;:::i;29141:114::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29141:114:0;;;:::i;23545:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23545:83:0;;;:::i;42289:1836::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42289:1836:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42289:1836:0;;;;;;;:::i;19633:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19633:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19633:143:0;;;;;;;;;;:::i;37173:281::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37173:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37173:281:0;-1:-1:-1;;;;;37173:281:0;;:::i;39162:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39162:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39162:191:0;;;;:::i;4590:432::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4590:432:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4590:432:0;;;;;;;;;;:::i;39358:906::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39358:906:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39358:906:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39358:906:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39358:906:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39358:906:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39358:906:0;;-1:-1:-1;;39358:906:0;;;-1:-1:-1;;;39358:906:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;38818:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38818:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38818:176:0;;:::i;33962:1631::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33962:1631:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33962:1631:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;33962:1631:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33962:1631:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33962:1631:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33962:1631:0;;;;;;;;-1:-1:-1;33962:1631:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;33962:1631:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33962:1631:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33962:1631:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33962:1631:0;;-1:-1:-1;33962:1631:0;;-1:-1:-1;;;;;33962:1631:0:i;29463:2476::-;26612:17;;29518:4;;-1:-1:-1;;;26612:17:0;;;;26604:40;;;;;-1:-1:-1;;;;;26604:40:0;;;;;;;;;;;;-1:-1:-1;;;;;26604:40:0;;;;;;;;;;;;;;;29567:10;29529:27;29559:19;;;:7;:19;;;;;;;;29616:15;;29609:23;;:6;:23;;;;;;29645:15;;;;29637:47;;;;;-1:-1:-1;;;;;29637:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29794:19;;;;29746:15;;29774:39;;;;;:81;;;29837:9;:18;;;29817:16;:38;;29774:81;29766:97;;;;;-1:-1:-1;;;;;29766:97:0;;;;;;;;;;;;-1:-1:-1;;;;;29766:97:0;;;;;;;;;;;;;;;30007:16;29988:15;;;;:35;;;;;;;;;29980:53;;;;;-1:-1:-1;;;;;29980:53:0;;;;;;;;;;;;-1:-1:-1;;;;;29980:53:0;;;;;;;;;;;;;;;30175:11;;30160;:26;;30152:48;;;;;-1:-1:-1;;;;;30152:48:0;;;;;;;;;;;;-1:-1:-1;;;;;30152:48:0;;;;;;;;;;;;;;;30289:9;30430;30417:22;;;30409:51;;;;;-1:-1:-1;;;;;30409:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30484:18;;;;30465:16;;30484:33;;30507:9;30484:33;:22;:33;:::i;:::-;30465:52;;30660:9;:13;;;30648:8;:25;;30640:50;;;;;-1:-1:-1;;;;;30640:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30834:15;;30787:20;30810:40;;;;;;;;;;;:55;;30855:9;30810:55;:44;:55;:::i;:::-;30954:10;30937:28;;;;:16;;;:28;;;;;;30787:78;;-1:-1:-1;30937:28:0;;30932:226;;31028:19;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;31028:36:0;;;;;;;;;;;;-1:-1:-1;;;;;;31028:36:0;31053:10;31028:36;;;;;;31070:28;;:16;;;:28;;;;;:35;;-1:-1:-1;;31070:35:0;;;;;31136:15;;31111:19;;;27:10:-1;;23:18;;;45:23;;31111:41:0;;;;;;;;;;30932:226;31185:9;:23;;;31165:16;:43;31162:773;;31333:15;;31294:61;;;31310:10;31294:61;;;;;;;;;;;;;;;31350:4;31294:61;;;;;;;;;;;;;;31368:4;31361:11;;;;;;;;;;31162:773;31408:9;:23;;;31388:16;:43;31384:551;;31485:9;:14;;;31469:12;:30;;31461:62;;;;;-1:-1:-1;;;;;31461:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31626:15;;31587:62;;;31603:10;31587:62;;;;;;;;;;;;;;;31643:5;31587:62;;;;;;;;;;;;;;31662:4;31655:11;;;;;;;;;;31384:551;31745:9;:14;;;31729:12;:30;;31721:62;;;;;-1:-1:-1;;;;;31721:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26649:1;29463:2476;:::o;24220:18::-;;;;;;;;;;;;;;;-1:-1:-1;;24220:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19133:185::-;19219:10;19200:4;19211:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;19211:29:0;;;;;;;;;;;:38;;;19259;;;;;;;19200:4;;19211:29;;19219:10;;19259:38;;;;;;;;-1:-1:-1;19309:4:0;19133:185;;;;;:::o;36928:240::-;37021:8;;37011:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;37011:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;37037:22;37062:19;;;:6;:19;;;;;;;;;37086:40;;-1:-1:-1;;37086:40:0;37103:23;37086:40;;;37136:27;;;;;;;37062:19;;37136:27;;;;;;;;;26336:1;26268:69;36928:240;;:::o;24474:22::-;;;;:::o;5651:588::-;5715:6;3191:17;3199:8;3191:7;:17::i;:::-;3183:34;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;5755:1;5741:11;;:15;2919:1;2906:10;:14;:43;;;;;13250:3;2924:10;:25;;2906:43;2898:69;;;;;-1:-1:-1;;;;;2898:69:0;;;;;;;;;;;;-1:-1:-1;;;;;2898:69:0;;;;;;;;;;;;;;;5788:20;;5824:1;5810:11;;:15;3083:1;3071:9;:13;:40;;;;;3101:10;3088:9;:23;;3071:40;3063:60;;;;;-1:-1:-1;;;;;3063:60:0;;;;;;;;;;;;-1:-1:-1;;;;;3063:60:0;;;;;;;;;;;;;;;5855:8;;5845:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;5845:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;5873:27;:25;:27::i;:::-;5907:14;:12;:14::i;:::-;-1:-1:-1;;;;;5963:20:0;;5926:18;5963:20;;;:12;:20;;;;;;5947:37;;:15;:37::i;:::-;5926:58;;6020:1;5989:8;5998:10;5989:20;;;;;;;;:33;;-1:-1:-1;;;;;;5989:33:0;-1:-1:-1;;;;;5989:33:0;;;;;;6027:20;;-1:-1:-1;6027:20:0;;;:12;:20;;;;;:24;6152:18;:16;:18::i;:::-;6177:27;:25;:27::i;:::-;6214:20;;;-1:-1:-1;;;;;6214:20:0;;;;;;;;;;;;;;;2604:1;2565:46;3128:1;2972;;3222;5651:588;;:::o;16035:82::-;16100:12;;16035:82;:::o;31944:250::-;32121:12;32102:8;;32092:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;32092:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;32147:42;32154:11;32167:9;32178:10;32147:6;:42::i;:::-;32140:49;;26336:1;31944:250;;;;;;:::o;46164:346::-;46258:12;26450:19;26458:10;26450:7;:19::i;:::-;26445:116;;26532:12;;-1:-1:-1;;;26532:12:0;;;;26531:13;26523:32;;;;;-1:-1:-1;;;;;26523:32:0;;;;;;;;;;;;-1:-1:-1;;;;;26523:32:0;;;;;;;;;;;;;;;46410:23;46427:5;46410:16;:23::i;:::-;-1:-1:-1;;;;;46379:15:0;;:8;:15;;;;;;;;;;;:27;;46399:6;46379:27;:19;:27;:::i;:::-;:54;;46371:84;;;;;-1:-1:-1;;;;;46371:84:0;;;;;;;;;;;;-1:-1:-1;;;;;46371:84:0;;;;;;;;;;;;;;;46467:38;46486:5;46493:3;46498:6;46467:18;:38::i;:::-;46460:45;46164:346;-1:-1:-1;;;;46164:346:0:o;48878:164::-;48957:15;48986:51;49013:10;49025:11;48986:26;:51::i;:::-;48979:58;;48878:164;;;;:::o;7312:99::-;-1:-1:-1;;;;;7383:19:0;7365:4;7383:19;;;:12;:19;;;;;;:23;;;7312:99::o;46515:206::-;46610:4;46590:8;;46580:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;46580:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;46643:15;;46629:11;:29;46621:45;;;;;-1:-1:-1;;;;;46621:45:0;;;;;;;;;;;;-1:-1:-1;;;;;46621:45:0;;;;;;;;;;;;;;;46671:15;:29;;;46712:4;;-1:-1:-1;2604:1:0;46515:206;;;;:::o;24319:21::-;;;;;;:::o;28550:426::-;28646:4;28627:8;;28617:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;28617:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;-1:-1:-1;;;;;28665:24:0;;28657:41;;;;;-1:-1:-1;;;;;28657:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28657:41:0;;;;;;;;;;;;;;;28725:5;;-1:-1:-1;;;;;28711:19:0;;;28725:5;;28711:19;;28703:36;;;;;-1:-1:-1;;;;;28703:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28703:36:0;;;;;;;;;;;;;;;28779:5;;-1:-1:-1;;;;;28779:5:0;;;28744:23;28770:15;;;;;;;;;;;;28813:20;;;;;;;;:41;;28770:15;28813:41;:24;:41;:::i;:::-;-1:-1:-1;;;;;28790:20:0;;;:8;:20;;;;;;;;;;;:64;;;;28868:5;;;;;28859:15;;;;;:19;;;;28897:5;;28888:44;;;;;;;28790:20;;28897:5;;;-1:-1:-1;;;;;;;;;;;28888:44:0;;;;;;;;;;-1:-1:-1;28937:5:0;:18;;-1:-1:-1;;;;;28937:18:0;;-1:-1:-1;;;;;;28937:18:0;;;;;;;;-1:-1:-1;28550:426:0;;;;:::o;41203:213::-;41272:7;41308:15;;41294:11;:29;41286:45;;;;;-1:-1:-1;;;;;41286:45:0;;;;;;;;;;;;-1:-1:-1;;;;;41286:45:0;;;;;;;;;;;;;;;-1:-1:-1;41336:22:0;41361:19;;;:6;:19;;;;;41392;;;;41203:213::o;35714:285::-;35799:10;35750:4;35778:32;;;:20;:32;;;;;;35823:10;35815:26;;;;;-1:-1:-1;;;;;35815:26:0;;;;;;;;;;;;-1:-1:-1;;;;;35815:26:0;;;;;;;;;;;;;;;35867:10;35881:1;35846:32;;;:20;:32;;;;;:36;35912:22;;:34;;35939:6;35912:34;:26;:34;:::i;:::-;35887:22;:59;35951:27;;:10;;:27;;;;;35971:6;;35951:27;;;;35971:6;35951:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35951:27:0;35990:4;35983:11;;;35714:285;:::o;24500:26::-;;;;:::o;42020:264::-;42110:4;26136:19;26144:10;26136:7;:19::i;:::-;:50;;;-1:-1:-1;26173:13:0;;-1:-1:-1;;;;;26173:13:0;26159:10;:27;26136:50;26128:67;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;42143:15;;42129:11;:29;:85;;;;-1:-1:-1;42191:23:0;42162:26;42176:11;42162:13;:26::i;:::-;:52;;;;;;;;;42129:85;42121:102;;;;;-1:-1:-1;;;;;42121:102:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42121:102:0;;;;;;;;;;;;;;;42233:30;;;;;;;;;;;;;;;;;-1:-1:-1;42275:4:0;42020:264;;;:::o;13433:26::-;;;;:::o;49048:217::-;49110:8;;49100:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;49100:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;49153:5;;-1:-1:-1;;;;;49153:5:0;49144:8;:15;;;;;;;;;;;:27;;49164:6;49144:27;:19;:27;:::i;:::-;49135:5;;-1:-1:-1;;;;;49135:5:0;49126:8;:15;;;;;;;;;;:45;49135:5;49191:12;:24;;49208:6;49191:24;:16;:24;:::i;:::-;49176:12;:39;49234:5;;49225:35;;;;;;;;49249:1;;-1:-1:-1;;;;;49234:5:0;;-1:-1:-1;;;;;;;;;;;49225:35:0;;;;;;;;;49048:217;;:::o;24179:37::-;;;-1:-1:-1;;;24179:37:0;;;;;:::o;37459:143::-;37550:4;37531:8;;37521:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;37521:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;-1:-1:-1;;37561:7:0;:20;37593:4;;37459:143::o;24620:24::-;;;;:::o;28981:155::-;29078:4;29059:8;;29049:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;29049:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;29089:13;:26;;-1:-1:-1;;;;;29089:26:0;;-1:-1:-1;;;;;;29089:26:0;;;;;;;;-1:-1:-1;28981:155:0;;;;:::o;7658:80::-;7711:4;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;7729:4:0;7658:80;:::o;48685:188::-;48785:15;48814:54;48841:13;48856:11;48814:26;:54::i;:::-;48807:61;48685:188;-1:-1:-1;;;48685:188:0:o;41845:170::-;41940:4;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;41956:38;;;-1:-1:-1;;;;;41956:38:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42006:4:0;41845:170;;;;:::o;44355:514::-;44444:12;44424:8;;44414:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;44414:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;44463:22;44488:19;;;:6;:19;;;;;44550:23;44520:26;44534:11;44520:13;:26::i;:::-;:53;;;;;;;;;44512:72;;;;;-1:-1:-1;;;;;44512:72:0;;;;;;;;;;;;-1:-1:-1;;;;;44512:72:0;;;;;;;;;;;;;;;44639:19;;;;:24;44631:47;;;;;-1:-1:-1;;;;;44631:47:0;;;;;;;;;;;;-1:-1:-1;;;;;44631:47:0;;;;;;;;;;;;;;;44811:37;;-1:-1:-1;;44811:37:0;44828:20;44811:37;;;-1:-1:-1;44811:37:0;;44860:4;-1:-1:-1;;44355:514:0:o;41720:120::-;41774:7;41795:40;41819:15;;41795:23;:40::i;:::-;41788:47;;41720:120;:::o;20955:415::-;21095:10;21055:4;21087:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21087:29:0;;;;;;;;;;21125:27;;;21121:158;;;21168:10;21192:1;21160:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21160:29:0;;;;;;;;;:33;21121:158;;;21243:30;:8;21256:16;21243:30;:12;:30;:::i;:::-;21219:10;21211:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21211:29:0;;;;;;;;;:62;21121:158;21297:10;21319:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21288:61:0;;21319:29;;;;;;;;;;;21288:61;;;;;;;;;21297:10;21288:61;;;;;;;;;;;-1:-1:-1;21361:4:0;;20955:415;-1:-1:-1;;;20955:415:0:o;45051:777::-;45197:4;45175:8;;45165:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;45165:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;45220:16;;45254:26;;45249:31;;45241:50;;;;;-1:-1:-1;;;;;45241:50:0;;;;;;;;;;;;-1:-1:-1;;;;;45241:50:0;;;;;;;;;;;;;;;45331:5;;-1:-1:-1;;;;;45331:5:0;45296:23;45322:15;;;;;;;;;;;;45342:392;45366:1;45362;:5;45342:392;;;45380:18;45401:9;45411:1;45401:12;;;;;;;;;;;;;;45380:33;;45419:21;45443:19;45463:1;45443:22;;;;;;;;;;;;;;45419:46;;45491:1;45475:13;:17;45471:258;;;-1:-1:-1;;;;;45526:20:0;;45501:22;45526:20;;;;;;;;;;;45576:33;45526:20;45595:13;45576:33;:18;:33;:::i;:::-;-1:-1:-1;;;;;45553:20:0;;:8;:20;;;;;;;;;;:56;45634:34;:15;45654:13;45634:34;:19;:34;:::i;:::-;45689:5;;45680:42;;;;;;;;45616:52;;-1:-1:-1;;;;;;45680:42:0;;;;45689:5;;;-1:-1:-1;;;;;;;;;;;45680:42:0;;;;;;;;45471:258;;-1:-1:-1;;45369:3:0;;45342:392;;;-1:-1:-1;45747:5:0;;-1:-1:-1;;;;;45747:5:0;45738:8;:15;;;;;;;;;;;:33;;;45781:26;;;;;;;;;;;;;;;45797:9;;45781:26;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45781:26:0;;;;;;;;;;;;;;;;;45819:4;45812:11;;;;26336:1;45051:777;;;;;:::o;48166:133::-;48234:15;48263:31;48280:13;48263:16;:31::i;24899:30::-;;;;:::o;5142:380::-;5209:6;3292:17;3300:8;3292:7;:17::i;:::-;3291:18;3283:39;;;;;-1:-1:-1;;;;;3283:39:0;;;;;;;;;;;;-1:-1:-1;;;;;3283:39:0;;;;;;;;;;;;;;;5235:11;;5249:1;5235:15;2919:1;2906:10;:14;:43;;;;;13250:3;2924:10;:25;;2906:43;2898:69;;;;;-1:-1:-1;;;;;2898:69:0;;;;;;;;;;;;-1:-1:-1;;;;;2898:69:0;;;;;;;;;;;;;;;5280:8;;5270:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;5270:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;5298:27;:25;:27::i;:::-;5332:14;:12;:14::i;:::-;5351:11;:13;;;;;;;;5393:6;;5369:8;;:21;;;;;;;;:30;;-1:-1:-1;;;;;;5369:30:0;-1:-1:-1;;;;;5369:30:0;;;;;;;;;;5443:11;;5427:28;;:15;:28::i;:::-;-1:-1:-1;;;;;5404:20:0;;;;;;:12;:20;;;;;:51;5462:27;:25;:27::i;:::-;5499:18;;;-1:-1:-1;;;;;5499:18:0;;;;;;;;;;;;;;;2565:46;2972:1;3327;5142:380;;:::o;16806:98::-;-1:-1:-1;;;;;16883:16:0;16862:7;16883:16;;;;;;;;;;;;16806:98::o;44874:172::-;44951:4;44932:8;;44922:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;44922:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;44962:12;:20;;-1:-1:-1;;44962:20:0;;;;;44992:33;;;-1:-1:-1;;;45012:12:0;;;44962:20;45012:12;44992:33;;;;;;;;;;;;;;45037:4;45030:11;;2604:1;44874:172;;:::o;24032:31::-;;;-1:-1:-1;;;24032:31:0;;;;;:::o;27476:1069::-;27513:4;27532:10;27554:4;27532:27;;27524:44;;;;;-1:-1:-1;;;;;27524:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27524:44:0;;;;;;;;;;;;;;;27850:7;;:44;;;-1:-1:-1;;;;;27850:44:0;;27868:10;27850:44;;;;27888:4;27850:44;;;;;;27823:24;;-1:-1:-1;;;;;27850:7:0;;:17;;:44;;;;;;;;;;;;;;:7;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;27850:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27850:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27850:44:0;;-1:-1:-1;27907:20:0;27899:42;;;;;-1:-1:-1;;;;;27899:42:0;;;;;;;;;;;;-1:-1:-1;;;;;27899:42:0;;;;;;;;;;;;;;;28090:10;28081:8;:20;;;;;;;;;;;:42;;28106:16;28081:42;:24;:42;:::i;:::-;28067:10;28058:8;:20;;;;;;;;;;;:65;;;;28155:5;;-1:-1:-1;;;;;28155:5:0;28146:15;;;;:37;;28166:16;28146:37;:19;:37;:::i;:::-;28137:5;;-1:-1:-1;;;;;28137:5:0;;;28128:8;:15;;;;;;;;;;;:55;;;;28391:7;;:65;;-1:-1:-1;;;;;28391:65:0;;28412:10;28391:65;;;;28432:4;28391:65;;;;;;;;;;;;:7;;;:20;;:65;;;;;;;;;;;;;;:7;:65;;;5:2:-1;;;;30:1;27;20:12;5:2;28391:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28391:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28391:65:0;28383:86;;;;;-1:-1:-1;;;;;28383:86:0;;;;;;;;;;;;-1:-1:-1;;;;;28383:86:0;;;;;;;;;;;;;;;28488:5;;28479:45;;;;;;;;28495:10;;-1:-1:-1;;;;;28488:5:0;;-1:-1:-1;;;;;;;;;;;28479:45:0;;;;;;;;;28536:4;28529:11;;;27476:1069;:::o;13340:35::-;;;;:::o;37607:1090::-;26692:16;;-1:-1:-1;;;26692:16:0;;;;26684:35;;;;;-1:-1:-1;;;;;26684:35:0;;;;;;;;;;;;-1:-1:-1;;;;;26684:35:0;;;;;;;;;;;;;;;37678:1;37668:9;;:11;37660:36;;;;;-1:-1:-1;;;;;37660:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37746:8;;37701:21;;37725:30;;:6;;37746:8;;37741:2;37736:18;37725:30;:10;:30;:::i;:::-;37701:54;;37874:28;37891:10;37874:16;:28::i;:::-;37840:10;37831:8;:20;;;;;;;;;;;:39;;37856:13;37831:39;:24;:39;:::i;:::-;:71;;37823:87;;;;;-1:-1:-1;;;;;37823:87:0;;;;;;;;;;;;-1:-1:-1;;;;;37823:87:0;;;;;;;;;;;;;;;37985:10;37976:8;:20;;;;;;;;;;;:39;;38001:13;37976:39;:24;:39;:::i;:::-;37962:10;37953:8;:20;;;;;;;;;;:62;;;;38129:9;;38118:21;;:6;;:21;:10;:21;:::i;:::-;38211:22;;38098:41;;-1:-1:-1;38211:37:0;;38098:41;38211:37;:26;:37;:::i;:::-;38186:22;:62;;;38269:4;38261:21;:47;;38253:63;;;;;-1:-1:-1;;;;;38253:63:0;;;;;;;;;;;;-1:-1:-1;;;;;38253:63:0;;;;;;;;;;;;;;;38409:5;;-1:-1:-1;;;;;38409:5:0;38400:8;:15;;;;;;;;;;;:34;;38420:13;38400:34;:19;:34;:::i;:::-;38391:5;;-1:-1:-1;;;;;38391:5:0;38382:8;:15;;;;;;;;;;;:52;;;;38545:10;38524:32;;:20;:32;;;;:47;;38561:9;38524:47;:36;:47;:::i;:::-;38510:10;38489:32;;;;:20;:32;;;;;;;;;:82;;;;38638:5;;38617:42;;;;;;;-1:-1:-1;;;;;38638:5:0;;;;-1:-1:-1;;;;;;;;;;;38617:42:0;;;;;;;26724:1;;37607:1090;:::o;29260:198::-;29358:4;29339:8;;29329:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;29329:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;29383:20;:9;29397:5;29383:20;:13;:20;:::i;:::-;29369:11;:34;-1:-1:-1;29449:4:0;;29260:198;-1:-1:-1;;29260:198:0:o;24726:37::-;;;;:::o;33338:619::-;33503:4;33484:8;;33474:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;33474:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;33526:16;;33560:17;;33555:22;;33547:41;;;;;-1:-1:-1;;;;;33547:41:0;;;;;;;;;;;;-1:-1:-1;;;;;33547:41:0;;;;;;;;;;;;;;;33593:22;33618:19;;;:6;:19;;;;;;33642:257;33666:1;33662;:5;33642:257;;;33680:18;33701:9;33711:1;33701:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33724:27:0;;;;;;:15;;;:27;;;;;;;;33701:12;;-1:-1:-1;33724:27:0;;33719:175;;33760:18;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;33760:35:0;;;;;;;;;;;;-1:-1:-1;;;;;;33760:35:0;-1:-1:-1;;;;;33760:35:0;;;;;;;;33802:27;;:15;;;:27;;;;;;:34;;-1:-1:-1;;33802:34:0;;;;;33843:7;:19;;;;:26;;27:10:-1;;23:18;;;45:23;;33843:44:0;;;;;;;;33719:175;-1:-1:-1;33669:3:0;;33642:257;;;;33910:42;33917:11;33930:9;33941:10;33910:6;:42::i;:::-;33903:49;33338:619;-1:-1:-1;;;;;;;33338:619:0:o;24139:36::-;;;-1:-1:-1;;;24139:36:0;;;;;:::o;38999:158::-;39072:8;;39062:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;39062:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;39088:16;:24;;;;;-1:-1:-1;;;39088:24:0;;-1:-1:-1;;;;;;39088:24:0;;;;;;;;;;39122:30;;;;;;;;;;;;;;;;38999:158;;:::o;23632:20::-;;;-1:-1:-1;;;;;23632:20:0;;:::o;35598:111::-;35693:10;35651:7;35672:32;;;:20;:32;;;;;;35598:111;:::o;24271:20::-;;;;;;;;;;;;;;;-1:-1:-1;;24271:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6958:216;7000:16;7023:23;7063:11;;7049:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7049:26:0;-1:-1:-1;7023:52:0;-1:-1:-1;7085:9:0;7080:69;7104:11;;7100:1;:15;7080:69;;;7138:11;7147:1;7138:8;:11::i;:::-;7126:6;7133:1;7126:9;;;;;;;;-1:-1:-1;;;;;7126:23:0;;;:9;;;;;;;;;;;:23;7117:3;;7080:69;;;-1:-1:-1;7163:6:0;-1:-1:-1;6958:216:0;:::o;46726:752::-;46790:11;46830:15;;46816:11;:29;46808:54;;;;;-1:-1:-1;;;;;46808:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46908:22;46933:19;;;:6;:19;;;;;46978:23;46961:14;;;;:40;;;;;;;;;46957:71;;;47014:14;;;;-1:-1:-1;47007:21:0;;46957:71;47232:8;:19;;;47214:15;:37;47210:237;;;47264:23;47257:30;;;;;47210:237;47301:19;;;;:23;47297:150;;47427:20;47420:27;;;;;47297:150;47459:14;;;;46726:752;-1:-1:-1;;46726:752:0:o;23513:28::-;;;-1:-1:-1;;;;;23513:28:0;;:::o;45833:326::-;45908:12;26450:19;26458:10;26450:7;:19::i;:::-;26445:116;;26532:12;;-1:-1:-1;;;26532:12:0;;;;26531:13;26523:32;;;;;-1:-1:-1;;;;;26523:32:0;;;;;;;;;;;;-1:-1:-1;;;;;26523:32:0;;;;;;;;;;;;;;;46065:28;46082:10;46065:16;:28::i;:::-;46038:10;46029:8;:20;;;;;;;;;;;:32;;46054:6;46029:32;:24;:32;:::i;:::-;:64;;46021:94;;;;;-1:-1:-1;;;;;46021:94:0;;;;;;;;;;;;-1:-1:-1;;;;;46021:94:0;;;;;;;;;;;;;;;46127:27;46142:3;46147:6;46127:14;:27::i;44130:220::-;44207:17;44256:19;;;:6;:19;;;;;44315:30;;;;44287:18;;;;:25;:58;;44130:220::o;7880:514::-;7959:10;3408:29;3426:10;3408:17;:29::i;:::-;3400:46;;;;;-1:-1:-1;;;;;3400:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3400:46:0;;;;;;;;;;;;;;;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;7991:21;8015:30;8034:10;8015:18;:30::i;:::-;8050:47;8100:31;;;:19;:31;;;;;8144:18;;;;7991:54;;-1:-1:-1;8100:31:0;8144:34;;8136:55;;;;;-1:-1:-1;;;;;8136:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;8136:55:0;;;;;;;;;;;;;;;8198:39;8226:10;8198:27;:39::i;:::-;8244:19;;;;;;;;8268:18;;:35;;;;;;;8310:39;8338:10;8310:27;:39::i;:::-;8359:30;;;8366:10;8359:30;;;;;;;;;;;;;;;;;;;;;2310:1;;7880:514;;:::o;6412:265::-;6503:12;6517:11;;3083:1;3071:9;:13;:40;;;;;3101:10;3088:9;:23;;3071:40;3063:60;;;;;-1:-1:-1;;;;;3063:60:0;;;;;;;;;;;;-1:-1:-1;;;;;3063:60:0;;;;;;;;;;;;;;;6558:8;;6548:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;6548:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;6576:20;:35;;;6616:14;:12;:14::i;:::-;6640:32;;;;;;;;;;;;;;;;;3128:1;6412:265;;;:::o;38702:111::-;26136:19;26144:10;26136:7;:19::i;:::-;:50;;;-1:-1:-1;26173:13:0;;-1:-1:-1;;;;;26173:13:0;26159:10;:27;26136:50;26128:67;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;38702:111::o;36004:919::-;36128:12;36109:8;;36099:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;36099:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;36159:16;;36194:17;;36189:22;;36180:42;;;;;-1:-1:-1;;;;;36180:42:0;;;;;;;;;;;;-1:-1:-1;;;;;36180:42:0;;;;;;;;;;;;;;;36248:7;;36227:18;;36288:370;36311:1;36307;:5;36288:370;;;36325:17;36345:10;36356:1;36345:13;;;;;;;;;;;;;;36325:33;;36364:26;36417:9;36427:1;36417:12;;;;;;;;;;;;;;36364:68;;36455:9;36442:10;:22;36438:215;;;36485:25;:9;36499:10;36485:25;:13;:25;:::i;:::-;36473:37;-1:-1:-1;36531:26:0;:11;36473:37;36531:26;:15;:26;:::i;:::-;-1:-1:-1;;;;;36599:32:0;;;;;;:20;:32;;;;;;36517:40;;-1:-1:-1;36599:47:0;;36636:9;36599:47;:36;:47;:::i;:::-;-1:-1:-1;;;;;36564:32:0;;;;;;:20;:32;;;;;:82;36438:215;-1:-1:-1;;36314:3:0;;36288:370;;;-1:-1:-1;36695:22:0;;:36;;36678:4;36670:21;:61;;36662:77;;;;;-1:-1:-1;;;;;36662:77:0;;;;;;;;;;;;-1:-1:-1;;;;;36662:77:0;;;;;;;;;;;;;;;36829:22;;:39;;36856:11;36829:39;:26;:39;:::i;:::-;36804:22;:64;36878:24;;;;;;;;;;;;;;;;;36892:9;;36878:24;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36878:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;36914:4:0;;36004:919;-1:-1:-1;;;;;;36004:919:0:o;8563:260::-;8719:4;8672:10;3408:29;3426:10;3408:17;:29::i;:::-;3400:46;;;;;-1:-1:-1;;;;;3400:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3400:46:0;;;;;;;;;;;;;;;8699:6;3191:17;3199:8;3191:7;:17::i;:::-;3183:34;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;8786:26;8805:6;8786:18;:26::i;:::-;8741:31;;;;:19;:31;;;;;:42;;;:71;:76;8739:79;;-1:-1:-1;3451:1:0;8563:260;;;;;:::o;6781:109::-;6840:7;6861:8;6870:10;6883:1;6870:14;6861:24;;;;;;;;;-1:-1:-1;;;;;6861:24:0;;6781:109;-1:-1:-1;;6781:109:0:o;40269:929::-;40328:23;40353:20;40375:17;40396;40415:11;40428:13;40443:17;40462:21;40485;40508:16;40528;40573:15;;40559:11;:29;40551:45;;;;;-1:-1:-1;;;;;40551:45:0;;;;;;;;;;;;-1:-1:-1;;;;;40551:45:0;;;;;;;;;;;;;;;40601:22;40626:19;;;:6;:19;;;;;;;;;40662:13;;;;40650:25;;;;;;;;;;-1:-1:-1;;40650:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;40626:19;;40650:25;;;;40662:13;40650:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40680:17;40700:26;40714:11;40700:13;:26::i;:::-;40680:46;-1:-1:-1;40750:16:0;40741:5;:25;;;;;;;;;40740:156;;40790:24;40781:5;:33;;;;;;;;;40780:116;;40846:23;40837:5;:32;;;;;;;;;40836:60;;;;;;;;;;;;;;;-1:-1:-1;;;;;40836:60:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40836:60:0;;;;40780:116;;;;;;;;;;;;;;;;;;;;;40740:156;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40740:156:0;;;;40731:165;;40913:8;:13;;;40901:25;;40943:8;:13;;;40931:25;;40967:8;:12;;;40961:18;;40992:8;:14;;;40984:22;;41023:8;:18;;;41011:30;;41062:8;:22;;;41046:38;;41105:8;:22;;;41089:38;;41143:8;:17;;;41132:28;;41176:8;:17;;;41165:28;;40269:929;;;;;;;;;;;;;;;:::o;20221:284::-;20374:10;20316:4;20366:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20366:29:0;;;;;;;;;;:46;;20400:11;20366:46;:33;:46;:::i;:::-;20337:10;20329:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20329:29:0;;;;;;;;;;;;:84;;;20423:61;;;;;;20329:29;;20423:61;;;;;;;;;;;-1:-1:-1;20496:4:0;20221:284;;;;:::o;29141:114::-;29197:4;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;29208:13:0;:26;;-1:-1:-1;;;;;;29208:26:0;;;;29141:114;:::o;23545:83::-;23586:42;23545:83;:::o;42289:1836::-;42415:12;42395:8;;42385:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;42385:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;42434:22;42459:19;;;:6;:19;;;;;;42503:26;42466:11;42503:13;:26::i;:::-;42483:46;-1:-1:-1;42550:23:0;42542:5;:31;;;;;;;;;42534:48;;;;;-1:-1:-1;;;;;42534:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42534:48:0;;;;;;;;;;;;;;;42600:24;42591:5;:33;;;;;;;;;42587:92;;42632:41;;-1:-1:-1;;42632:41:0;42649:24;42632:41;;;42587:92;42695:18;;;:25;42757:30;;;;42820:31;;;42860:21;;;42856:60;;;-1:-1:-1;42909:1:0;42856:60;42954:5;;-1:-1:-1;;;;;42954:5:0;42920:22;42945:15;;;;;;;;;;;42982:21;42965:534;43009:17;43005:1;:21;42965:534;;;43039:18;43060:8;:18;;43079:1;43060:21;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43060:21:0;;-1:-1:-1;43105:51:0;43060:21;43144:11;43105:26;:51::i;:::-;43087:69;-1:-1:-1;43166:11:0;;43162:332;;-1:-1:-1;;;;;43272:20:0;;:8;:20;;;;;;;;;;;:33;;43297:7;43272:33;:24;:33;:::i;:::-;-1:-1:-1;;;;;43249:20:0;;:8;:20;;;;;;;;;;:56;43329:27;:14;43348:7;43329:27;:18;:27;:::i;:::-;43419:5;;43410:36;;;;;;;;43312:44;;-1:-1:-1;;;;;;43410:36:0;;;;43419:5;;;-1:-1:-1;;;;;;;;;;;43410:36:0;;;;;;;;43162:332;-1:-1:-1;;43028:3:0;;42965:534;;;-1:-1:-1;43512:5:0;;-1:-1:-1;;;;;43512:5:0;43503:8;:15;;;;;;;;;;:32;;;43544:21;;;43540:372;;;43578:38;;;;;;;;;;;;;;;;;;;;;;;;;43540:372;;;43878:28;;;;;;;43540:372;-1:-1:-1;43916:30:0;;;;:50;;;;-1:-1:-1;44116:4:0;;-1:-1:-1;;;42289:1836:0;;;;;:::o;19633:143::-;-1:-1:-1;;;;;19746:15:0;;;19723:7;19746:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;19633:143::o;37173:281::-;37259:4;37240:8;;37230:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;37230:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;37327:22;;37270:28;;37301:49;;37309:4;37301:21;;:49;:25;:49;:::i;:::-;37270:80;;37386:1;37363:20;:24;37355:40;;;;;-1:-1:-1;;;;;37355:40:0;;;;;;;;;;;;-1:-1:-1;;;;;37355:40:0;;;;;;;;;;;;;;;37400:33;;-1:-1:-1;;;;;37400:11:0;;;:33;;;;;37412:20;;37400:33;;;;37412:20;37400:11;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37445:4:0;;37173:281;-1:-1:-1;;;;37173:281:0:o;39162:191::-;39255:4;39236:8;;39226:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;39226:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;39266:17;:25;;;;;-1:-1:-1;;;39266:25:0;;-1:-1:-1;;;;;;39266:25:0;;;;;;;;;;39301:31;;;;;;;;;;;;;;;;-1:-1:-1;39344:4:0;;39162:191;-1:-1:-1;;39162:191:0:o;4590:432::-;4666:5;3191:17;3199:8;3191:7;:17::i;:::-;3183:34;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3183:34:0;;;;;;;;;;;;;;;4694:3;3292:17;3300:8;3292:7;:17::i;:::-;3291:18;3283:39;;;;;-1:-1:-1;;;;;3283:39:0;;;;;;;;;;;;-1:-1:-1;;;;;3283:39:0;;;;;;;;;;;;;;;4727:8;;4717:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;4717:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;4745:27;:25;:27::i;:::-;4779:14;:12;:14::i;:::-;-1:-1:-1;;;;;4835:19:0;;4798:18;4835:19;;;:12;:19;;;;;;4819:36;;:15;:36::i;:::-;4798:57;;4883:3;4860:8;4869:10;4860:20;;;;;;;;:26;;-1:-1:-1;;;;;;4860:26:0;-1:-1:-1;;;;;4860:26:0;;;;;;4891:19;;;-1:-1:-1;4891:19:0;;;:12;:19;;;;;;:23;;;4919:17;;;;;;:30;;;4956:27;:25;:27::i;:::-;4993:24;;;-1:-1:-1;;;;;4993:24:0;;;;;;;;;;;;;;;;;;;;;;;;2604:1;2565:46;3327:1;3222;4590:432;;;:::o;39358:906::-;39661:12;39675:26;39641:8;;39631:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;39631:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;39716:15;;24415:3;-1:-1:-1;39708:55:0;;;;;-1:-1:-1;;;;;39708:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39789:15;;39768:36;;39809:22;39834:6;:26;39841:18;39834:26;;;;;;;;;;;39809:51;;39881:9;39865:8;:13;;:25;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39895:18:0;;;:31;;;39931:22;;;:39;;;39975:22;;;:39;;;40019:17;;;:33;;;40057:19;;;:38;;;40100:13;;;:28;;;40133:13;;;:28;;;40166:12;;;:25;;;-1:-1:-1;40196:14:0;:22;;;40223:15;:17;;-1:-1:-1;40223:17:0;;;;;;-1:-1:-1;;2565:46:0;39358:906;;;;;;;;;;;;;;:::o;38818:176::-;38910:4;38890:8;;38880:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;38880:19:0;;;;;;;;;;;;;2569:27;2585:10;2569:15;:27::i;:::-;2565:46;;;38921:9;:20;;;38951:22;;;;;;;;;;;;;;;;;-1:-1:-1;38985:4:0;;38818:176;-1:-1:-1;;38818:176:0:o;33962:1631::-;34149:4;34130:8;;34120:19;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;34120:19:0;;;;;;;;;;;;;26272:27;26288:10;26272:15;:27::i;:::-;:58;;;-1:-1:-1;26317:13:0;;-1:-1:-1;;;;;26317:13:0;26303:10;:27;26272:58;26268:69;;;34172:16;;34206:17;;34201:22;;34193:41;;;;;-1:-1:-1;;;;;34193:41:0;;;;;;;;;;;;-1:-1:-1;;;;;34193:41:0;;;;;;;;;;;;;;;34277:20;34247:26;34261:11;34247:13;:26::i;:::-;:50;;;;;;;;;;34239:71;;;;;-1:-1:-1;;;;;34239:71:0;;;;;;;;;;;;-1:-1:-1;;;;;34239:71:0;;;;;;;;;;;;;;;34315:22;34340:19;;;:6;:19;;;;;;;;34398:5;;-1:-1:-1;;;;;34398:5:0;34389:15;;;;;;;;;34340:19;;34409:960;34433:1;34429;:5;34409:960;;;34447:18;34468:9;34478:1;34468:12;;;;;;;;;;;;;;34447:33;;34486:27;34516:7;:19;34524:10;-1:-1:-1;;;;;34516:19:0;-1:-1:-1;;;;;34516:19:0;;;;;;;;;;;;34486:49;;34541:17;34561:10;34572:1;34561:13;;;;;;;;;;;;;;34541:33;;34619:51;34660:9;34619:12;:23;;:36;34643:11;34619:36;;;;;;;;;;;;:40;;:51;;;;:::i;:::-;34580:23;:36;;;;;;;;;;;:90;;;;-1:-1:-1;;;;;34744:27:0;;;;:15;;;:27;;;;;;34739:168;;34780:18;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;34780:35:0;;;;;;;;;;;;-1:-1:-1;;;;;;34780:35:0;-1:-1:-1;;;;;34780:35:0;;;;;;;;34822:27;;:15;;;:27;;;;;:34;;-1:-1:-1;;34822:34:0;;;;;34863:19;;;27:10:-1;;23:18;;;45:23;;34863:37:0;;;;;;;;34739:168;34912:25;34940:29;34954:8;:14;;;34940:9;:13;;:29;;;;:::i;:::-;34912:57;-1:-1:-1;35059:21:0;;35055:309;;-1:-1:-1;;;;;35112:20:0;;:8;:20;;;;;;;;;;;:43;;35137:17;35112:43;:24;:43;:::i;:::-;-1:-1:-1;;;;;35089:20:0;;:8;:20;;;;;;;;;;:66;35179:37;:14;35198:17;35179:37;:18;:37;:::i;:::-;35279:5;;35270:46;;;;;;;;35162:54;;-1:-1:-1;;;;;;35270:46:0;;;;35279:5;;;-1:-1:-1;;;;;;;;;;;35270:46:0;;;;;;;;35055:309;-1:-1:-1;;34436:3:0;;;;;-1:-1:-1;34409:960:0;;-1:-1:-1;34409:960:0;;-1:-1:-1;35382:5:0;;-1:-1:-1;;;;;35382:5:0;35373:8;:15;;;;;;;;;;;:32;;;35415:49;;;;;;;;;;;;;;;;;;;;;;;;35441:11;;35454:9;;35415:49;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35415:49:0;;;;;;;;;;;;;;;;;;35503:23;35473:26;35487:11;35473:13;:26::i;:::-;:53;;;;;;;;;35469:103;;35532:40;;-1:-1:-1;;35532:40:0;35549:23;35532:40;;;35469:103;-1:-1:-1;35584:4:0;;33962:1631;-1:-1:-1;;;;;;;33962:1631:0:o;15621:120::-;15699:5;;;15716:6;;;;15709:14;;;8852:1963;8934:4;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;8958:24;:31;8951:3;:38;8947:411;;;9344:14;:12;:14::i;:::-;9365:47;9415:31;;;:19;:31;;;;;9556:29;9435:10;9556:17;:29::i;:::-;9550:390;;9657:20;;9637:40;;:17;9754:18;;;;:22;;;;9798:24;:33;;;;;:24;:33;;;:::i;:::-;9782:13;;;:49;;;9837:24;:39;;9879:10;;9782:49;9837:39;;;;;;;;;;;;;;;:52;9895:39;9923:10;9895:27;:39::i;:::-;9993:21;10017:30;10036:10;10017:18;:30::i;:::-;9993:54;;10162:13;10141:7;:18;;;:34;10179:1;10141:39;10137:674;;;10245:17;;10238:29;;;;10277:17;;10298:1;10277:22;10273:533;;;10394:31;;;;:19;:31;;;;;:37;;;10369:24;:63;;:24;;10394:37;10369:63;;;;;;;;;;;;;;;;;10362:70;;;10446:31;;;:19;:31;;;;;;10439:38;;;;;;;;;;;;;;;10489:41;;10507:10;10489:41;;;;;;;;;;;;;;;;;;;;;10544:4;10537:11;;;;;;10273:533;10644:19;;-1:-1:-1;;10644:19:0;;;;10670:18;;:35;;;;;;10712:39;10740:10;10712:27;:39::i;:::-;10763:36;;;10776:10;10763:36;;;;;;;;;;;;;;;;;;;;;10273:533;2310:1;;8852:1963;;;:::o;12640:237::-;12716:1;12702:11;;:15;12695:23;;;;13250:3;12730:11;;:26;;12723:34;;;;12769:8;:11;-1:-1:-1;;;;;12769:11:0;:25;12762:33;;;;12812:20;;12807:25;;;;:64;;;12860:11;;12836:20;;:35;;12807:64;12800:72;;;11837:314;2277:19;2285:10;2277:7;:19::i;:::-;2269:36;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2269:36:0;;;;;;;;;;;;;;;11901:24;:31;11884:14;11964:147;11988:6;11984:1;:10;11964:147;;;12011:24;12036:1;12011:27;;;;;;;;;;;;;;;;;;:32;12007:98;;12057:19;:48;12077:24;12102:1;12077:27;;;;;;;;;;;;;;;;;;;;12057:48;;;;;;;;;;;;12050:55;;;;;;;;;;;;12007:98;11996:3;;11964:147;;;-1:-1:-1;12115:31:0;12122:24;;12115:31;:::i;:::-;2310:1;11837:314::o;12156:161::-;12224:7;12245:15;;;;;:44;;;13250:3;12264:10;:25;;12245:44;12238:52;;;10955:877;11042:11;;11011:1;;11058:737;11072:14;11065:4;:21;11058:737;;;11156:68;11170:14;11163:4;:21;:53;;;;-1:-1:-1;11214:1:0;11188:8;11197:4;11188:14;;;;;;;;;-1:-1:-1;;;;;11188:14:0;:28;;11163:53;11156:68;;;11218:6;;;;;11156:68;;;11313:1;11296:14;:18;:60;;;;-1:-1:-1;11354:1:0;11318:8;11327:14;11318:24;;;;;;;;;-1:-1:-1;;;;;11318:24:0;:38;11296:60;11289:85;;;-1:-1:-1;;11358:16:0;11289:85;;;11469:14;11462:4;:21;:63;;;;-1:-1:-1;11523:1:0;11487:8;11496:14;11487:24;;;;;;;;;-1:-1:-1;;;;;11487:24:0;:38;;11462:63;:95;;;;-1:-1:-1;11555:1:0;11529:8;11538:4;11529:14;;;;;;;;;-1:-1:-1;;;;;11529:14:0;:28;11462:95;11458:332;;;11673:8;11682:14;11673:24;;;;;;;;;-1:-1:-1;;;;;11673:24:0;11656:8;11665:4;11673:24;11656:14;;;;;;;:41;;-1:-1:-1;;;;;;11656:41:0;-1:-1:-1;;;;;11656:41:0;;;;;;;;;;11735:4;11704:12;-1:-1:-1;11717:8:0;11735:4;11656:41;11717:14;;;;;;;;-1:-1:-1;;;;;11717:14:0;11704:28;;;;;;;;;;;11717:14;11704:28;;;:35;;;;11746:8;11755:14;11717;11746:24;;;;;;;:37;;-1:-1:-1;;;;;;11746:37:0;-1:-1:-1;;;;;11746:37:0;;;;;;;;;;11458:332;11058:737;;;11799:11;:28;-1:-1:-1;10955:877:0:o;32274:1059::-;32408:4;26136:19;26144:10;26136:7;:19::i;:::-;:50;;;-1:-1:-1;26173:13:0;;-1:-1:-1;;;;;26173:13:0;26159:10;:27;26136:50;26128:67;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26128:67:0;;;;;;;;;;;;;;;32431:16;;32465:17;;32460:22;;32452:41;;;;;-1:-1:-1;;;;;32452:41:0;;;;;;;;;;;;-1:-1:-1;;;;;32452:41:0;;;;;;;;;;;;;;;32498:22;32523:19;;;:6;:19;;;;;32566:17;;;;32523:19;;32588:411;32612:1;32608;:5;32588:411;;;32626:27;32656:7;:21;32664:9;32674:1;32664:12;;;;;;;;;;;;;;-1:-1:-1;;;;;32656:21:0;-1:-1:-1;;;;;32656:21:0;;;;;;;;;;;;32626:51;;32683:17;32703:10;32714:1;32703:13;;;;;;;;;;;;;;32683:33;;32733:23;32746:9;32733:8;:12;;:23;;;;:::i;:::-;32879;:36;;;;;;;;;;;32722:34;;-1:-1:-1;32879:51:0;;32920:9;32879:51;:40;:51;:::i;:::-;32840:23;:36;;;;;;;;;;;;:90;;;;-1:-1:-1;32615:3:0;;32588:411;;;-1:-1:-1;33003:17:0;;;:28;;;33080:9;33040:36;33064:11;33040:23;:36::i;:::-;:49;33036:218;;33102:65;33117:11;33130:36;33154:11;33130:23;:36::i;:::-;33102:65;;;;;;;;;;;;;;;;;;;;;;33189:8;:12;;;33177:8;:24;33173:76;;33215:27;;;;;;;;;;;;;;;;;33173:76;33263:49;33289:11;33302:9;33263:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33263:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;33324:4:0;;32274:1059;-1:-1:-1;;;;;;32274:1059:0:o;47820:341::-;-1:-1:-1;;;;;47946:22:0;;47891:15;47946:22;;;:7;:22;;;;;:29;;47992:19;;47891:15;48016:122;48040:1;48036;:5;48016:122;;;48064:68;48076:55;48100:13;48115:12;48128:1;48115:15;;;;;;;;;;;;;;;;48076:23;:55::i;:::-;48064:7;;:68;:11;:68;:::i;:::-;48054:78;-1:-1:-1;48043:3:0;;48016:122;;;-1:-1:-1;;;47820:341:0;;;:::o;15450:108::-;15508:7;15534:1;15529;:6;;15522:14;;;;-1:-1:-1;15548:5:0;;;15450:108::o;18036:486::-;18135:4;-1:-1:-1;;;;;18156:17:0;;18148:34;;;;;-1:-1:-1;;;;;18148:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18148:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18205:15:0;;:8;:15;;;;;;;;;;;18195:25;;;18187:41;;;;;-1:-1:-1;;;;;18187:41:0;;;;;;;;;;;;-1:-1:-1;;;;;18187:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18251:14:0;;;;;;:7;:14;;;;;;;;18266:10;18251:26;;;;;;;;18241:36;;;18233:60;;;;;-1:-1:-1;;;;;18233:60:0;;;;;;;;;;;;-1:-1:-1;;;;;18233:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18318:15:0;;:8;:15;;;;;;;;;;;:27;;18338:6;18318:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;18300:15:0;;;:8;:15;;;;;;;;;;;:45;;;;18366:13;;;;;;;:25;;18384:6;18366:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;18350:13:0;;;:8;:13;;;;;;;;;;;:41;;;;18425:14;;;;;:7;:14;;;;;18440:10;18425:26;;;;;;;:38;;18456:6;18425:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;18396:14:0;;;;;;;:7;:14;;;;;;;;18411:10;18396:26;;;;;;;;:67;;;;18473:28;;;;;;;;;;;18396:14;;-1:-1:-1;;;;;;;;;;;18473:28:0;;;;;;;;;;-1:-1:-1;18513:4:0;18036:486;;;;;:::o;48304:376::-;-1:-1:-1;;;;;48456:22:0;;48407:15;48456:22;;;:7;:22;;;;;;;;48508:19;;;:6;:19;;;;;48565:24;48536:26;48550:11;48536:13;:26::i;:::-;:53;;;;;;;;;48532:79;;;48604:1;48597:8;;;;;;48532:79;48660:14;;;;48622:20;:33;;;;;;;;;;;:53;;;:37;:53;:::i;:::-;48615:60;48304:376;-1:-1:-1;;;;;48304:376:0:o;41421:294::-;41497:7;41536:19;;;:6;:19;;;;;41584:12;;;;41564:17;;;;:32;41560:104;;;41657:1;41650:8;;;;;41560:104;41692:17;;;;41675:12;;;;:35;;;:16;:35;:::i;14612:364::-;14670:9;14892:6;14888:32;;-1:-1:-1;14913:1:0;14906:8;;14888:32;-1:-1:-1;14930:5:0;;;14934:1;14930;:5;:1;14947:5;;;;;:10;14940:18;;;16272:331;16335:4;-1:-1:-1;;;;;16354:17:0;;16346:34;;;;;-1:-1:-1;;;;;16346:34:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16346:34:0;;;;;;;;;;;;;;;16412:10;16403:8;:20;;;;;;;;;;;16393:30;;;16385:46;;;;;-1:-1:-1;;;;;16385:46:0;;;;;;;;;;;;-1:-1:-1;;;;;16385:46:0;;;;;;;;;;;;;;;16470:10;16461:8;:20;;;;;;;;;;;:32;;16486:6;16461:32;:24;:32;:::i;:::-;16447:10;16438:8;:20;;;;;;;;;;;:55;;;;-1:-1:-1;;;;;16514:13:0;;;;;;:25;;16532:6;16514:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;16498:13:0;;:8;:13;;;;;;;;;;;;:41;;;;16549:33;;;;;;;16498:13;;16558:10;;-1:-1:-1;;;;;;;;;;;16549:33:0;;;;;;;;;-1:-1:-1;16594:4:0;16272:331;;;;:::o;12495:138::-;12564:4;12587:31;;;:19;:31;;;;;:41;12582:46;;;12495:138::o;12322:168::-;-1:-1:-1;;;;;12438:19:0;;12387:7;12438:19;;;:12;:19;;;;;;12387:7;;12422:36;;:15;:36::i;:::-;12470:1;:15;;12322:168;-1:-1:-1;;;12322:168:0:o;12882:316::-;12957:47;13007:31;;;:19;:31;;;;;13055:17;;13043:30;;;;13128:10;13085:24;13110:7;:13;;;13085:39;;;;;;;;;;;;;;;;:53;13078:61;;;;13172:20;;13151:17;;:41;;13144:49;;;47483:332;-1:-1:-1;;;;;47632:22:0;;47583:15;47632:22;;;:7;:22;;;;;47693:20;47663:26;47677:11;47663:13;:26::i;:::-;:50;;;;;;;;;47659:76;;;47728:1;47721:8;;;;;47659:76;47784:19;;;;:6;:19;;;;;;;;:25;;;47746:33;;;;;;;;:64;;;:37;:64;:::i;21379:27889::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21379:27889:0;;;-1:-1:-1;21379:27889:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://c3f1647d323e0cffef354e1b554cc7886ebd04e3ad3f4085375d6cb2486ddcdc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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