Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- HiveFlashArbV6
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2026-04-05T08:31:20.389990Z
Constructor Arguments
000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f305000000000000000000000000d79bfb86fa06e8782b401bc0197d92563602d2ab0000000000000000000000000deed1486bc52aa0d3e6f8849cec5add6598a162
Arg [0] (address) : 0xa1077a294dde1b09bb078844df40758a5d0f9a27
Arg [1] (address) : 0xefd766ccb38eaf1dfd701853bfce31359239f305
Arg [2] (address) : 0xd79bfb86fa06e8782b401bc0197d92563602d2ab
Arg [3] (address) : 0x0deed1486bc52aa0d3e6f8849cec5add6598a162
HiveFlashArbV6.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
}
interface IUniswapV2Router {
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function getAmountsOut(
uint amountIn,
address[] calldata path
) external view returns (uint[] memory amounts);
}
interface IUniswapV2Pair {
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112, uint112, uint32);
}
interface ILiquidLoansTroveManager {
function redeemCollateral(
uint256 _USDLamount,
address _firstRedemptionHint,
address _upperPartialRedemptionHint,
address _lowerPartialRedemptionHint,
uint256 _partialRedemptionHintNICR,
uint256 _maxIterations,
uint256 _maxFeePercentage
) external;
}
interface IWPLS {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
/**
* HiveFlashArbV6 — Atomic USDL redemption via DAI flash swap
*
* Fix over V5: token0/token1 comparison now uses the pair's actual token addresses
* rather than comparing against the DAI constant. The WPLS/DAI pair on PulseChain
* has token0 = Ethereum-origin DAI which has a different address to the PulseChain
* DAI constant stored in this contract. V5 always requested the wrong flash output.
*
* Flow:
* 1. executeRedemption() called by whitelisted wallet
* 2. Flash borrow DAI from WPLS/DAI V2 pair — determined by reading token0/token1
* from the pair and checking which side is NOT WPLS (i.e. is DAI)
* 3. uniswapV2Call() callback:
* a. Swap DAI → WPLS → USDL on PulseX V2
* b. redeemCollateral() on Liquid Loans → receive PLS
* c. Wrap PLS → WPLS
* d. Swap WPLS → DAI on PulseX V2
* e. Repay DAI flash loan (borrowed + 0.3% fee)
* f. Send remaining DAI profit to caller
*/
contract HiveFlashArbV6 {
address public owner;
// PulseChain token addresses
address public immutable wpls; // 0xA1077a294dDE1B09bB078844df40758a5D0f9a27
address public immutable dai; // 0xefD766cCb38EaF1dfd701853BFCe31359239F305
address public vaultManager; // Liquid Loans VaultManager
address public usdlToken; // USDL token
// PulseX V2 router
address private constant PULSEX_V2_ROUTER = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
mapping(address => bool) public whitelist;
// Flash swap state
address private _caller;
address private _hint1;
address private _hint2;
address private _hint3;
uint256 private _partialNICR;
uint256 private _maxFee;
uint256 private _minProfit;
uint256 private _borrowAmount;
bool private _inFlashSwap;
// Which token slot DAI occupies in the flash pair — set in executeRedemption, read in callback
bool private _daiIsToken0;
event RedemptionExecuted(address indexed caller, uint256 usdlRedeemed, uint256 daiProfit);
event MemberAdded(address indexed member);
event MemberRemoved(address indexed member);
modifier onlyOwner() {
require(msg.sender == owner, "HiveFlash: not owner");
_;
}
modifier onlyMember() {
require(whitelist[msg.sender] || msg.sender == owner, "HiveFlash: not member");
_;
}
constructor(
address _wpls,
address _dai,
address _vaultManager,
address _usdlToken
) {
owner = msg.sender;
wpls = _wpls;
dai = _dai;
vaultManager = _vaultManager;
usdlToken = _usdlToken;
whitelist[msg.sender] = true;
}
receive() external payable {}
// ── Whitelist management ───────────────────────────────────────────────
function addMember(address m) external onlyOwner {
whitelist[m] = true;
emit MemberAdded(m);
}
function addMembers(address[] calldata members) external onlyOwner {
for (uint i = 0; i < members.length; i++) {
whitelist[members[i]] = true;
emit MemberAdded(members[i]);
}
}
function removeMember(address m) external onlyOwner {
whitelist[m] = false;
emit MemberRemoved(m);
}
function isMember(address addr) external view returns (bool) {
return whitelist[addr] || addr == owner;
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "HiveFlash: zero address");
owner = newOwner;
}
// ── Admin setters ──────────────────────────────────────────────────────
function setVaultManager(address _vm) external onlyOwner { vaultManager = _vm; }
function setUsdlToken(address _u) external onlyOwner { usdlToken = _u; }
// ── Atomic USDL Redemption ─────────────────────────────────────────────
function executeRedemption(
uint256 daiBorrowAmount,
address hint1,
address hint2,
address hint3,
uint256 partialNICR,
uint256 maxFee,
address wplsDaiPair,
uint256 minProfit
) external onlyMember {
require(!_inFlashSwap, "HiveFlash: reentrant");
require(daiBorrowAmount > 0, "HiveFlash: zero borrow");
require(wplsDaiPair != address(0), "HiveFlash: zero pair");
_caller = msg.sender;
_hint1 = hint1;
_hint2 = hint2;
_hint3 = hint3;
_partialNICR = partialNICR;
_maxFee = maxFee;
_minProfit = minProfit;
_borrowAmount = daiBorrowAmount;
_inFlashSwap = true;
IUniswapV2Pair pair = IUniswapV2Pair(wplsDaiPair);
// KEY FIX: determine which token slot is DAI by checking which token is NOT WPLS.
// V5 compared token0 against the dai constant — but the pair's token0 is the
// Ethereum-origin DAI address which differs from our PulseChain dai constant,
// causing the wrong amount slot to be requested every time.
address token0 = pair.token0();
address token1 = pair.token1();
bool daiIsToken0;
if (token0 == wpls) {
// token1 must be DAI
daiIsToken0 = false;
} else if (token1 == wpls) {
// token0 must be DAI
daiIsToken0 = true;
} else {
revert("HiveFlash: pair does not contain WPLS");
}
_daiIsToken0 = daiIsToken0;
uint256 amount0Out = daiIsToken0 ? daiBorrowAmount : 0;
uint256 amount1Out = daiIsToken0 ? 0 : daiBorrowAmount;
pair.swap(amount0Out, amount1Out, address(this), abi.encode(wplsDaiPair));
}
/**
* PulseX V2 flash swap callback.
*/
function uniswapV2Call(
address sender,
uint256,
uint256,
bytes calldata data
) external {
require(_inFlashSwap, "HiveFlash: not in flash swap");
address wplsDaiPair = abi.decode(data, (address));
require(msg.sender == wplsDaiPair, "HiveFlash: invalid pair callback");
require(sender == address(this), "HiveFlash: invalid sender");
_inFlashSwap = false;
uint256 daiBorrow = _borrowAmount;
uint256 daiRepay = (daiBorrow * 1000) / 997 + 1;
// ── Step 1: Swap DAI → WPLS → USDL on PulseX V2 ──────────────────
uint256 daiBalance = IERC20(dai).balanceOf(address(this));
require(daiBalance >= daiBorrow, "HiveFlash: insufficient DAI");
IERC20(dai).approve(PULSEX_V2_ROUTER, daiBalance);
address[] memory buyPath = new address[](3);
buyPath[0] = dai;
buyPath[1] = wpls;
buyPath[2] = usdlToken;
IUniswapV2Router(PULSEX_V2_ROUTER).swapExactTokensForTokens(
daiBalance,
0,
buyPath,
address(this),
block.timestamp + 300
);
// ── Step 2: Redeem USDL → PLS via Liquid Loans ────────────────────
uint256 usdlBalance = IERC20(usdlToken).balanceOf(address(this));
require(usdlBalance > 0, "HiveFlash: no USDL acquired");
IERC20(usdlToken).approve(vaultManager, usdlBalance);
ILiquidLoansTroveManager(vaultManager).redeemCollateral(
usdlBalance,
_hint1,
_hint2,
_hint3,
_partialNICR,
0,
_maxFee
);
// ── Step 3: Wrap PLS → WPLS ────────────────────────────────────────
uint256 plsReceived = address(this).balance;
require(plsReceived > 0, "HiveFlash: no PLS from redemption");
IWPLS(wpls).deposit{value: plsReceived}();
// ── Step 4: Swap WPLS → DAI on PulseX V2 ──────────────────────────
uint256 wplsBalance = IERC20(wpls).balanceOf(address(this));
require(wplsBalance > 0, "HiveFlash: no WPLS to sell");
IERC20(wpls).approve(PULSEX_V2_ROUTER, wplsBalance);
address[] memory sellPath = new address[](2);
sellPath[0] = wpls;
sellPath[1] = dai;
IUniswapV2Router(PULSEX_V2_ROUTER).swapExactTokensForTokens(
wplsBalance,
0,
sellPath,
address(this),
block.timestamp + 300
);
// ── Step 5: Repay DAI flash loan ───────────────────────────────────
uint256 daiNow = IERC20(dai).balanceOf(address(this));
require(daiNow >= daiRepay, "HiveFlash: cannot repay flash loan");
IERC20(dai).transfer(wplsDaiPair, daiRepay);
// ── Step 6: Send DAI profit to caller ──────────────────────────────
uint256 daiProfit = IERC20(dai).balanceOf(address(this));
require(daiProfit >= _minProfit, "HiveFlash: profit below minimum");
if (daiProfit > 0) {
IERC20(dai).transfer(_caller, daiProfit);
}
emit RedemptionExecuted(_caller, usdlBalance, daiProfit);
}
// ── Rescue functions ───────────────────────────────────────────────────
function rescueETH() external onlyOwner {
(bool ok,) = payable(owner).call{value: address(this).balance}("");
require(ok, "HiveFlash: ETH rescue failed");
}
function rescueTokens(address token, uint256 amount) external onlyOwner {
IERC20(token).transfer(owner, amount);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"HiveFlashArbV6.sol":"HiveFlashArbV6"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_wpls","internalType":"address"},{"type":"address","name":"_dai","internalType":"address"},{"type":"address","name":"_vaultManager","internalType":"address"},{"type":"address","name":"_usdlToken","internalType":"address"}]},{"type":"event","name":"MemberAdded","inputs":[{"type":"address","name":"member","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MemberRemoved","inputs":[{"type":"address","name":"member","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RedemptionExecuted","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"usdlRedeemed","internalType":"uint256","indexed":false},{"type":"uint256","name":"daiProfit","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addMember","inputs":[{"type":"address","name":"m","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addMembers","inputs":[{"type":"address[]","name":"members","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"dai","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeRedemption","inputs":[{"type":"uint256","name":"daiBorrowAmount","internalType":"uint256"},{"type":"address","name":"hint1","internalType":"address"},{"type":"address","name":"hint2","internalType":"address"},{"type":"address","name":"hint3","internalType":"address"},{"type":"uint256","name":"partialNICR","internalType":"uint256"},{"type":"uint256","name":"maxFee","internalType":"uint256"},{"type":"address","name":"wplsDaiPair","internalType":"address"},{"type":"uint256","name":"minProfit","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isMember","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeMember","inputs":[{"type":"address","name":"m","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setUsdlToken","inputs":[{"type":"address","name":"_u","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setVaultManager","inputs":[{"type":"address","name":"_vm","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"uniswapV2Call","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"usdlToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"vaultManager","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"whitelist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wpls","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60c06040523480156200001157600080fd5b506040516200203f3803806200203f8339810160408190526200003491620000b9565b60008054336001600160a01b0319918216811783556001600160a01b0396871660805294861660a05260018054821694871694909417845560028054909116929095169190911790935590825260036020526040909120805460ff1916909117905562000116565b80516001600160a01b0381168114620000b457600080fd5b919050565b60008060008060808587031215620000d057600080fd5b620000db856200009c565b9350620000eb602086016200009c565b9250620000fb604086016200009c565b91506200010b606086016200009c565b905092959194509250565b60805160a051611e9a620001a5600039600081816103680152818161056e0152818161065b015281816106f601528181610cec01528181610de101528181610ed701528181610f5d01526110560152600081816102540152818161074a01528181610a8001528181610b0801528181610bff01528181610c980152818161151601526115570152611e9a6000f3fe6080604052600436106101025760003560e01c80638fef276e11610095578063a230c52411610064578063a230c524146102d6578063b543503e146102f6578063ca6d56dc14610316578063f2fde38b14610336578063f4b9fa751461035657600080fd5b80638fef276e14610222578063927ef7fa146102425780639b19251a146102765780639d25a4c9146102b657600080fd5b80636f0668fd116100d15780636f0668fd146101855780636f4d469b146101a55780638a4adf24146101c55780638da5cb5b1461020257600080fd5b80630b1ca49a1461010e57806310d1e85c1461013057806320800a0014610150578063573761981461016557600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5061012e6101293660046119bc565b61038a565b005b34801561013c57600080fd5b5061012e61014b3660046119e0565b610406565b34801561015c57600080fd5b5061012e61111f565b34801561017157600080fd5b5061012e610180366004611a76565b6111ef565b34801561019157600080fd5b5061012e6101a0366004611aa2565b611295565b3480156101b157600080fd5b5061012e6101c0366004611b27565b6116c5565b3480156101d157600080fd5b506001546101e5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020e57600080fd5b506000546101e5906001600160a01b031681565b34801561022e57600080fd5b506002546101e5906001600160a01b031681565b34801561024e57600080fd5b506101e57f000000000000000000000000000000000000000000000000000000000000000081565b34801561028257600080fd5b506102a66102913660046119bc565b60036020526000908152604090205460ff1681565b60405190151581526020016101f9565b3480156102c257600080fd5b5061012e6102d13660046119bc565b6117bd565b3480156102e257600080fd5b506102a66102f13660046119bc565b611809565b34801561030257600080fd5b5061012e6103113660046119bc565b611843565b34801561032257600080fd5b5061012e6103313660046119bc565b61188f565b34801561034257600080fd5b5061012e6103513660046119bc565b611905565b34801561036257600080fd5b506101e57f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031633146103bd5760405162461bcd60e51b81526004016103b490611b9c565b60405180910390fd5b6001600160a01b038116600081815260036020526040808220805460ff19169055517f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de6844929190a250565b600c5460ff166104585760405162461bcd60e51b815260206004820152601c60248201527f48697665466c6173683a206e6f7420696e20666c61736820737761700000000060448201526064016103b4565b6000610466828401846119bc565b9050336001600160a01b038216146104c05760405162461bcd60e51b815260206004820181905260248201527f48697665466c6173683a20696e76616c696420706169722063616c6c6261636b60448201526064016103b4565b6001600160a01b03861630146105185760405162461bcd60e51b815260206004820152601960248201527f48697665466c6173683a20696e76616c69642073656e6465720000000000000060448201526064016103b4565b600c805460ff19169055600b5460006103e5610536836103e8611be0565b6105409190611bf7565b61054b906001611c19565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611c2c565b90508281101561062b5760405162461bcd60e51b815260206004820152601b60248201527f48697665466c6173683a20696e73756666696369656e7420444149000000000060448201526064016103b4565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d96004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063095ea7b3906044016020604051808303816000875af11580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190611c45565b5060408051600380825260808201909252600091602082016060803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061072857610728611c7d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061077c5761077c611c7d565b6001600160a01b03928316602091820292909201015260028054835192169183919081106107ac576107ac611c7d565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d96338ed173983600084306107ef4261012c611c19565b6040518663ffffffff1660e01b815260040161080f959493929190611c93565b6000604051808303816000875af115801561082e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108569190810190611d04565b506002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190611c2c565b9050600081116109165760405162461bcd60e51b815260206004820152601b60248201527f48697665466c6173683a206e6f205553444c206163717569726564000000000060448201526064016103b4565b60025460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af115801561096b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098f9190611c45565b50600154600554600654600754600854600954604051635e69ba9360e11b8152600481018890526001600160a01b039586166024820152938516604485015291841660648401526084830152600060a483015260c482015291169063bcd375269060e401600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b50479250505080610a7e5760405162461bcd60e51b815260206004820152602160248201527f48697665466c6173683a206e6f20504c532066726f6d20726564656d7074696f6044820152603760f91b60648201526084016103b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506370a082319150602401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611c2c565b905060008111610bcf5760405162461bcd60e51b815260206004820152601a60248201527f48697665466c6173683a206e6f2057504c5320746f2073656c6c00000000000060448201526064016103b4565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d96004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063095ea7b3906044016020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190611c45565b506040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610cca57610cca611c7d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610d1e57610d1e611c7d565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d96338ed17398360008430610d614261012c611c19565b6040518663ffffffff1660e01b8152600401610d81959493929190611c93565b6000604051808303816000875af1158015610da0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dc89190810190611d04565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611c2c565b905087811015610eb15760405162461bcd60e51b815260206004820152602260248201527f48697665466c6173683a2063616e6e6f7420726570617920666c617368206c6f60448201526130b760f11b60648201526084016103b4565b60405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018a90527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f449190611c45565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd09190611c2c565b9050600a548110156110245760405162461bcd60e51b815260206004820152601f60248201527f48697665466c6173683a2070726f6669742062656c6f77206d696e696d756d0060448201526064016103b4565b80156110c5576004805460405163a9059cbb60e01b81526001600160a01b0391821692810192909252602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190611c45565b505b60045460408051888152602081018490526001600160a01b03909216917f6d35b7d7146608d652fd82f6aad8435caf3165aa7ad1dc0a629ccdbc3242851b910160405180910390a250505050505050505050505050505050565b6000546001600160a01b031633146111495760405162461bcd60e51b81526004016103b490611b9c565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114611196576040519150601f19603f3d011682016040523d82523d6000602084013e61119b565b606091505b50509050806111ec5760405162461bcd60e51b815260206004820152601c60248201527f48697665466c6173683a2045544820726573637565206661696c65640000000060448201526064016103b4565b50565b6000546001600160a01b031633146112195760405162461bcd60e51b81526004016103b490611b9c565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af115801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190611c45565b505050565b3360009081526003602052604090205460ff16806112bd57506000546001600160a01b031633145b6113015760405162461bcd60e51b81526020600482015260156024820152742434bb32a33630b9b41d103737ba1036b2b6b132b960591b60448201526064016103b4565b600c5460ff161561134b5760405162461bcd60e51b8152602060048201526014602482015273121a5d99519b185cda0e881c99595b9d1c985b9d60621b60448201526064016103b4565b600088116113945760405162461bcd60e51b815260206004820152601660248201527548697665466c6173683a207a65726f20626f72726f7760501b60448201526064016103b4565b6001600160a01b0382166113e15760405162461bcd60e51b81526020600482015260146024820152732434bb32a33630b9b41d103d32b937903830b4b960611b60448201526064016103b4565b60048054336001600160a01b03199182161782556005805482166001600160a01b038b8116919091179091556006805483168a8316179055600780549092168882161790915560088690556009859055600a839055600b8a9055600c805460ff1916600117905560408051630dfe168160e01b815290518593600093851692630dfe168192818301926020928290030181865afa158015611486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114aa9190611dc2565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611dc2565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603611555575060006115ec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611596575060016115ec565b60405162461bcd60e51b815260206004820152602560248201527f48697665466c6173683a207061697220646f6573206e6f7420636f6e7461696e6044820152642057504c5360d81b60648201526084016103b4565b600c805461ff0019166101008315150217905560008161160d57600061160f565b8c5b905060008261161e578d611621565b60005b9050856001600160a01b031663022c0d9f8383308c60405160200161165591906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016116839493929190611ddf565b600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b505050505050505050505050505050505050565b6000546001600160a01b031633146116ef5760405162461bcd60e51b81526004016103b490611b9c565b60005b818110156112905760016003600085858581811061171257611712611c7d565b905060200201602081019061172791906119bc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061176157611761611c7d565b905060200201602081019061177691906119bc565b6001600160a01b03167fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd91460405160405180910390a2806117b581611e4b565b9150506116f2565b6000546001600160a01b031633146117e75760405162461bcd60e51b81526004016103b490611b9c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604081205460ff168061183d57506000546001600160a01b038381169116145b92915050565b6000546001600160a01b0316331461186d5760405162461bcd60e51b81526004016103b490611b9c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b95760405162461bcd60e51b81526004016103b490611b9c565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9149190a250565b6000546001600160a01b0316331461192f5760405162461bcd60e51b81526004016103b490611b9c565b6001600160a01b0381166119855760405162461bcd60e51b815260206004820152601760248201527f48697665466c6173683a207a65726f206164647265737300000000000000000060448201526064016103b4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146111ec57600080fd5b6000602082840312156119ce57600080fd5b81356119d9816119a7565b9392505050565b6000806000806000608086880312156119f857600080fd5b8535611a03816119a7565b94506020860135935060408601359250606086013567ffffffffffffffff80821115611a2e57600080fd5b818801915088601f830112611a4257600080fd5b813581811115611a5157600080fd5b896020828501011115611a6357600080fd5b9699959850939650602001949392505050565b60008060408385031215611a8957600080fd5b8235611a94816119a7565b946020939093013593505050565b600080600080600080600080610100898b031215611abf57600080fd5b883597506020890135611ad1816119a7565b96506040890135611ae1816119a7565b95506060890135611af1816119a7565b94506080890135935060a0890135925060c0890135611b0f816119a7565b8092505060e089013590509295985092959890939650565b60008060208385031215611b3a57600080fd5b823567ffffffffffffffff80821115611b5257600080fd5b818501915085601f830112611b6657600080fd5b813581811115611b7557600080fd5b8660208260051b8501011115611b8a57600080fd5b60209290920196919550909350505050565b6020808252601490820152732434bb32a33630b9b41d103737ba1037bbb732b960611b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761183d5761183d611bca565b600082611c1457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561183d5761183d611bca565b600060208284031215611c3e57600080fd5b5051919050565b600060208284031215611c5757600080fd5b815180151581146119d957600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611ce35784516001600160a01b031683529383019391830191600101611cbe565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215611d1757600080fd5b825167ffffffffffffffff80821115611d2f57600080fd5b818501915085601f830112611d4357600080fd5b815181811115611d5557611d55611c67565b8060051b604051601f19603f83011681018181108582111715611d7a57611d7a611c67565b604052918252848201925083810185019188831115611d9857600080fd5b938501935b82851015611db657845184529385019392850192611d9d565b98975050505050505050565b600060208284031215611dd457600080fd5b81516119d9816119a7565b84815260006020858184015260018060a01b038516604084015260806060840152835180608085015260005b81811015611e275785810183015185820160a001528201611e0b565b50600060a0828601015260a0601f19601f8301168501019250505095945050505050565b600060018201611e5d57611e5d611bca565b506001019056fea2646970667358221220467ea25c638d94619a3af7d15ad322f5cdd69fbf1d6c40b3a465f1ae7163b99c64736f6c63430008140033000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f305000000000000000000000000d79bfb86fa06e8782b401bc0197d92563602d2ab0000000000000000000000000deed1486bc52aa0d3e6f8849cec5add6598a162
Deployed ByteCode
0x6080604052600436106101025760003560e01c80638fef276e11610095578063a230c52411610064578063a230c524146102d6578063b543503e146102f6578063ca6d56dc14610316578063f2fde38b14610336578063f4b9fa751461035657600080fd5b80638fef276e14610222578063927ef7fa146102425780639b19251a146102765780639d25a4c9146102b657600080fd5b80636f0668fd116100d15780636f0668fd146101855780636f4d469b146101a55780638a4adf24146101c55780638da5cb5b1461020257600080fd5b80630b1ca49a1461010e57806310d1e85c1461013057806320800a0014610150578063573761981461016557600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5061012e6101293660046119bc565b61038a565b005b34801561013c57600080fd5b5061012e61014b3660046119e0565b610406565b34801561015c57600080fd5b5061012e61111f565b34801561017157600080fd5b5061012e610180366004611a76565b6111ef565b34801561019157600080fd5b5061012e6101a0366004611aa2565b611295565b3480156101b157600080fd5b5061012e6101c0366004611b27565b6116c5565b3480156101d157600080fd5b506001546101e5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020e57600080fd5b506000546101e5906001600160a01b031681565b34801561022e57600080fd5b506002546101e5906001600160a01b031681565b34801561024e57600080fd5b506101e57f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781565b34801561028257600080fd5b506102a66102913660046119bc565b60036020526000908152604090205460ff1681565b60405190151581526020016101f9565b3480156102c257600080fd5b5061012e6102d13660046119bc565b6117bd565b3480156102e257600080fd5b506102a66102f13660046119bc565b611809565b34801561030257600080fd5b5061012e6103113660046119bc565b611843565b34801561032257600080fd5b5061012e6103313660046119bc565b61188f565b34801561034257600080fd5b5061012e6103513660046119bc565b611905565b34801561036257600080fd5b506101e57f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f30581565b6000546001600160a01b031633146103bd5760405162461bcd60e51b81526004016103b490611b9c565b60405180910390fd5b6001600160a01b038116600081815260036020526040808220805460ff19169055517f6e76fb4c77256006d9c38ec7d82b45a8c8f3c27b1d6766fffc42dfb8de6844929190a250565b600c5460ff166104585760405162461bcd60e51b815260206004820152601c60248201527f48697665466c6173683a206e6f7420696e20666c61736820737761700000000060448201526064016103b4565b6000610466828401846119bc565b9050336001600160a01b038216146104c05760405162461bcd60e51b815260206004820181905260248201527f48697665466c6173683a20696e76616c696420706169722063616c6c6261636b60448201526064016103b4565b6001600160a01b03861630146105185760405162461bcd60e51b815260206004820152601960248201527f48697665466c6173683a20696e76616c69642073656e6465720000000000000060448201526064016103b4565b600c805460ff19169055600b5460006103e5610536836103e8611be0565b6105409190611bf7565b61054b906001611c19565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f30516906370a0823190602401602060405180830381865afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d99190611c2c565b90508281101561062b5760405162461bcd60e51b815260206004820152601b60248201527f48697665466c6173683a20696e73756666696369656e7420444149000000000060448201526064016103b4565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d96004820152602481018290527f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f3056001600160a01b03169063095ea7b3906044016020604051808303816000875af11580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190611c45565b5060408051600380825260808201909252600091602082016060803683370190505090507f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f3058160008151811061072857610728611c7d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a278160018151811061077c5761077c611c7d565b6001600160a01b03928316602091820292909201015260028054835192169183919081106107ac576107ac611c7d565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d96338ed173983600084306107ef4261012c611c19565b6040518663ffffffff1660e01b815260040161080f959493929190611c93565b6000604051808303816000875af115801561082e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108569190810190611d04565b506002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190611c2c565b9050600081116109165760405162461bcd60e51b815260206004820152601b60248201527f48697665466c6173683a206e6f205553444c206163717569726564000000000060448201526064016103b4565b60025460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af115801561096b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098f9190611c45565b50600154600554600654600754600854600954604051635e69ba9360e11b8152600481018890526001600160a01b039586166024820152938516604485015291841660648401526084830152600060a483015260c482015291169063bcd375269060e401600060405180830381600087803b158015610a0d57600080fd5b505af1158015610a21573d6000803e3d6000fd5b50479250505080610a7e5760405162461bcd60e51b815260206004820152602160248201527f48697665466c6173683a206e6f20504c532066726f6d20726564656d7074696f6044820152603760f91b60648201526084016103b4565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b031692506370a082319150602401602060405180830381865afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611c2c565b905060008111610bcf5760405162461bcd60e51b815260206004820152601a60248201527f48697665466c6173683a206e6f2057504c5320746f2073656c6c00000000000060448201526064016103b4565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d96004820152602481018290527f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b03169063095ea7b3906044016020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190611c45565b506040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781600081518110610cca57610cca611c7d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f30581600181518110610d1e57610d1e611c7d565b6001600160a01b039092166020928302919091019091015273165c3410fc91ef562c50559f7d2289febed552d96338ed17398360008430610d614261012c611c19565b6040518663ffffffff1660e01b8152600401610d81959493929190611c93565b6000604051808303816000875af1158015610da0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dc89190810190611d04565b506040516370a0823160e01b81523060048201526000907f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f3056001600160a01b0316906370a0823190602401602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611c2c565b905087811015610eb15760405162461bcd60e51b815260206004820152602260248201527f48697665466c6173683a2063616e6e6f7420726570617920666c617368206c6f60448201526130b760f11b60648201526084016103b4565b60405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018a90527f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f305169063a9059cbb906044016020604051808303816000875af1158015610f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f449190611c45565b506040516370a0823160e01b81523060048201526000907f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f3056001600160a01b0316906370a0823190602401602060405180830381865afa158015610fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd09190611c2c565b9050600a548110156110245760405162461bcd60e51b815260206004820152601f60248201527f48697665466c6173683a2070726f6669742062656c6f77206d696e696d756d0060448201526064016103b4565b80156110c5576004805460405163a9059cbb60e01b81526001600160a01b0391821692810192909252602482018390527f000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f305169063a9059cbb906044016020604051808303816000875af115801561109f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c39190611c45565b505b60045460408051888152602081018490526001600160a01b03909216917f6d35b7d7146608d652fd82f6aad8435caf3165aa7ad1dc0a629ccdbc3242851b910160405180910390a250505050505050505050505050505050565b6000546001600160a01b031633146111495760405162461bcd60e51b81526004016103b490611b9c565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114611196576040519150601f19603f3d011682016040523d82523d6000602084013e61119b565b606091505b50509050806111ec5760405162461bcd60e51b815260206004820152601c60248201527f48697665466c6173683a2045544820726573637565206661696c65640000000060448201526064016103b4565b50565b6000546001600160a01b031633146112195760405162461bcd60e51b81526004016103b490611b9c565b60005460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af115801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190611c45565b505050565b3360009081526003602052604090205460ff16806112bd57506000546001600160a01b031633145b6113015760405162461bcd60e51b81526020600482015260156024820152742434bb32a33630b9b41d103737ba1036b2b6b132b960591b60448201526064016103b4565b600c5460ff161561134b5760405162461bcd60e51b8152602060048201526014602482015273121a5d99519b185cda0e881c99595b9d1c985b9d60621b60448201526064016103b4565b600088116113945760405162461bcd60e51b815260206004820152601660248201527548697665466c6173683a207a65726f20626f72726f7760501b60448201526064016103b4565b6001600160a01b0382166113e15760405162461bcd60e51b81526020600482015260146024820152732434bb32a33630b9b41d103d32b937903830b4b960611b60448201526064016103b4565b60048054336001600160a01b03199182161782556005805482166001600160a01b038b8116919091179091556006805483168a8316179055600780549092168882161790915560088690556009859055600a839055600b8a9055600c805460ff1916600117905560408051630dfe168160e01b815290518593600093851692630dfe168192818301926020928290030181865afa158015611486573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114aa9190611dc2565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611dc2565b905060007f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316836001600160a01b031603611555575060006115ec565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316826001600160a01b031603611596575060016115ec565b60405162461bcd60e51b815260206004820152602560248201527f48697665466c6173683a207061697220646f6573206e6f7420636f6e7461696e6044820152642057504c5360d81b60648201526084016103b4565b600c805461ff0019166101008315150217905560008161160d57600061160f565b8c5b905060008261161e578d611621565b60005b9050856001600160a01b031663022c0d9f8383308c60405160200161165591906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518563ffffffff1660e01b81526004016116839493929190611ddf565b600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b505050505050505050505050505050505050565b6000546001600160a01b031633146116ef5760405162461bcd60e51b81526004016103b490611b9c565b60005b818110156112905760016003600085858581811061171257611712611c7d565b905060200201602081019061172791906119bc565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811061176157611761611c7d565b905060200201602081019061177691906119bc565b6001600160a01b03167fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd91460405160405180910390a2806117b581611e4b565b9150506116f2565b6000546001600160a01b031633146117e75760405162461bcd60e51b81526004016103b490611b9c565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604081205460ff168061183d57506000546001600160a01b038381169116145b92915050565b6000546001600160a01b0316331461186d5760405162461bcd60e51b81526004016103b490611b9c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b95760405162461bcd60e51b81526004016103b490611b9c565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517fb251eb052afc73ffd02ffe85ad79990a8b3fed60d76dbc2fa2fdd7123dffd9149190a250565b6000546001600160a01b0316331461192f5760405162461bcd60e51b81526004016103b490611b9c565b6001600160a01b0381166119855760405162461bcd60e51b815260206004820152601760248201527f48697665466c6173683a207a65726f206164647265737300000000000000000060448201526064016103b4565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146111ec57600080fd5b6000602082840312156119ce57600080fd5b81356119d9816119a7565b9392505050565b6000806000806000608086880312156119f857600080fd5b8535611a03816119a7565b94506020860135935060408601359250606086013567ffffffffffffffff80821115611a2e57600080fd5b818801915088601f830112611a4257600080fd5b813581811115611a5157600080fd5b896020828501011115611a6357600080fd5b9699959850939650602001949392505050565b60008060408385031215611a8957600080fd5b8235611a94816119a7565b946020939093013593505050565b600080600080600080600080610100898b031215611abf57600080fd5b883597506020890135611ad1816119a7565b96506040890135611ae1816119a7565b95506060890135611af1816119a7565b94506080890135935060a0890135925060c0890135611b0f816119a7565b8092505060e089013590509295985092959890939650565b60008060208385031215611b3a57600080fd5b823567ffffffffffffffff80821115611b5257600080fd5b818501915085601f830112611b6657600080fd5b813581811115611b7557600080fd5b8660208260051b8501011115611b8a57600080fd5b60209290920196919550909350505050565b6020808252601490820152732434bb32a33630b9b41d103737ba1037bbb732b960611b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761183d5761183d611bca565b600082611c1457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561183d5761183d611bca565b600060208284031215611c3e57600080fd5b5051919050565b600060208284031215611c5757600080fd5b815180151581146119d957600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611ce35784516001600160a01b031683529383019391830191600101611cbe565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215611d1757600080fd5b825167ffffffffffffffff80821115611d2f57600080fd5b818501915085601f830112611d4357600080fd5b815181811115611d5557611d55611c67565b8060051b604051601f19603f83011681018181108582111715611d7a57611d7a611c67565b604052918252848201925083810185019188831115611d9857600080fd5b938501935b82851015611db657845184529385019392850192611d9d565b98975050505050505050565b600060208284031215611dd457600080fd5b81516119d9816119a7565b84815260006020858184015260018060a01b038516604084015260806060840152835180608085015260005b81811015611e275785810183015185820160a001528201611e0b565b50600060a0828601015260a0601f19601f8301168501019250505095945050505050565b600060018201611e5d57611e5d611bca565b506001019056fea2646970667358221220467ea25c638d94619a3af7d15ad322f5cdd69fbf1d6c40b3a465f1ae7163b99c64736f6c63430008140033