Address Details

0x7d984C24d2499D840eB3b7016077164e15E5faA6

Official

KUSDT Bitkub-Peg USDT (KUSDT) Last Balance Update: Block # 7879117
Created by 0xee44–91dcae at 0x76c7–5eba56

Balance

0 KUB

(@ /KUB)

Fetching tokens...

Contract name:
KUSDT




Optimization enabled
true
Compiler version
v0.8.0+commit.c7dfd78e




Optimization runs
200
EVM Version
default

Constructor Arguments

000000000000000000000000ee4464a2055d2346facf7813e862b92ffa91dcae000000000000000000000000ee4464a2055d2346facf7813e862b92ffa91dcae000000000000000000000000409cf41ee862df7024f289e9f2ea2f5d0d7f3eb40000000000000000000000000000000000000000000000000000000000000004

Arg [0] (address) : 0xee4464a2055d2346facf7813e862b92ffa91dcae
Arg [1] (address) : 0xee4464a2055d2346facf7813e862b92ffa91dcae
Arg [2] (address) : 0x409cf41ee862df7024f289e9f2ea2f5d0d7f3eb4
Arg [3] (uint256) : 4

              

Contract source code

/**
* Submitted for verification at blockscout.com on 2021-08-31 11:17:51.445772Z
*/
// SPDX-License-Identifier: MIT
// Sources flattened with hardhat v2.5.0 https://hardhat.org
// File contracts/interfaces/IKToken.sol
pragma solidity ^0.8.0;
interface IKToken {
function internalTransfer(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function externalTransfer(
address sender,
address recipient,
uint256 amount
) external returns (bool);
}
// File contracts/abstracts/Blacklist.sol
pragma solidity ^0.8.0;
abstract contract Blacklist {
mapping(address => bool) public blacklist;
event AddBlacklist(address indexed account, address indexed caller);
event RevokeBlacklist(address indexed account, address indexed caller);
modifier notInBlacklist(address account) {
require(!blacklist[account], "Address is in blacklist");
_;
}
modifier inBlacklist(address account) {
require(blacklist[account], "Address is not in blacklist");
_;
}
function _addBlacklist(address account) internal virtual notInBlacklist(account) {
blacklist[account] = true;
emit AddBlacklist(account, msg.sender);
}
function _revokeBlacklist(address account) internal virtual inBlacklist(account) {
blacklist[account] = false;
emit RevokeBlacklist(account, msg.sender);
}
}
// File contracts/abstracts/Pauseable.sol
pragma solidity ^0.8.0;
abstract contract Pauseable {
event Paused(address account);
event Unpaused(address account);
bool public paused;
constructor() {
paused = false;
}
modifier whenNotPaused() {
require(!paused, "Pauseable: paused");
_;
}
modifier whenPaused() {
require(paused, "Pauseable: not paused");
_;
}
function _pause() internal virtual whenNotPaused {
paused = true;
emit Paused(msg.sender);
}
function _unpause() internal virtual whenPaused {
paused = false;
emit Unpaused(msg.sender);
}
}
// File contracts/abstracts/Authorization.sol
pragma solidity ^0.8.0;
abstract contract Authorization {
address public committee;
address public admin;
event SetAdmin(address indexed oldAdmin, address indexed newAdmin, address indexed caller);
event SetCommittee(address indexed oldCommittee, address indexed newCommittee, address indexed caller);
modifier onlyAdmin() {
require(msg.sender == admin, "Restricted only admin");
_;
}
modifier onlyCommittee() {
require(msg.sender == committee, "Restricted only committee");
_;
}
modifier onlyAdminOrCommittee() {
require(msg.sender == committee || msg.sender == admin, "Restricted only committee or admin");
_;
}
function setAdmin(address _admin) external onlyCommittee {
emit SetAdmin(admin, _admin, msg.sender);
admin = _admin;
}
function setCommittee(address _committee) external onlyCommittee {
emit SetCommittee(committee, _committee, msg.sender);
committee = _committee;
}
}
// File contracts/interfaces/IKYCBitkubChain.sol
pragma solidity ^0.8.0;
interface IKYCBitkubChain {
function kycsLevel(address _addr) external view returns (uint256);
}
// File contracts/abstracts/KYCHandler.sol
pragma solidity ^0.8.0;
abstract contract KYCHandler {
IKYCBitkubChain public kyc;
uint256 public acceptedKycLevel;
bool public isActivatedOnlyKycAddress;
function _activateOnlyKycAddress() internal virtual {
isActivatedOnlyKycAddress = true;
}
function _setKYC(IKYCBitkubChain _kyc) internal virtual {
kyc = _kyc;
}
function _setAcceptedKycLevel(uint256 _kycLevel) internal virtual {
acceptedKycLevel = _kycLevel;
}
}
// File contracts/interfaces/IKAP20.sol
pragma solidity ^0.8.0;
interface IKAP20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowances(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function adminTransfer(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/token/KAP20.sol
pragma solidity ^0.8.0;
contract KAP20 is IKAP20, KYCHandler, Pauseable, Authorization, Blacklist {
mapping(address => uint256) _balances;
mapping(address => mapping(address => uint256)) public override allowances;
uint256 public override totalSupply;
string public override name;
string public override symbol;
uint8 public override decimals;
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals,
address _admin,
address _committee,
IKYCBitkubChain _kyc,
uint256 _acceptedKycLevel
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
kyc = _kyc;
acceptedKycLevel = _acceptedKycLevel;
admin = _admin;
committee = _committee;
}
/**
* @dev See {IKAP20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IKAP20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount)
public
virtual
override
whenNotPaused
notInBlacklist(msg.sender)
returns (bool)
{
_transfer(msg.sender, recipient, amount);
return true;
}
/**
* @dev See {IKAP20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount)
public
virtual
override
notInBlacklist(msg.sender)
returns (bool)
{
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override whenNotPaused notInBlacklist(sender) notInBlacklist(recipient) returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = allowances[sender][msg.sender];
require(currentAllowance >= amount, "KAP20: transfer amount exceeds allowance");
unchecked {
_approve(sender, msg.sender, currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(msg.sender, spender, allowances[msg.sender][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = allowances[msg.sender][spender];
require(currentAllowance >= subtractedValue, "KAP20: decreased allowance below zero");
unchecked {
_approve(msg.sender, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "KAP20: transfer from the zero address");
require(recipient != address(0), "KAP20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "KAP20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "KAP20: mint to the zero address");
totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "KAP20: burn from the zero address");
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "KAP20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "KAP20: approve from the zero address");
require(spender != address(0), "KAP20: approve to the zero address");
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function adminTransfer(
address sender,
address recipient,
uint256 amount
) public override onlyCommittee returns (bool) {
require(_balances[sender] >= amount, "KAP20: transfer amount exceed balance");
require(recipient != address(0), "KAP20: transfer to zero address");
_balances[sender] -= amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
return true;
}
function pause() public onlyCommittee {
_pause();
}
function unpause() public onlyCommittee {
_unpause();
}
function addBlacklist(address account) public onlyCommittee {
_addBlacklist(account);
}
function revokeBlacklist(address account) public onlyCommittee {
_revokeBlacklist(account);
}
function activateOnlyKycAddress() public onlyCommittee {
_activateOnlyKycAddress();
}
function setKYC(IKYCBitkubChain _kyc) public onlyCommittee {
_setKYC(_kyc);
}
function setAcceptedKycLevel(uint256 _kycLevel) public onlyCommittee {
_setAcceptedKycLevel(_kycLevel);
}
}
// File contracts/KUSDT.sol
pragma solidity ^0.8.0;
contract KUSDT is KAP20, IKToken {
constructor(
address admin,
address committee,
IKYCBitkubChain kyc,
uint256 acceptedKycLevel
) KAP20("Bitkub-Peg USDT", "KUSDT", 18, admin, committee, kyc, acceptedKycLevel) {
_mint(0x6002Bd66c5DA67b812CCAaB16716dBF57BD2aA18, 3000000 ether);
}
function internalTransfer(
address sender,
address recipient,
uint256 amount
) external override whenNotPaused onlyAdmin returns (bool) {
require(
kyc.kycsLevel(sender) >= acceptedKycLevel && kyc.kycsLevel(recipient) >= acceptedKycLevel,
"Only internal purpose"
);
_transfer(sender, recipient, amount);
return true;
}
function externalTransfer(
address sender,
address recipient,
uint256 amount
) external override whenNotPaused onlyAdmin returns (bool) {
require(kyc.kycsLevel(sender) >= acceptedKycLevel, "Only internal purpose");
_transfer(sender, recipient, amount);
return true;
}
function mint(address account, uint256 amount) external virtual onlyCommittee returns (bool) {
_mint(account, amount);
return true;
}
function burn(address account, uint256 amount) external virtual onlyCommittee returns (bool) {
_burn(account, amount);
return true;
}
}

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin","internalType":"address"},{"type":"address","name":"committee","internalType":"address"},{"type":"address","name":"kyc","internalType":"contract IKYCBitkubChain"},{"type":"uint256","name":"acceptedKycLevel","internalType":"uint256"}]},{"type":"event","name":"AddBlacklist","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"caller","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RevokeBlacklist","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"caller","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":true},{"type":"address","name":"newAdmin","internalType":"address","indexed":true},{"type":"address","name":"caller","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetCommittee","inputs":[{"type":"address","name":"oldCommittee","internalType":"address","indexed":true},{"type":"address","name":"newCommittee","internalType":"address","indexed":true},{"type":"address","name":"caller","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"acceptedKycLevel","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"activateOnlyKycAddress","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addBlacklist","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"adminTransfer","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowances","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"blacklist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"committee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"externalTransfer","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"internalTransfer","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isActivatedOnlyKycAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IKYCBitkubChain"}],"name":"kyc","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeBlacklist","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAcceptedKycLevel","inputs":[{"type":"uint256","name":"_kycLevel","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCommittee","inputs":[{"type":"address","name":"_committee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setKYC","inputs":[{"type":"address","name":"_kyc","internalType":"contract IKYCBitkubChain"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
            

Contract Byte Code

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638456cb591161010f578063a9059cbb116100a2578063de9c2a6b11610071578063de9c2a6b146103dc578063f71c559c146103e4578063f851a440146103f7578063f9f92be4146103ff576101f0565b8063a9059cbb1461039b578063bddae40e146103ae578063d864e740146103c1578063da72c1e8146103c9576101f0565b80639cfe42da116100de5780639cfe42da1461035a5780639dc29fac1461036d578063a1d5ec4b14610380578063a457c2d714610388576101f0565b80638456cb59146103225780638e39103c1461032a57806390d6b45f1461033d57806395d89b4114610352576101f0565b80633f4ba83a1161018757806359e026f71161015657806359e026f7146102e15780635c975abb146102f4578063704b6c02146102fc57806370a082311461030f576101f0565b80633f4ba83a146102a057806340c10f19146102a8578063483a83df146102bb57806355b6ed5c146102ce576101f0565b806323b872dd116101c357806323b872dd14610250578063313ce56714610263578063394b652b14610278578063395093511461028d576101f0565b806306fdde03146101f5578063095ea7b31461021357806318160ddd146102335780631ae878d314610248575b600080fd5b6101fd610412565b60405161020a9190611472565b60405180910390f35b6102266102213660046113f8565b6104a0565b60405161020a9190611467565b61023b6104f1565b60405161020a9190611939565b61023b6104f7565b61022661025e3660046113b8565b6104fd565b61026b610607565b60405161020a9190611942565b61028b610286366004611423565b610610565b005b61022661029b3660046113f8565b61064c565b61028b610691565b6102266102b63660046113f8565b6106cb565b61028b6102c936600461135d565b610708565b61023b6102dc366004611380565b610741565b6102266102ef3660046113b8565b61075e565b6102266108ec565b61028b61030a36600461135d565b6108fa565b61023b61031d36600461135d565b610989565b61028b6109a4565b61028b61033836600461135d565b6109dc565b610345610a15565b60405161020a9190611453565b6101fd610a24565b61028b61036836600461135d565b610a31565b61022661037b3660046113f8565b610a6a565b61028b610aa7565b6102266103963660046113f8565b610adf565b6102266103a93660046113f8565b610b30565b61028b6103bc36600461135d565b610b96565b610345610c33565b6102266103d73660046113b8565b610c48565b610226610d78565b6102266103f23660046113b8565b610d81565b610345610e09565b61022661040d36600461135d565b610e18565b6008805461041f9061197f565b80601f016020809104026020016040519081016040528092919081815260200182805461044b9061197f565b80156104985780601f1061046d57610100808354040283529160200191610498565b820191906000526020600020905b81548152906001019060200180831161047b57829003601f168201915b505050505081565b3360008181526004602052604081205490919060ff16156104dc5760405162461bcd60e51b81526004016104d3906115c0565b60405180910390fd5b6104e7338585610e2d565b5060019392505050565b60075481565b60015481565b600254600090610100900460ff16156105285760405162461bcd60e51b81526004016104d39061163c565b6001600160a01b038416600090815260046020526040902054849060ff16156105635760405162461bcd60e51b81526004016104d3906115c0565b6001600160a01b038416600090815260046020526040902054849060ff161561059e5760405162461bcd60e51b81526004016104d3906115c0565b6105a9868686610ee1565b6001600160a01b0386166000908152600660209081526040808320338452909152902054848110156105ed5760405162461bcd60e51b81526004016104d390611549565b6105fa8733878403610e2d565b5060019695505050505050565b600a5460ff1681565b6002546201000090046001600160a01b031633146106405760405162461bcd60e51b81526004016104d39061169e565b61064981610fe3565b50565b3360008181526006602090815260408083206001600160a01b03871684529091528120549091610688918590610683908690611950565b610e2d565b50600192915050565b6002546201000090046001600160a01b031633146106c15760405162461bcd60e51b81526004016104d39061169e565b6106c9610fe8565b565b6002546000906201000090046001600160a01b031633146106fe5760405162461bcd60e51b81526004016104d39061169e565b6106888383611054565b6002546201000090046001600160a01b031633146107385760405162461bcd60e51b81526004016104d39061169e565b610649816110f6565b600660209081526000928352604080842090915290825290205481565b600254600090610100900460ff16156107895760405162461bcd60e51b81526004016104d39061163c565b6003546001600160a01b031633146107b35760405162461bcd60e51b81526004016104d390611591565b6001546000546040516306f19a8d60e21b81526001600160a01b0390911690631bc66a34906107e6908890600401611453565b60206040518083038186803b1580156107fe57600080fd5b505afa158015610812573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610836919061143b565b101580156108c557506001546000546040516306f19a8d60e21b81526001600160a01b0390911690631bc66a3490610872908790600401611453565b60206040518083038186803b15801561088a57600080fd5b505afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c2919061143b565b10155b6108e15760405162461bcd60e51b81526004016104d390611819565b6104e7848484610ee1565b600254610100900460ff1681565b6002546201000090046001600160a01b0316331461092a5760405162461bcd60e51b81526004016104d39061169e565b60035460405133916001600160a01b03848116929116907fc51248b3e510a1244e01043dffdc0132d10194bd4506382cbcf83d05f6ec57ef90600090a4600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526005602052604090205490565b6002546201000090046001600160a01b031633146109d45760405162461bcd60e51b81526004016104d39061169e565b6106c9611118565b6002546201000090046001600160a01b03163314610a0c5760405162461bcd60e51b81526004016104d39061169e565b6106498161117f565b6000546001600160a01b031681565b6009805461041f9061197f565b6002546201000090046001600160a01b03163314610a615760405162461bcd60e51b81526004016104d39061169e565b61064981611205565b6002546000906201000090046001600160a01b03163314610a9d5760405162461bcd60e51b81526004016104d39061169e565b610688838361128f565b6002546201000090046001600160a01b03163314610ad75760405162461bcd60e51b81526004016104d39061169e565b6106c961134e565b3360009081526006602090815260408083206001600160a01b038616845290915281205482811015610b235760405162461bcd60e51b81526004016104d39061174f565b6104e73385858403610e2d565b600254600090610100900460ff1615610b5b5760405162461bcd60e51b81526004016104d39061163c565b3360008181526004602052604090205460ff1615610b8b5760405162461bcd60e51b81526004016104d3906115c0565b6104e7338585610ee1565b6002546201000090046001600160a01b03163314610bc65760405162461bcd60e51b81526004016104d39061169e565b60025460405133916001600160a01b03848116926201000090920416907fc1a9f7853db3b65cf432e0bd18dbf895a92c49293134f76a9f91c6438453b8a490600090a4600280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6002546201000090046001600160a01b031681565b6002546000906201000090046001600160a01b03163314610c7b5760405162461bcd60e51b81526004016104d39061169e565b6001600160a01b038416600090815260056020526040902054821115610cb35760405162461bcd60e51b81526004016104d3906118f4565b6001600160a01b038316610cd95760405162461bcd60e51b81526004016104d390611848565b6001600160a01b03841660009081526005602052604081208054849290610d01908490611968565b90915550506001600160a01b03831660009081526005602052604081208054849290610d2e908490611950565b92505081905550826001600160a01b0316846001600160a01b03166000805160206119e683398151915284604051610d669190611939565b60405180910390a35060019392505050565b60025460ff1681565b600254600090610100900460ff1615610dac5760405162461bcd60e51b81526004016104d39061163c565b6003546001600160a01b03163314610dd65760405162461bcd60e51b81526004016104d390611591565b6001546000546040516306f19a8d60e21b81526001600160a01b0390911690631bc66a3490610872908890600401611453565b6003546001600160a01b031681565b60046020526000908152604090205460ff1681565b6001600160a01b038316610e535760405162461bcd60e51b81526004016104d390611794565b6001600160a01b038216610e795760405162461bcd60e51b81526004016104d390611507565b6001600160a01b0380841660008181526006602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610ed4908590611939565b60405180910390a3505050565b6001600160a01b038316610f075760405162461bcd60e51b81526004016104d3906115f7565b6001600160a01b038216610f2d5760405162461bcd60e51b81526004016104d3906116d5565b6001600160a01b03831660009081526005602052604090205481811015610f665760405162461bcd60e51b81526004016104d39061187f565b6001600160a01b03808516600090815260056020526040808220858503905591851681529081208054849290610f9d908490611950565b92505081905550826001600160a01b0316846001600160a01b03166000805160206119e683398151915284604051610fd59190611939565b60405180910390a350505050565b600155565b600254610100900460ff1661100f5760405162461bcd60e51b81526004016104d3906118c5565b6002805461ff00191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9061104a903390611453565b60405180910390a1565b6001600160a01b03821661107a5760405162461bcd60e51b81526004016104d390611667565b806007600082825461108c9190611950565b90915550506001600160a01b038216600090815260056020526040812080548392906110b9908490611950565b90915550506040516001600160a01b038316906000906000805160206119e6833981519152906110ea908590611939565b60405180910390a35050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600254610100900460ff16156111405760405162461bcd60e51b81526004016104d39061163c565b6002805461ff0019166101001790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589061104a903390611453565b6001600160a01b038116600090815260046020526040902054819060ff166111b95760405162461bcd60e51b81526004016104d390611718565b6001600160a01b038216600081815260046020526040808220805460ff19169055513392917f6690dc53a3b1d37db94233f7c004408862ea909761dc5760b0e925276754f87591a35050565b6001600160a01b038116600090815260046020526040902054819060ff16156112405760405162461bcd60e51b81526004016104d3906115c0565b6001600160a01b038216600081815260046020526040808220805460ff19166001179055513392917fef674dcdab521405fef2bf4b5d2c6a6434e3ab02bc5a94fb89dd035704b83b0991a35050565b6001600160a01b0382166112b55760405162461bcd60e51b81526004016104d3906117d8565b6001600160a01b038216600090815260056020526040902054818110156112ee5760405162461bcd60e51b81526004016104d3906114c5565b6001600160a01b038316600090815260056020526040812083830390556007805484929061131d908490611968565b90915550506040516000906001600160a01b038516906000805160206119e683398151915290610ed4908690611939565b6002805460ff19166001179055565b60006020828403121561136e578081fd5b8135611379816119d0565b9392505050565b60008060408385031215611392578081fd5b823561139d816119d0565b915060208301356113ad816119d0565b809150509250929050565b6000806000606084860312156113cc578081fd5b83356113d7816119d0565b925060208401356113e7816119d0565b929592945050506040919091013590565b6000806040838503121561140a578182fd5b8235611415816119d0565b946020939093013593505050565b600060208284031215611434578081fd5b5035919050565b60006020828403121561144c578081fd5b5051919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b8181101561149e57858101830151858201604001528201611482565b818111156114af5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f4b415032303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f4b415032303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526028908201527f4b415032303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252601590820152742932b9ba3934b1ba32b21037b7363c9030b236b4b760591b604082015260600190565b60208082526017908201527f4164647265737320697320696e20626c61636b6c697374000000000000000000604082015260600190565b60208082526025908201527f4b415032303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526011908201527014185d5cd958589b194e881c185d5cd959607a1b604082015260600190565b6020808252601f908201527f4b415032303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b60208082526019908201527f52657374726963746564206f6e6c7920636f6d6d697474656500000000000000604082015260600190565b60208082526023908201527f4b415032303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601b908201527f41646472657373206973206e6f7420696e20626c61636b6c6973740000000000604082015260600190565b60208082526025908201527f4b415032303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b60208082526024908201527f4b415032303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526021908201527f4b415032303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252601590820152744f6e6c7920696e7465726e616c20707572706f736560581b604082015260600190565b6020808252601f908201527f4b415032303a207472616e7366657220746f207a65726f206164647265737300604082015260600190565b60208082526026908201527f4b415032303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526015908201527414185d5cd958589b194e881b9bdd081c185d5cd959605a1b604082015260600190565b60208082526025908201527f4b415032303a207472616e7366657220616d6f756e74206578636565642062616040820152646c616e636560d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60008219821115611963576119636119ba565b500190565b60008282101561197a5761197a6119ba565b500390565b60028104600182168061199357607f821691505b602082108114156119b457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461064957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bb66c07e7d2bc475378efcd16c3ef5059554fc824f3fff97ff4bdafa27be515364736f6c63430008000033