0 txs
0 calls
constructor
constructor(address lbFactory, address lbLegacyFactory, address joeFactory, address wnative)
functions
DATA_FEED_MANAGER_ROLE
viewfunction DATA_FEED_MANAGER_ROLE() view returns (bytes32)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getDataFeeds
viewfunction getDataFeeds(address token) view returns (tuple[] dataFeeds)
getFactoryV1
viewfunction getFactoryV1() view returns (address factoryV1)
getFactoryV2_1
viewfunction getFactoryV2_1() view returns (address factoryV2)
getLegacyFactoryV2
viewfunction getLegacyFactoryV2() view returns (address legacyFactoryV2)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMemberAt
viewfunction getRoleMemberAt(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getTokenPriceNative
viewfunction getTokenPriceNative(address token) view returns (uint256 price)
getTokenPriceUSD
viewfunction getTokenPriceUSD(address token) view returns (uint256 price)
getTokensPricesNative
viewfunction getTokensPricesNative(address[] tokens) view returns (uint256[] prices)
getTokensPricesUSD
viewfunction getTokensPricesUSD(address[] tokens) view returns (uint256[] prices)
getWNative
viewfunction getWNative() view returns (address wNative)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
owner
viewfunction owner() view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
addDataFeed
nonpayablefunction addDataFeed(address token, tuple dataFeed)
addDataFeeds
nonpayablefunction addDataFeeds(address[] tokens, tuple[] dataFeeds)
becomeOwner
nonpayablefunction becomeOwner()
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address aggregator)
removeDataFeed
nonpayablefunction removeDataFeed(address token, address dfAddress)
removeDataFeeds
nonpayablefunction removeDataFeeds(address[] tokens, address[] dfAddresses)
renounceRole
nonpayablefunction renounceRole(bytes32 role)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setDataFeedsWeights
nonpayablefunction setDataFeedsWeights(address[] tokens, address[] dfAddresses, uint88[] newWeights)
setDataFeedWeight
nonpayablefunction setDataFeedWeight(address token, address dfAddress, uint88 newWeight)
setNativeDataFeed
nonpayablefunction setNativeDataFeed(address aggregator)
setPendingOwner
nonpayablefunction setPendingOwner(address newOwner)
events
DataFeedAdded
event DataFeedAdded(address token, (address collateralAddress, address dfAddress, uint88 dfWeight, uint8 dfType) dataFeed)
DataFeedRemoved
event DataFeedRemoved(address token, address dfAddress)
DataFeedsWeightSet
event DataFeedsWeightSet(address token, address dfAddress, uint256 weight)
NativeDataFeedSet
event NativeDataFeedSet(address dfAddress)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PendingOwnerSet
event PendingOwnerSet(address indexed owner, address indexed pendingOwner)
RoleAdminSet
event RoleAdminSet(address indexed sender, bytes32 indexed role, bytes32 indexed adminRole)
RoleGranted
event RoleGranted(address indexed sender, bytes32 indexed role, address indexed account)
RoleRevoked
event RoleRevoked(address indexed sender, bytes32 indexed role, address indexed account)
errors
JoeDexLens__AlreadyInitialized
error JoeDexLens__AlreadyInitialized()
JoeDexLens__CollateralNotInPair
error JoeDexLens__CollateralNotInPair(address pair, address collateral)
JoeDexLens__DataFeedAlreadyAdded
error JoeDexLens__DataFeedAlreadyAdded(address token, address dataFeed)
JoeDexLens__DataFeedNotInSet
error JoeDexLens__DataFeedNotInSet(address token, address dataFeed)
JoeDexLens__InvalidChainLinkPrice
error JoeDexLens__InvalidChainLinkPrice()
JoeDexLens__InvalidDataFeed
error JoeDexLens__InvalidDataFeed()
JoeDexLens__LengthsMismatch
error JoeDexLens__LengthsMismatch()
JoeDexLens__NativeToken
error JoeDexLens__NativeToken()
JoeDexLens__NullWeight
error JoeDexLens__NullWeight()
JoeDexLens__SameDataFeed
error JoeDexLens__SameDataFeed()
JoeDexLens__SameTokens
error JoeDexLens__SameTokens()
JoeDexLens__TokenNotInPair
error JoeDexLens__TokenNotInPair(address pair, address token)
JoeDexLens__UnknownDataFeedType
error JoeDexLens__UnknownDataFeedType()
JoeDexLens__V1ContractNotSet
error JoeDexLens__V1ContractNotSet()
JoeDexLens__V2_1ContractNotSet
error JoeDexLens__V2_1ContractNotSet()
JoeDexLens__V2ContractNotSet
error JoeDexLens__V2ContractNotSet()
JoeDexLens__ZeroAddress
error JoeDexLens__ZeroAddress()
SafeAccessControlEnumerable__AccountAlreadyHasRole
error SafeAccessControlEnumerable__AccountAlreadyHasRole(address account, bytes32 role)
SafeAccessControlEnumerable__AccountDoesNotHaveRole
error SafeAccessControlEnumerable__AccountDoesNotHaveRole(address account, bytes32 role)
SafeAccessControlEnumerable__OnlyOwnerOrRole
error SafeAccessControlEnumerable__OnlyOwnerOrRole(address account, bytes32 role)
SafeAccessControlEnumerable__OnlyRole
error SafeAccessControlEnumerable__OnlyRole(address account, bytes32 role)
SafeAccessControlEnumerable__RoleAlreadyGranted
error SafeAccessControlEnumerable__RoleAlreadyGranted(address account, bytes32 role)
SafeOwnable__OnlyOwner
error SafeOwnable__OnlyOwner()
SafeOwnable__OnlyPendingOwner
error SafeOwnable__OnlyPendingOwner()
Uint128x128Math__PowUnderflow
error Uint128x128Math__PowUnderflow(uint256 x, int256 y)
Uint256x256Math__MulShiftOverflow
error Uint256x256Math__MulShiftOverflow()
creation bytecode
0x6101406040523480156200001257600080fd5b5060405162004de638038062004de6833981016040819052620000359162000500565b62000040336200014d565b6001600160a01b0384161580156200005f57506001600160a01b038316155b80156200007357506001600160a01b038216155b806200008657506001600160a01b038116155b15620000a557604051632423bc7d60e01b815260040160405180910390fd5b6001600160a01b0380831660c05283811660a052848116608052811660e08190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa15801562000102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000128919062000568565b60ff166101008190526200013e90600a620006a0565b6101205250620006f492505050565b600080546001600160a01b0316905062000172826200019260201b62000d311760201c565b6200017f600082620001e2565b506200018d60008362000298565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000821580156200021757506001600160a01b0382166200020b6000546001600160a01b031690565b6001600160a01b031614155b8062000247575060008381526002602090815260409091206200024591849062000d816200034d821b17901c565b155b15620002565750600062000292565b6040516001600160a01b03831690849033907f8fa769283732af9aa4f65d966aceb1295944e96fcdd7031699b47da23286d28590600090a45060015b92915050565b600082158015620002cd57506001600160a01b038216620002c16000546001600160a01b031690565b6001600160a01b031614155b80620002fd57506000838152600260209081526040909120620002fb91849062000d976200036c821b17901c565b155b156200030c5750600062000292565b6040516001600160a01b03831690849033907f2739f947da5133134a8e9c6a84d5ed6da396844d81b4a760121c8b9c668bdf9c90600090a450600192915050565b60006200036583826001600160a01b03851662000385565b9392505050565b60006200036583826001600160a01b0385168162000493565b6000818152600184016020526040812054801562000488576000620003ac600183620006ae565b8654909150600090620003c290600190620006ae565b905081811462000438576000876000018281548110620003e657620003e6620006c8565b6000918252602082200154915060ff881682901c905081896000018581548110620004155762000415620006c8565b600091825260208083209091019290925591825260018a01905260409020849055505b86548790806200044c576200044c620006de565b60019003818190600052602060002001600090559055866001016000868152602001908152602001600020600090556001935050505062000365565b506000949350505050565b60008281526001850160205260408120546200048857508354600180820186556000868152602080822060ff881687901b861794019390935586548582528288019093526040902091909155949350505050565b6001600160a01b0381168114620004fd57600080fd5b50565b600080600080608085870312156200051757600080fd5b84516200052481620004e7565b60208601519094506200053781620004e7565b60408601519093506200054a81620004e7565b60608601519092506200055d81620004e7565b939692955090935050565b6000602082840312156200057b57600080fd5b815160ff811681146200036557600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005e4578160001904821115620005c857620005c86200058d565b80851615620005d657918102915b93841c9390800290620005a8565b509250929050565b600082620005fd5750600162000292565b816200060c5750600062000292565b8160018114620006255760028114620006305762000650565b600191505062000292565b60ff8411156200064457620006446200058d565b50506001821b62000292565b5060208310610133831016604e8410600b841016171562000675575081810a62000292565b620006818383620005a3565b80600019048211156200069857620006986200058d565b029392505050565b6000620003658383620005ec565b600082821015620006c357620006c36200058d565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161010051610120516145d06200081660003960008181610558015281816110c201526120c5015260008181611e4201528181611e6e01528181611eb001528181611edb01528181612db101528181612e2401528181612fbd0152613003015260008181610324015281816106af015281816109b201528181610a0901528181610c8c01528181610e6a01528181610ed00152818161104f01528181611087015281816120770152818161272b015281816128c80152612a6501526000818161020a0152818161138f01528181612a0f0152612a900152600081816103a1015281816113290152818161287a01526128fb0152600081816102eb015281816112c3015281816126dd015261275e01526145d06000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638e11de0111610104578063c4d66de8116100a2578063e30c397811610071578063e30c397814610475578063e786dc9914610486578063f5514f1914610499578063f9dca989146104ac57600080fd5b8063c4d66de814610429578063ca15c8731461043c578063d547741f1461044f578063d9b819ed1461046257600080fd5b8063a217fddf116100de578063a217fddf146103e8578063acc5d5bf146103f0578063ad8dc75714610403578063c42069ec1461041657600080fd5b80638e11de011461038c5780638fe4b3ad1461039f57806391d14854146103c557600080fd5b80632f2ff15d1161017c578063719a08a31161014b578063719a08a31461032257806380676c14146103485780638bb9c5bf146103685780638da5cb5b1461037b57600080fd5b80632f2ff15d146102c357806342613d0c146102d65780635c5035cb146102e95780636ffdd27d1461030f57600080fd5b8063197d7457116101b8578063197d7457146101df57806323f76ed614610277578063248a9ca31461028c5780632a2cef0a146102b057600080fd5b80630280561b146101df57806307da8f57146102085780631968dc2314610242575b600080fd5b6101f26101ed366004613796565b6104b4565b6040516101ff91906137d8565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101ff565b6102697fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b681565b6040519081526020016101ff565b61028a610285366004613831565b6104c9565b005b61026961029a36600461384e565b6000908152600260208190526040909120015490565b6102696102be366004613831565b610554565b61028a6102d1366004613867565b61059c565b61028a6102e4366004613897565b610634565b7f000000000000000000000000000000000000000000000000000000000000000061022a565b61028a61031d3660046138f1565b61070a565b7f000000000000000000000000000000000000000000000000000000000000000061022a565b61035b610356366004613831565b610794565b6040516101ff9190613974565b61028a61037636600461384e565b61087a565b6000546001600160a01b031661022a565b61028a61039a3660046139fd565b6108ad565b7f000000000000000000000000000000000000000000000000000000000000000061022a565b6103d86103d3366004613867565b610939565b60405190151581526020016101ff565b610269600081565b61022a6103fe366004613a97565b610951565b610269610411366004613831565b610969565b61028a610424366004613831565b610974565b61028a610437366004613831565b6109a8565b61026961044a36600461384e565b610a52565b61028a61045d366004613867565b610a69565b61028a610470366004613ab9565b610afc565b6001546001600160a01b031661022a565b61028a610494366004613b25565b610b81565b61028a6104a7366004613bbf565b610c11565b61028a610ce7565b60606104c08383610dae565b90505b92915050565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b6336104fd6000546001600160a01b031690565b6001600160a01b03161415801561051b57506105198133610939565b155b156105475760405163dfc1890f60e01b8152336004820152602481018290526044015b60405180910390fd5b61055082610e5b565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000061057f611045565b61058884611083565b6105929190613c03565b6104c39190613c22565b60008281526002602081905260408220015490546001600160a01b031633148015906105cf57506105cd8133610939565b155b156105f65760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b6106008383611191565b61062f5760405163e628d3d760e01b81526001600160a01b03831660048201526024810184905260440161053e565b505050565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b6336106686000546001600160a01b031690565b6001600160a01b03161415801561068657506106848133610939565b155b156106ad5760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156107005760405163c659c59b60e01b815260040160405180910390fd5b61062f8383611232565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b63361073e6000546001600160a01b031690565b6001600160a01b03161415801561075c575061075a8133610939565b155b156107835760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b61078e8484846115ea565b50505050565b6001600160a01b0381166000908152600360209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561086f576000848152602090819020604080516080810182526002860290920180546001600160a01b039081168452600182015490811694840194909452600160a01b84046affffffffffffffffffffff169183019190915290916060830190600160f81b900460ff16600381111561084b5761084b61393c565b600381111561085c5761085c61393c565b81525050815260200190600101906107cc565b505050509050919050565b6108848133611736565b6108aa5760405163afacc10960e01b81523360048201526024810182905260440161053e565b50565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b6336108e16000546001600160a01b031690565b6001600160a01b0316141580156108ff57506108fd8133610939565b155b156109265760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b610932858585856117d7565b5050505050565b60008281526002602052604081206104c09083611853565b60008281526002602052604081206104c09083611875565b60006104c382611083565b6000546001600160a01b0316331461099f57604051631c1d490560e21b815260040160405180910390fd5b6108aa81611881565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600090815260036020526040902054156109ff5760405163591c279760e11b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600360205260408120805460010181559052610a49336118cd565b6108aa81610e5b565b60008181526002602052604081206104c3906118f9565b60008281526002602081905260408220015490546001600160a01b03163314801590610a9c5750610a9a8133610939565b155b15610ac35760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b610acd8383611736565b61062f5760405163afacc10960e01b81526001600160a01b03831660048201526024810184905260440161053e565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b633610b306000546001600160a01b031690565b6001600160a01b031614158015610b4e5750610b4c8133610939565b155b15610b755760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b61093285858585611903565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b633610bb56000546001600160a01b031690565b6001600160a01b031614158015610bd35750610bd18133610939565b155b15610bfa5760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b610c0887878787878761198e565b50505050505050565b7fe95bc000e84afdbf5a46b6670e5eae2d6de618593596f0ab3a18a7beaf3548b633610c456000546001600160a01b031690565b6001600160a01b031614158015610c635750610c618133610939565b155b15610c8a5760405163dfc1890f60e01b81523360048201526024810182905260440161053e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415610cdd5760405163c659c59b60e01b815260040160405180910390fd5b61062f8383611a6f565b6001546001600160a01b03163314610d12576040516301bd182d60e41b815260040160405180910390fd5b6001546001600160a01b0316610d286000611881565b6108aa816118cd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006104c083826001600160a01b038516611b0f565b60006104c083826001600160a01b03851681611c0d565b60608167ffffffffffffffff811115610dc957610dc9613c44565b604051908082528060200260200182016040528015610df2578160200160208202803683370190505b50905060005b82811015610e5457610e2f848483818110610e1557610e15613c5a565b9050602002016020810190610e2a9190613831565b611083565b828281518110610e4157610e41613c5a565b6020908102919091010152600101610df8565b5092915050565b806001600160a01b0316610e907f00000000000000000000000000000000000000000000000000000000000000006000611c5d565b602001516001600160a01b03161415610ebc57604051637232805560e01b815260040160405180910390fd5b604080516080810182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811680835290841660208084019190915260018385015260036060840181905260009283529052918220805491928392610f2b57610f2b613c5a565b6000918252602091829020835160029092020180546001600160a01b039283166001600160a01b03199091161781559183015160018301805460408601516affffffffffffffffffffff16600160a01b026001600160f81b0319909116929093169190911791909117808255606084015191907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b836003811115610fd657610fd661393c565b0217905550905050610fe782611d43565b611004576040516356b03d5360e01b815260040160405180910390fd5b6040516001600160a01b03831681527f255420b9ed7c480476ef7b3054f8cb71a769cd1269f9f787d27346b69f9a931e906020015b60405180910390a15050565b600061107e6110757f00000000000000000000000000000000000000000000000000000000000000006000611c5d565b60200151611d43565b905090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156110e657507f0000000000000000000000000000000000000000000000000000000000000000919050565b6001600160a01b038216600090815260036020526040902054806111145761110d83611f20565b9392505050565b6000805b8281101561117057600061112c8683611c5d565b905060008061113b8389611fa7565b9150915081600014611162576111518183613c03565b61115b9088613c70565b9650938401935b836001019350505050611118565b508015611186576111818184613c22565b611189565b60005b949350505050565b6000821580156111c45750816001600160a01b03166111b86000546001600160a01b031690565b6001600160a01b031614155b806111e4575060008381526002602052604090206111e29083610d97565b155b156111f1575060006104c3565b6040516001600160a01b03831690849033907f2739f947da5133134a8e9c6a84d5ed6da396844d81b4a760121c8b9c668bdf9c90600090a450600192915050565b818160006112436020830183613831565b9050826001600160a01b0316816001600160a01b0316141561127857604051631ca52e4560e31b815260040160405180910390fd5b600061128a6080840160608501613c95565b905060038160038111156112a0576112a061393c565b146114e65760028160038111156112b9576112b961393c565b1480156112ed57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316155b1561130b57604051632bee26db60e11b815260040160405180910390fd5b600181600381111561131f5761131f61393c565b14801561135357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316155b156113715760405163dac3cc9d60e01b815260040160405180910390fd5b60008160038111156113855761138561393c565b1480156113b957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316155b156113d7576040516324f4101b60e11b815260040160405180910390fd5b6000806113f36113ed6040870160208801613831565b84612119565b91509150836001600160a01b0316826001600160a01b03161415801561142b5750836001600160a01b0316816001600160a01b031614155b1561146d576114406040860160208701613831565b6040516355857c4360e01b81526001600160a01b039182166004820152908516602482015260440161053e565b856001600160a01b0316826001600160a01b0316141580156114a15750856001600160a01b0316816001600160a01b031614155b156114e3576114b66040860160208701613831565b6040516355b4206760e11b81526001600160a01b039182166004820152908716602482015260440161053e565b50505b6114f66060860160408701613cb2565b6affffffffffffffffffffff811661152157604051631b13f49360e21b815260040160405180910390fd5b61152b8787612382565b61156c57866115406040880160208901613831565b604051631c4ef04560e21b81526001600160a01b0392831660048201529116602482015260440161053e565b600061158661158036899003890189613d4d565b89611fa7565b509050806115a75760405163264d179760e21b815260040160405180910390fd5b7f407d7b2ebb6f7c49a80ec9153307af1e82ae2093388b0a1bbc2a916b1df2a9bd88886040516115d8929190613dd2565b60405180910390a15050505050505050565b806affffffffffffffffffffff811661161657604051631b13f49360e21b815260040160405180910390fd5b6001600160a01b03808516600090815260036020908152604080832093871683526001840190915290205480611672576040516307ee4f1760e11b81526001600160a01b0380881660048301528616602482015260440161053e565b838261167f600184613e53565b8154811061168f5761168f613c5a565b60009182526020918290206002919091020160010180547fff0000000000000000000000ffffffffffffffffffffffffffffffffffffffff16600160a01b6affffffffffffffffffffff94851602179055604080516001600160a01b038a811682528916928101929092529186168183015290517f3eb44490058832617a9bce11b8ac1ad0438666c511d9e3ec892d25bbd548d580916060908290030190a1505050505050565b6000821580156117695750816001600160a01b031661175d6000546001600160a01b031690565b6001600160a01b031614155b80611789575060008381526002602052604090206117879083610d81565b155b15611796575060006104c3565b6040516001600160a01b03831690849033907f8fa769283732af9aa4f65d966aceb1295944e96fcdd7031699b47da23286d28590600090a450600192915050565b82818082146117f957604051631e5ffe1560e01b815260040160405180910390fd5b60005b85811015610c085761184b87878381811061181957611819613c5a565b905060200201602081019061182e9190613831565b86868481811061184057611840613c5a565b905060800201611232565b6001016117fc565b6001600160a01b038116600090815260018301602052604081205415156104c0565b600061110d838361244c565b600180546001600160a01b0319166001600160a01b03831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b6000546001600160a01b03166118e282610d31565b6118ed600082611736565b5061062f600083611191565b60006104c3825490565b828180821461192557604051631e5ffe1560e01b815260040160405180910390fd5b60005b85811015610c085761198687878381811061194557611945613c5a565b905060200201602081019061195a9190613831565b86868481811061196c5761196c613c5a565b90506020020160208101906119819190613831565b611a6f565b600101611928565b84838082146119b057604051631e5ffe1560e01b815260040160405180910390fd5b86838082146119d257604051631e5ffe1560e01b815260040160405180910390fd5b60005b89811015611a6257611a5a8b8b838181106119f2576119f2613c5a565b9050602002016020810190611a079190613831565b8a8a84818110611a1957611a19613c5a565b9050602002016020810190611a2e9190613831565b898985818110611a4057611a40613c5a565b9050602002016020810190611a559190613cb2565b6115ea565b6001016119d5565b5050505050505050505050565b611a798282612476565b611aa9576040516307ee4f1760e11b81526001600160a01b0380841660048301528216602482015260440161053e565b611ab282611083565b611acf5760405163264d179760e21b815260040160405180910390fd5b604080516001600160a01b038085168252831660208201527f30c6934445801cd0bfee6f71ee2dbdec6127d5bfa81f0c0a56783a4aaaae798c9101611039565b60008181526001840160205260408120548015611c02576000611b33600183613e53565b8654909150600090611b4790600190613e53565b9050818114611bb6576000876000018281548110611b6757611b67613c5a565b6000918252602082200154915060ff881682901c905081896000018581548110611b9357611b93613c5a565b600091825260208083209091019290925591825260018a01905260409020849055505b8654879080611bc757611bc7613e6a565b60019003818190600052602060002001600090559055866001016000868152602001908152602001600020600090556001935050505061110d565b506000949350505050565b6000828152600185016020526040812054611c0257508354600180820186556000868152602080822060ff881687901b861794019390935586548582528288019093526040902091909155611189565b611c856040805160808101825260008082526020820181905291810182905290606082015290565b6001600160a01b0383166000908152600360205260409020805483908110611caf57611caf613c5a565b600091825260209182902060408051608081018252600290930290910180546001600160a01b0390811684526001820154908116948401949094526affffffffffffffffffffff600160a01b850416918301919091529091606083019060ff600160f81b909104166003811115611d2857611d2861393c565b6003811115611d3957611d3961393c565b9052509392505050565b6000808290506000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613e9f565b50505091505060008113611dd4576040516356b03d5360e01b815260040160405180910390fd5b8092506000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3b9190613eef565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000000811015611eae57611e92817f0000000000000000000000000000000000000000000000000000000000000000613e53565b611e9d90600a613fee565b611ea79085613c03565b9350611f18565b7f0000000000000000000000000000000000000000000000000000000000000000811115611f1857611f007f000000000000000000000000000000000000000000000000000000000000000082613e53565b611f0b90600a613fee565b611f159085613c22565b93505b505050919050565b6000806000611f2e846126d8565b91509150600080611f3e86612875565b91509150600080611f4e88612a0a565b9092509050600081611f608588613c70565b611f6a9190613c70565b90508015611f97578083611f7e878a613c70565b611f889190613c70565b611f929190613c22565b611f9a565b60005b9998505050505050505050565b6060820151600090819081816003811115611fc457611fc461393c565b1415611fe357611fd8856020015185612b57565b50945061206f915050565b6001816003811115611ff757611ff761393c565b1480612014575060028160038111156120125761201261393c565b145b1561202857611fd885602001518286612e81565b600381600381111561203c5761203c61393c565b14156120565761204f8560200151611d43565b925061206f565b604051631066e60560e01b815260040160405180910390fd5b8215612111577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685600001516001600160a01b0316146120fc5760006120c18660000151611083565b90507f00000000000000000000000000000000000000000000000000000000000000006120ee8286613c03565b6120f89190613c22565b9350505b84604001516affffffffffffffffffffff1691505b509250929050565b60008060028360038111156121305761213061393c565b141561220357836001600160a01b03166305e8746d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121989190613ffa565b9150836001600160a01b031663da10610c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fc9190613ffa565b905061237b565b60018360038111156122175761221761393c565b14156122bf57836001600160a01b03166316dc165b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561225b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227f9190613ffa565b9150836001600160a01b031663b7d19fc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d8573d6000803e3d6000fd5b60008360038111156122d3576122d361393c565b141561205657836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233b9190613ffa565b9150836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d8573d6000803e3d6000fd5b9250929050565b60006123c9836123986040850160208601613831565b6001600160a01b03918216600090815260036020908152604080832093909416825260019092019091522054151590565b612444576001600160a01b038316600090815260036020908152604082208054600181018255818452919092208491600202016124068282614017565b505080546001820160006124206040870160208801613831565b6001600160a01b0316815260208101919091526040016000205550600190506104c3565b5060006104c3565b600082600001828154811061246357612463613c5a565b9060005260206000200154905092915050565b6001600160a01b03808316600090815260036020908152604080832093851683526001840190915281205490919080156126cd5760006124b7600183613e53565b83549091506000906124cb90600190613e53565b90508082146126665760008460000182815481106124eb576124eb613c5a565b600091825260209182902060408051608081018252600290930290910180546001600160a01b0390811684526001820154908116948401949094526affffffffffffffffffffff600160a01b850416918301919091529091606083019060ff600160f81b9091041660038111156125645761256461393c565b60038111156125755761257561393c565b8152505090508085600001848154811061259157612591613c5a565b6000918252602091829020835160029092020180546001600160a01b039283166001600160a01b03199091161781559183015160018301805460408601516affffffffffffffffffffff16600160a01b026001600160f81b0319909116929093169190911791909117808255606084015191907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b83600381111561263c5761263c61393c565b021790555050506020908101516001600160a01b0316600090815260018601909152604090208390555b835484908061267757612677613e6a565b6000828152602080822060026000199094019384020180546001600160a01b03191681556001908101839055929093556001600160a01b03891681529581019091526040852094909455509192506104c3915050565b6000925050506104c3565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661271457506000928392509050565b604051636622e0d760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636622e0d790604401600060405180830381865afa1580156127a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127cf919081019061415e565b9050805160001461286f5760005b815181101561286d5760008282815181106127fa576127fa613c5a565b602002602001015160200151905060008060008061281a8560028c612e81565b935093509350935060006128308686868561305e565b905061283c8184613c03565b612846908b613c70565b9950612852818a613c70565b985050505050505080806128659061424c565b9150506127dd565b505b50915091565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166128b157506000928392509050565b604051636622e0d760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015284811660248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636622e0d790604401600060405180830381865afa158015612944573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261296c9190810190614267565b9050805160001461286f5760005b815181101561286d57600082828151811061299757612997613c5a565b60200260200101516020015190506000806000806129b78560018c612e81565b935093509350935060006129cd8686868561305e565b90506129d98184613c03565b6129e3908b613c70565b99506129ef818a613c70565b98505050505050508080612a029061424c565b91505061297a565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612a4657506000928392509050565b60405163e6a4390560e01b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015612ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afd9190613ffa565b90506001600160a01b0381161561286f57600080600080612b1e8589612b57565b9350935093509350600581612b335784612b35565b835b612b3f9190613c03565b9550612b4b8683613c03565b96505050505050915091565b60008060008060008690506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc69190613ffa565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613ffa565b90506000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c929190613eef565b60ff1690506000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cfb9190613eef565b60ff169050846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190614363565b506dffffffffffffffffffffffffffff9182169a501697506001600160a01b038a81169085161495508515612e04578815612dfa57612da281600a613fee565b612dac908a613c03565b612dd67f000000000000000000000000000000000000000000000000000000000000000084613c70565b612de190600a613fee565b612deb908a613c03565b612df59190613c22565b612dfd565b60005b9650612e73565b8715612e6d57612e1582600a613fee565b612e1f9089613c03565b612e497f000000000000000000000000000000000000000000000000000000000000000083613c70565b612e5490600a613fee565b612e5e908b613c03565b612e689190613c22565b612e70565b60005b96505b505050505092959194509250565b600080600080600080612e948989612119565b91509150612ea28989613249565b90965094506000612eb862ffffff88168761341e565b90506000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1e9190613eef565b60ff1690506000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f879190613eef565b60ff1690506000856001600160a01b03168b6001600160a01b031614965086612ffb57612fb684600019613c22565b83612fe1847f0000000000000000000000000000000000000000000000000000000000000000613c70565b612feb9190613e53565b612ff690600a613fee565b61303c565b8382613027857f0000000000000000000000000000000000000000000000000000000000000000613c70565b6130319190613e53565b61303c90600a613fee565b909450905061304d84826080613462565b975050505050505093509350935093565b6000811561315f57600080613079600562ffffff8816613e53565b613084906001613c70565b61308f8760016143a8565b90925062ffffff169050815b8181101561315757604051630157d2d160e31b815262ffffff821660048201526000906001600160a01b038a1690630abe9688906024016040805180830381865afa1580156130ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311291906143ef565b6fffffffffffffffffffffffffffffffff1691505061ffff8716613138614e2083613c03565b6131429190613c22565b61314c9086613c70565b94505060010161309b565b505050611189565b60008085613173600562ffffff8316613c70565b915062ffffff16915060008290505b8181101561323e57604051630157d2d160e31b815262ffffff821660048201526000906001600160a01b038a1690630abe9688906024016040805180830381865afa1580156131d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f991906143ef565b506fffffffffffffffffffffffffffffffff16905061ffff871661321f614e2083613c03565b6132299190613c22565b6132339086613c70565b945050600101613182565b505050949350505050565b60008060018360038111156132605761326061393c565b141561333e576000846001600160a01b0316631b05b83e6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156132a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ca9190614422565b92505050809250846001600160a01b03166398c7adf36040518163ffffffff1660e01b815260040161018060405180830381865afa158015613310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133349190614478565b51915061237b9050565b60028360038111156133525761335261393c565b141561205657836001600160a01b031663dbe65edc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ba9190614564565b9150836001600160a01b03166317f11ecc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133fa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fc919061457f565b600061271071ffff00000000000000000000000000000000608084901b1604600160801b0162ffffff8416627fffff190161345982826134d0565b95945050505050565b60008060006134718686613732565b9150915081600014613487578360ff1682901c92505b80156134c757600160ff85161b81106134b357604051638e471a8960e01b815260040160405180910390fd5b8360ff166101000361ffff1681901b830192505b50509392505050565b60008080836134e85750600160801b91506104c39050565b508260008112156134fa579015906000035b621000008110156136f357600160801b9250846fffffffffffffffffffffffffffffffff81111561352d57911591600019045b600182161561353e5792830260801c925b800260801c60028216156135545792830260801c925b800260801c600482161561356a5792830260801c925b800260801c60088216156135805792830260801c925b800260801c60108216156135965792830260801c925b800260801c60208216156135ac5792830260801c925b800260801c60408216156135c25792830260801c925b8002608090811c908216156135d95792830260801c925b800260801c6101008216156135f05792830260801c925b800260801c6102008216156136075792830260801c925b800260801c61040082161561361e5792830260801c925b800260801c6108008216156136355792830260801c925b800260801c61100082161561364c5792830260801c925b800260801c6120008216156136635792830260801c925b800260801c61400082161561367a5792830260801c925b800260801c6180008216156136915792830260801c925b800260801c620100008216156136a95792830260801c925b800260801c620200008216156136c15792830260801c925b800260801c620400008216156136d95792830260801c925b800260801c620800008216156136f15792830260801c925b505b8261371b57604051631dba598d60e11b8152600481018690526024810185905260440161053e565b816137265782613459565b61345983600019613c22565b6000806000198385098385029250828110838203039150509250929050565b60008083601f84011261376357600080fd5b50813567ffffffffffffffff81111561377b57600080fd5b6020830191508360208260051b850101111561237b57600080fd5b600080602083850312156137a957600080fd5b823567ffffffffffffffff8111156137c057600080fd5b6137cc85828601613751565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015613810578351835292840192918401916001016137f4565b50909695505050505050565b6001600160a01b03811681146108aa57600080fd5b60006020828403121561384357600080fd5b813561110d8161381c565b60006020828403121561386057600080fd5b5035919050565b6000806040838503121561387a57600080fd5b82359150602083013561388c8161381c565b809150509250929050565b60008082840360a08112156138ab57600080fd5b83356138b68161381c565b92506080601f19820112156138ca57600080fd5b506020830190509250929050565b6affffffffffffffffffffff811681146108aa57600080fd5b60008060006060848603121561390657600080fd5b83356139118161381c565b925060208401356139218161381c565b91506040840135613931816138d8565b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b6004811061397057634e487b7160e01b600052602160045260246000fd5b9052565b602080825282518282018190526000919060409081850190868401855b828110156139f057815180516001600160a01b039081168652878201511687860152858101516affffffffffffffffffffff1686860152606090810151906139db81870183613952565b50506080939093019290850190600101613991565b5091979650505050505050565b60008060008060408587031215613a1357600080fd5b843567ffffffffffffffff80821115613a2b57600080fd5b613a3788838901613751565b90965094506020870135915080821115613a5057600080fd5b818701915087601f830112613a6457600080fd5b813581811115613a7357600080fd5b8860208260071b8501011115613a8857600080fd5b95989497505060200194505050565b60008060408385031215613aaa57600080fd5b50508035926020909101359150565b60008060008060408587031215613acf57600080fd5b843567ffffffffffffffff80821115613ae757600080fd5b613af388838901613751565b90965094506020870135915080821115613b0c57600080fd5b50613b1987828801613751565b95989497509550505050565b60008060008060008060608789031215613b3e57600080fd5b863567ffffffffffffffff80821115613b5657600080fd5b613b628a838b01613751565b90985096506020890135915080821115613b7b57600080fd5b613b878a838b01613751565b90965094506040890135915080821115613ba057600080fd5b50613bad89828a01613751565b979a9699509497509295939492505050565b60008060408385031215613bd257600080fd5b8235613bdd8161381c565b9150602083013561388c8161381c565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c1d57613c1d613bed565b500290565b600082613c3f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008219821115613c8357613c83613bed565b500190565b600481106108aa57600080fd5b600060208284031215613ca757600080fd5b813561110d81613c88565b600060208284031215613cc457600080fd5b813561110d816138d8565b6040516080810167ffffffffffffffff81118282101715613cf257613cf2613c44565b60405290565b604051610180810167ffffffffffffffff81118282101715613cf257613cf2613c44565b604051601f8201601f1916810167ffffffffffffffff81118282101715613d4557613d45613c44565b604052919050565b600060808284031215613d5f57600080fd5b6040516080810181811067ffffffffffffffff82111715613d8257613d82613c44565b6040528235613d908161381c565b81526020830135613da08161381c565b60208201526040830135613db3816138d8565b60408201526060830135613dc681613c88565b60608201529392505050565b6001600160a01b03838116825260a08201908335613def8161381c565b8181166020850152506020840135613e068161381c565b16604083810191909152830135613e1c816138d8565b6affffffffffffffffffffff81166060840152506060830135613e3e81613c88565b613e4b6080840182613952565b509392505050565b600082821015613e6557613e65613bed565b500390565b634e487b7160e01b600052603160045260246000fd5b805169ffffffffffffffffffff81168114613e9a57600080fd5b919050565b600080600080600060a08688031215613eb757600080fd5b613ec086613e80565b9450602086015193506040860151925060608601519150613ee360808701613e80565b90509295509295909350565b600060208284031215613f0157600080fd5b815160ff8116811461110d57600080fd5b600181815b80851115612111578160001904821115613f3357613f33613bed565b80851615613f4057918102915b93841c9390800290613f17565b600082613f5c575060016104c3565b81613f69575060006104c3565b8160018114613f7f5760028114613f8957613fa5565b60019150506104c3565b60ff841115613f9a57613f9a613bed565b50506001821b6104c3565b5060208310610133831016604e8410600b8410161715613fc8575081810a6104c3565b613fd28383613f12565b8060001904821115613fe657613fe6613bed565b029392505050565b60006104c08383613f4d565b60006020828403121561400c57600080fd5b815161110d8161381c565b81356140228161381c565b81546001600160a01b0319166001600160a01b0382161782555060018101602083013561404e8161381c565b81546001600160a01b0319166001600160a01b038216178255506040830135614076816138d8565b81547effffffffffffffffffffff00000000000000000000000000000000000000008260a01b169150817fff0000000000000000000000ffffffffffffffffffffffffffffffffffffffff821617835560608501356140d481613c88565b600481106140f257634e487b7160e01b600052602160045260246000fd5b6001600160a01b039190911690911760f89190911b6001600160f81b0319161790555050565b600067ffffffffffffffff82111561413257614132613c44565b5060051b60200190565b805161ffff81168114613e9a57600080fd5b80518015158114613e9a57600080fd5b6000602080838503121561417157600080fd5b825167ffffffffffffffff81111561418857600080fd5b8301601f8101851361419957600080fd5b80516141ac6141a782614118565b613d1c565b81815260079190911b820183019083810190878311156141cb57600080fd5b928401925b8284101561424157608084890312156141e95760008081fd5b6141f1613ccf565b6141fa8561413c565b8152858501516142098161381c565b81870152604061421a86820161414e565b90820152606061422b86820161414e565b90820152825260809390930192908401906141d0565b979650505050505050565b600060001982141561426057614260613bed565b5060010190565b6000602080838503121561427a57600080fd5b825167ffffffffffffffff81111561429157600080fd5b8301601f810185136142a257600080fd5b80516142b06141a782614118565b81815260079190911b820183019083810190878311156142cf57600080fd5b928401925b8284101561424157608084890312156142ed5760008081fd5b6142f5613ccf565b6142fe8561413c565b81528585015161430d8161381c565b81870152604061431e86820161414e565b90820152606061432f86820161414e565b90820152825260809390930192908401906142d4565b80516dffffffffffffffffffffffffffff81168114613e9a57600080fd5b60008060006060848603121561437857600080fd5b61438184614345565b925061438f60208501614345565b9150604084015163ffffffff8116811461393157600080fd5b600062ffffff8083168185168083038211156143c6576143c6613bed565b01949350505050565b80516fffffffffffffffffffffffffffffffff81168114613e9a57600080fd5b6000806040838503121561440257600080fd5b61440b836143cf565b9150614419602084016143cf565b90509250929050565b60008060006060848603121561443757600080fd5b8351925060208401519150604084015190509250925092565b805162ffffff81168114613e9a57600080fd5b805164ffffffffff81168114613e9a57600080fd5b6000610180828403121561448b57600080fd5b614493613cf8565b61449c8361413c565b81526144aa6020840161413c565b60208201526144bb6040840161413c565b60408201526144cc6060840161413c565b60608201526144dd6080840161413c565b60808201526144ee60a08401614450565b60a08201526144ff60c0840161413c565b60c082015261451060e08401614450565b60e0820152610100614523818501614450565b90820152610120614535848201614450565b90820152610140614547848201614450565b90820152610160614559848201614463565b908201529392505050565b60006020828403121561457657600080fd5b6104c082614450565b60006020828403121561459157600080fd5b6104c08261413c56fea2646970667358221220adddd1ed6e3f52d9d4e6afcf1bdb843f8bb12a9db4795947dc24375c78973c8064736f6c634300080a00330000000000000000000000005a5c0c4832828ff878ce3ab4fec44d21200b1496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000006