protocol/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json
mzhu25 ff9c9241d8
BalancerBridge (#2613)
* Add BalancerBridge and Sampler functions

* Update sampler artifacts/wrappers

* Add Balancer support to AssetSwapper + related refactoring

* Make use of GraphQL instead of sampler

* "fix" build and add mainnet BalancerBridge tests

* address some comments

* add balancer cache and fix DexSampler tests

* lint

* wip: tests for balancer sampler ops

* Fix market operation utils test

* balancer unit tests

* Return a buy quote of 0 if the buy amount exceeds the Balancer pool's balance

* Dynamic fee estimation

* Update contract addresses, export BalancerBridge wrapper

* Update changelogs

* Fix bugs discovered via simbot

* Fix issues in balancer_utils

* override `BigNumber.config` in configured_bignumber.ts

* Special case Balancer subops in  too

* Address some more comments

* Address Balancer performance issue

* Performance improvements

* Address comment

* Fix tests

Co-authored-by: xianny <xianny@gmail.com>
2020-07-14 19:18:50 -07:00

509 lines
90 KiB
JSON
Generated

{
"schemaVersion": "2.0.0",
"contractName": "ERC20BridgeSampler",
"compilerOutput": {
"abi": [
{
"inputs": [{ "internalType": "address", "name": "devUtilsAddress", "type": "address" }],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"constant": true,
"inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }],
"name": "batchCall",
"outputs": [{ "internalType": "bytes[]", "name": "callResults", "type": "bytes[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" }
],
"name": "getLiquidityProviderFromRegistry",
"outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }
],
"name": "getOrderFillableMakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableMakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" }
],
"name": "getOrderFillableTakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableTakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "curveAddress", "type": "address" },
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" },
{
"components": [
{ "internalType": "uint256", "name": "targetSlippageBps", "type": "uint256" },
{ "internalType": "uint256", "name": "maxIterations", "type": "uint256" }
],
"internalType": "struct IERC20BridgeSampler.FakeBuyOptions",
"name": "opts",
"type": "tuple"
}
],
"name": "sampleBuysFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" },
{
"components": [
{ "internalType": "uint256", "name": "targetSlippageBps", "type": "uint256" },
{ "internalType": "uint256", "name": "maxIterations", "type": "uint256" }
],
"internalType": "struct IERC20BridgeSampler.FakeBuyOptions",
"name": "opts",
"type": "tuple"
}
],
"name": "sampleBuysFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address[]", "name": "path", "type": "address[]" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromUniswapV2",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "curveAddress", "type": "address" },
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "address", "name": "intermediateToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromEth2DaiHop",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "multibridge", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "intermediateToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromMultiBridge",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address[]", "name": "path", "type": "address[]" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromUniswapV2",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {
"batchCall(bytes[])": {
"details": "Call multiple public functions on this contract in a single transaction.",
"params": { "callDatas": "ABI-encoded call data for each function call." },
"return": "callResults ABI-encoded results data for each call."
},
"getLiquidityProviderFromRegistry(address,address,address)": {
"details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.",
"params": {
"makerToken": "Maker asset managed by liquidity provider.",
"takerToken": "Taker asset managed by liquidity provider."
},
"return": "providerAddress Address of the liquidity provider."
},
"getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or",
"params": {
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`."
},
"getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or maker/taker asset amounts (returning 0).",
"params": {
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`."
},
"sampleBuysFromCurve(address,int128,int128,uint256[])": {
"details": "Sample buy quotes from Curve.",
"params": {
"curveAddress": "Address of the Curve contract.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromEth2Dai(address,address,uint256[])": {
"details": "Sample buy quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Maker token sell amount for each sample."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromKyberNetwork(address,address,uint256[],(uint256,uint256))": {
"details": "Sample buy quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"opts": "`FakeBuyOptions` specifying target slippage and max iterations.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[],(uint256,uint256))": {
"details": "Sample buy quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"opts": "`FakeBuyOptions` specifying target slippage and max iterations.",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromUniswap(address,address,uint256[])": {
"details": "Sample buy quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token sell amount for each sample.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromUniswapV2(address[],uint256[])": {
"details": "Sample buy quotes from UniswapV2.",
"params": {
"makerTokenAmounts": "Maker token buy amount for each sample.",
"path": "Token route. Should be takerToken -> makerToken."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleSellsFromCurve(address,int128,int128,uint256[])": {
"details": "Sample sell quotes from Curve.",
"params": {
"curveAddress": "Address of the Curve contract.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromEth2Dai(address,address,uint256[])": {
"details": "Sample sell quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromEth2DaiHop(address,address,address,uint256[])": {
"details": "Sample sell quotes from Eth2Dai/Oasis using a hop to an intermediate token. I.e WBTC/DAI via ETH or WBTC/ETH via DAI",
"params": {
"intermediateToken": "Address of the token to hop to.",
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromKyberNetwork(address,address,uint256[])": {
"details": "Sample sell quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": {
"details": "Sample sell quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromMultiBridge(address,address,address,address,uint256[])": {
"details": "Sample sell quotes from MultiBridge.",
"params": {
"intermediateToken": "The address of the intermediate token to use in an indirect route.",
"makerToken": "Address of the maker token (what to buy).",
"multibridge": "Address of the MultiBridge contract.",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromUniswap(address,address,uint256[])": {
"details": "Sample sell quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromUniswapV2(address[],uint256[])": {
"details": "Sample sell quotes from UniswapV2.",
"params": {
"path": "Token route. Should be takerToken -> makerToken",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
}
}
},
"evm": {
"bytecode": {
"object": "0x60806040523480156200001157600080fd5b5060405162003d9738038062003d9783398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008a565b6000602082840312156200006c578081fd5b81516001600160a01b038116811462000083578182fd5b9392505050565b613cfd806200009a6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133ca565b6102c1565b60405161015b919061399f565b60405180910390f35b61014e61017236600461317a565b610492565b61014e6101853660046133ca565b610688565b61014e6101983660046132f8565b610842565b61014e6101ab3660046132f8565b610a1e565b61014e6101be366004613200565b610c38565b61014e6101d1366004613537565b610ccf565b61014e6101e43660046132f8565b610d78565b61014e6101f73660046132f8565b611038565b61020f61020a3660046134cb565b6111fe565b60405161015b9190613921565b61014e61022a3660046132f8565b61133d565b61014e61023d366004613537565b6115e5565b61014e610250366004613273565b6118be565b61014e610263366004613200565b6118f8565b61014e610276366004613408565b611afc565b61028e610289366004613130565b611cdf565b60405161015b91906137c1565b61014e6102a9366004613358565b611e1a565b61014e6102bc366004613408565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a5565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136de565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a5565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136de565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a5565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136de565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e838561201e565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a5565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136de565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a838561201e565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120a9565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c1565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c1565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612435565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d84838561201e565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df786612477565b610dff565b60005b90506000610e0b6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e4686612477565b610e4e565b60005b905060005b8381101561102d576001610e656120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b602002602001015161250f565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c000000000000000000000000000000000000000000000000000000008361250f565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b6060611044838561201e565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a5565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136de565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613795565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b6060611349838561201e565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc86612477565b6113c4565b60005b905060006113d06120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b86612477565b611413565b60005b905060005b8381101561102d57600161142a6120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c3000000000000000000000000000000000000000000000000000000008361250f565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a5565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dce565b600080838060200190516118499190810190613671565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612657565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a5565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136de565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b4861281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a5565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135de565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a5565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612835565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612657565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e9761281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a5565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135de565b600081518110611ff157fe5b602002602001015190508086858151811061200857fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613a00565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120ce6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612106578561211c565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121286120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121605785612176565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121838861287a565b60ff16905060006121938861287a565b60ff169050600060606121a4612885565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612224916137a5565b6000604051808303818686fa925050503d8060008114612260576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b606091505b50915091508161228257506000965086955061242d945050505050565b60008180602001905161229891908101906130e7565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122ef94939291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237891906137a5565b6000604051808303818686fa925050503d80600081146123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b50909350915060008084156123e557838060200190516123dc9190810190613103565b925090506123fb565b506000995089985061242d975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241757fe5b048161241f57fe5b049a50985050505050505050505b935093915050565b6000610cc78361246b61244f82600163ffffffff61289d16565b61245f888763ffffffff6128bc16565b9063ffffffff6128ed16565b9063ffffffff61290916565b6000612481612933565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124b991906137c1565b60206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250991908101906130e7565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166125325761242d565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125619190613bb1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ea91906137a5565b6000604051808303818686fa925050503d8060008114612626576040519150601f19603f3d011682016040523d82523d6000602084013e61262b565b606091505b509092509050811561264e578080602001905161264b91908101906136de565b92505b50935093915050565b6060612663868861201e565b845161266e576118ee565b6000806000875160405190808252806020026020018201604052801561269e578160200160208202803883390190505b5093506126c2898b8a6000815181106126b357fe5b6020026020010151898961294b565b9250826126d257506118ee915050565b6126df8a8a85898961294b565b9150816126ef57506118ee915050565b60005b885181101561280f5760005b88602001518110156127d1576127288a838151811061271957fe5b60200260200101518587612435565b945061273f89600001516127100161271087612435565b945060006127508d8d888c8c61294b565b90508061275d57506127d1565b8094508a838151811061276c57fe5b602002602001015185106127c85760008b848151811061278857fe5b60200260200101518c858151811061279c57fe5b6020026020010151870361271002816127b157fe5b0490508a6000015181116127c65750506127d1565b505b506001016126fe565b506127f08982815181106127e157fe5b60200260200101518486612435565b8582815181106127fc57fe5b60209081029190910101526001016126f2565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285b5761285b6128566004855185601401612c00565b612ca5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250982612cad565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b6576128b661285660028585612d7e565b50900390565b6000826128cb57506000612509565b828202828482816128d857fe5b0414611e1357611e1361285660018686612d7e565b600082820183811015611e1357611e1361285660008686612d7e565b60008161291f5761291f61285660038585612d7e565b600082848161292a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a90576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0c908a908a908590602401613881565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b49565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612ac99086908b908b908690602401613809565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7291906137a5565b600060405180830381855afa9150503d8060008114612bad576040519150601f19603f3d011682016040523d82523d6000602084013e612bb2565b606091505b509150915081612bc957600094505050505061067f565b80806020019051612bdd91908101906135de565b600081518110612be957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c1f939291906139d4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1191906137a5565b600060405180830381855afa9150503d8060008114612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b5091509150818015612d64575080516020145b15612d7757612d74816000612d9d565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c1f939291906139b2565b6000611e13838360008160200183511015612dc557612dc56128566005855185602001612c00565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250981613c95565b600082601f830112612e0b578081fd5b8135612e1e612e1982613c45565b613c1e565b8181529150602080830190840160005b83811015612e5b57612e468760208435890101612ece565b83526020928301929190910190600101612e2e565b5050505092915050565b600082601f830112612e75578081fd5b8135612e83612e1982613c45565b818152915060208083019084810181840286018201871015612ea457600080fd5b60005b84811015612ec357813584529282019290820190600101612ea7565b505050505092915050565b600082601f830112612ede578081fd5b813567ffffffffffffffff811115612ef4578182fd5b612f2560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c1e565b9150808252836020828501011115612f3c57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250957600080fd5b600060408284031215612f78578081fd5b612f826040613c1e565b9050813581526020820135602082015292915050565b60006101c0808385031215612fab578182fd5b612fb481613c1e565b915050612fc18383612df0565b8152612fd08360208401612df0565b6020820152612fe28360408401612df0565b6040820152612ff48360608401612df0565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305657600080fd5b61306286838701612ece565b8385015261016092508285013591508082111561307e57600080fd5b61308a86838701612ece565b838501526101809250828501359150808211156130a657600080fd5b6130b286838701612ece565b838501526101a09250828501359150808211156130ce57600080fd5b506130db85828601612ece565b82840152505092915050565b6000602082840312156130f8578081fd5b8151611e1381613c95565b60008060408385031215613115578081fd5b825161312081613c95565b6020939093015192949293505050565b600080600060608486031215613144578081fd5b833561314f81613c95565b9250602084013561315f81613c95565b9150604084013561316f81613c95565b809150509250925092565b600080600080600060a08688031215613191578283fd5b853561319c81613c95565b945060208601356131ac81613c95565b935060408601356131bc81613c95565b925060608601356131cc81613c95565b9150608086013567ffffffffffffffff8111156131e7578182fd5b6131f388828901612e65565b9150509295509295909350565b60008060008060808587031215613215578182fd5b843561322081613c95565b9350602085013561323081613c95565b9250604085013561324081613c95565b9150606085013567ffffffffffffffff81111561325b578182fd5b61326787828801612e65565b91505092959194509250565b600080600080600060c0868803121561328a578283fd5b853561329581613c95565b945060208601356132a581613c95565b935060408601356132b581613c95565b9250606086013567ffffffffffffffff8111156132d0578182fd5b6132dc88828901612e65565b9250506132ec8760808801612f67565b90509295509295909350565b60008060006060848603121561330c578081fd5b833561331781613c95565b9250602084013561332781613c95565b9150604084013567ffffffffffffffff811115613342578182fd5b61334e86828701612e65565b9150509250925092565b60008060008060a0858703121561336d578182fd5b843561337881613c95565b9350602085013561338881613c95565b9250604085013567ffffffffffffffff8111156133a3578283fd5b6133af87828801612e65565b9250506133bf8660608701612f67565b905092959194509250565b600080600080608085870312156133df578182fd5b84356133ea81613c95565b93506133f98660208701612f55565b92506132408660408701612f55565b6000806040838503121561341a578182fd5b823567ffffffffffffffff80821115613431578384fd5b81850186601f820112613442578485fd5b80359250613452612e1984613c45565b80848252602080830192508084018a828389028701011115613472578889fd5b8894505b8685101561349d57803561348981613c95565b845260019490940193928101928101613476565b5090965087013593505050808211156134b4578283fd5b506134c185828601612e65565b9150509250929050565b600080602083850312156134dd578182fd5b823567ffffffffffffffff808211156134f4578384fd5b81850186601f820112613505578485fd5b8035925081831115613515578485fd5b8660208085028301011115613528578485fd5b60200196919550909350505050565b60008060408385031215613549578182fd5b823567ffffffffffffffff80821115613560578384fd5b81850186601f820112613571578485fd5b80359250613581612e1984613c45565b83815260208082019190838101885b878110156135b9576135a78c848435890101612f98565b85529382019390820190600101613590565b509197508801359450505050808211156135d1578283fd5b506134c185828601612dfb565b600060208083850312156135f0578182fd5b825167ffffffffffffffff811115613606578283fd5b80840185601f820112613617578384fd5b80519150613627612e1983613c45565b8281528381019082850185850284018601891015613643578687fd5b8693505b84841015613665578051835260019390930192918501918501613647565b50979650505050505050565b600080600083850360a0811215613686578182fd5b6060811215613693578182fd5b5061369e6060613c1e565b8451600781106136ac578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461316f578182fd5b6000602082840312156136ef578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613741578151865260209586019590910190600101613723565b5093949350505050565b60008151808452613763816020860160208601613c65565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137b7818460208701613c65565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613710565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613710565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613992577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398085835161374b565b94509285019290850190600101613946565b5092979650505050505050565b600060208252611e136020830184613710565b60608101600485106139c057fe5b938152602081019290925260409091015290565b60608101600885106139c057fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a716040830185516136f6565b6020840151613a8360608401826136f6565b506040840151613a9660808401826136f6565b506060840151613aa960a08401826136f6565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1a61020087018561374b565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b59828761374b565b838b015196508489820301868a0152613b72818861374b565b955050808a0151955050505080858303016101e086015250613b94818361374b565b8481036020860152613ba6818761374b565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1257835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613bde565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c3d57600080fd5b604052919050565b600067ffffffffffffffff821115613c5b578081fd5b5060209081020190565b60005b83811015613c80578181015183820152602001613c68565b83811115613c8f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cb757600080fd5b5056fea365627a7a723158204f89046f6ef91e066e56b4d991a1a9740ea0d2c2bfef6144bf56dbf1f65952d76c6578706572696d656e74616cf564736f6c63430005110040"
},
"deployedBytecode": {
"object": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133ca565b6102c1565b60405161015b919061399f565b60405180910390f35b61014e61017236600461317a565b610492565b61014e6101853660046133ca565b610688565b61014e6101983660046132f8565b610842565b61014e6101ab3660046132f8565b610a1e565b61014e6101be366004613200565b610c38565b61014e6101d1366004613537565b610ccf565b61014e6101e43660046132f8565b610d78565b61014e6101f73660046132f8565b611038565b61020f61020a3660046134cb565b6111fe565b60405161015b9190613921565b61014e61022a3660046132f8565b61133d565b61014e61023d366004613537565b6115e5565b61014e610250366004613273565b6118be565b61014e610263366004613200565b6118f8565b61014e610276366004613408565b611afc565b61028e610289366004613130565b611cdf565b60405161015b91906137c1565b61014e6102a9366004613358565b611e1a565b61014e6102bc366004613408565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a5565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136de565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a5565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136de565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a5565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136de565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e838561201e565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a5565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136de565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a838561201e565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120a9565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c1565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c1565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612435565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d84838561201e565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df786612477565b610dff565b60005b90506000610e0b6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e4686612477565b610e4e565b60005b905060005b8381101561102d576001610e656120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b602002602001015161250f565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c000000000000000000000000000000000000000000000000000000008361250f565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b6060611044838561201e565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612091565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a5565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136de565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613795565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b6060611349838561201e565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc86612477565b6113c4565b60005b905060006113d06120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b86612477565b611413565b60005b905060005b8381101561102d57600161142a6120a9565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120a9565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c3000000000000000000000000000000000000000000000000000000008361250f565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a5d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a5565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dce565b600080838060200190516118499190810190613671565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612657565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138ba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a5565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136de565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b4861281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a5565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135de565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a5565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612835565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612657565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e9761281d565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a5565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135de565b600081518110611ff157fe5b602002602001015190508086858151811061200857fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613a00565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120ce6120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612106578561211c565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121286120a9565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121605785612176565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121838861287a565b60ff16905060006121938861287a565b60ff169050600060606121a4612885565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612224916137a5565b6000604051808303818686fa925050503d8060008114612260576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b606091505b50915091508161228257506000965086955061242d945050505050565b60008180602001905161229891908101906130e7565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122ef94939291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237891906137a5565b6000604051808303818686fa925050503d80600081146123b4576040519150601f19603f3d011682016040523d82523d6000602084013e6123b9565b606091505b50909350915060008084156123e557838060200190516123dc9190810190613103565b925090506123fb565b506000995089985061242d975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241757fe5b048161241f57fe5b049a50985050505050505050505b935093915050565b6000610cc78361246b61244f82600163ffffffff61289d16565b61245f888763ffffffff6128bc16565b9063ffffffff6128ed16565b9063ffffffff61290916565b6000612481612933565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124b991906137c1565b60206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250991908101906130e7565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166125325761242d565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125619190613bb1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ea91906137a5565b6000604051808303818686fa925050503d8060008114612626576040519150601f19603f3d011682016040523d82523d6000602084013e61262b565b606091505b509092509050811561264e578080602001905161264b91908101906136de565b92505b50935093915050565b6060612663868861201e565b845161266e576118ee565b6000806000875160405190808252806020026020018201604052801561269e578160200160208202803883390190505b5093506126c2898b8a6000815181106126b357fe5b6020026020010151898961294b565b9250826126d257506118ee915050565b6126df8a8a85898961294b565b9150816126ef57506118ee915050565b60005b885181101561280f5760005b88602001518110156127d1576127288a838151811061271957fe5b60200260200101518587612435565b945061273f89600001516127100161271087612435565b945060006127508d8d888c8c61294b565b90508061275d57506127d1565b8094508a838151811061276c57fe5b602002602001015185106127c85760008b848151811061278857fe5b60200260200101518c858151811061279c57fe5b6020026020010151870361271002816127b157fe5b0490508a6000015181116127c65750506127d1565b505b506001016126fe565b506127f08982815181106127e157fe5b60200260200101518486612435565b8582815181106127fc57fe5b60209081029190910101526001016126f2565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285b5761285b6128566004855185601401612c00565b612ca5565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250982612cad565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b6576128b661285660028585612d7e565b50900390565b6000826128cb57506000612509565b828202828482816128d857fe5b0414611e1357611e1361285660018686612d7e565b600082820183811015611e1357611e1361285660008686612d7e565b60008161291f5761291f61285660038585612d7e565b600082848161292a57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298057fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a90576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0c908a908a908590602401613881565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b49565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612ac99086908b908b908690602401613809565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7291906137a5565b600060405180830381855afa9150503d8060008114612bad576040519150601f19603f3d011682016040523d82523d6000602084013e612bb2565b606091505b509150915081612bc957600094505050505061067f565b80806020019051612bdd91908101906135de565b600081518110612be957fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c1f939291906139d4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1191906137a5565b600060405180830381855afa9150503d8060008114612d4c576040519150601f19603f3d011682016040523d82523d6000602084013e612d51565b606091505b5091509150818015612d64575080516020145b15612d7757612d74816000612d9d565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c1f939291906139b2565b6000611e13838360008160200183511015612dc557612dc56128566005855185602001612c00565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250981613c95565b600082601f830112612e0b578081fd5b8135612e1e612e1982613c45565b613c1e565b8181529150602080830190840160005b83811015612e5b57612e468760208435890101612ece565b83526020928301929190910190600101612e2e565b5050505092915050565b600082601f830112612e75578081fd5b8135612e83612e1982613c45565b818152915060208083019084810181840286018201871015612ea457600080fd5b60005b84811015612ec357813584529282019290820190600101612ea7565b505050505092915050565b600082601f830112612ede578081fd5b813567ffffffffffffffff811115612ef4578182fd5b612f2560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c1e565b9150808252836020828501011115612f3c57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250957600080fd5b600060408284031215612f78578081fd5b612f826040613c1e565b9050813581526020820135602082015292915050565b60006101c0808385031215612fab578182fd5b612fb481613c1e565b915050612fc18383612df0565b8152612fd08360208401612df0565b6020820152612fe28360408401612df0565b6040820152612ff48360608401612df0565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305657600080fd5b61306286838701612ece565b8385015261016092508285013591508082111561307e57600080fd5b61308a86838701612ece565b838501526101809250828501359150808211156130a657600080fd5b6130b286838701612ece565b838501526101a09250828501359150808211156130ce57600080fd5b506130db85828601612ece565b82840152505092915050565b6000602082840312156130f8578081fd5b8151611e1381613c95565b60008060408385031215613115578081fd5b825161312081613c95565b6020939093015192949293505050565b600080600060608486031215613144578081fd5b833561314f81613c95565b9250602084013561315f81613c95565b9150604084013561316f81613c95565b809150509250925092565b600080600080600060a08688031215613191578283fd5b853561319c81613c95565b945060208601356131ac81613c95565b935060408601356131bc81613c95565b925060608601356131cc81613c95565b9150608086013567ffffffffffffffff8111156131e7578182fd5b6131f388828901612e65565b9150509295509295909350565b60008060008060808587031215613215578182fd5b843561322081613c95565b9350602085013561323081613c95565b9250604085013561324081613c95565b9150606085013567ffffffffffffffff81111561325b578182fd5b61326787828801612e65565b91505092959194509250565b600080600080600060c0868803121561328a578283fd5b853561329581613c95565b945060208601356132a581613c95565b935060408601356132b581613c95565b9250606086013567ffffffffffffffff8111156132d0578182fd5b6132dc88828901612e65565b9250506132ec8760808801612f67565b90509295509295909350565b60008060006060848603121561330c578081fd5b833561331781613c95565b9250602084013561332781613c95565b9150604084013567ffffffffffffffff811115613342578182fd5b61334e86828701612e65565b9150509250925092565b60008060008060a0858703121561336d578182fd5b843561337881613c95565b9350602085013561338881613c95565b9250604085013567ffffffffffffffff8111156133a3578283fd5b6133af87828801612e65565b9250506133bf8660608701612f67565b905092959194509250565b600080600080608085870312156133df578182fd5b84356133ea81613c95565b93506133f98660208701612f55565b92506132408660408701612f55565b6000806040838503121561341a578182fd5b823567ffffffffffffffff80821115613431578384fd5b81850186601f820112613442578485fd5b80359250613452612e1984613c45565b80848252602080830192508084018a828389028701011115613472578889fd5b8894505b8685101561349d57803561348981613c95565b845260019490940193928101928101613476565b5090965087013593505050808211156134b4578283fd5b506134c185828601612e65565b9150509250929050565b600080602083850312156134dd578182fd5b823567ffffffffffffffff808211156134f4578384fd5b81850186601f820112613505578485fd5b8035925081831115613515578485fd5b8660208085028301011115613528578485fd5b60200196919550909350505050565b60008060408385031215613549578182fd5b823567ffffffffffffffff80821115613560578384fd5b81850186601f820112613571578485fd5b80359250613581612e1984613c45565b83815260208082019190838101885b878110156135b9576135a78c848435890101612f98565b85529382019390820190600101613590565b509197508801359450505050808211156135d1578283fd5b506134c185828601612dfb565b600060208083850312156135f0578182fd5b825167ffffffffffffffff811115613606578283fd5b80840185601f820112613617578384fd5b80519150613627612e1983613c45565b8281528381019082850185850284018601891015613643578687fd5b8693505b84841015613665578051835260019390930192918501918501613647565b50979650505050505050565b600080600083850360a0811215613686578182fd5b6060811215613693578182fd5b5061369e6060613c1e565b8451600781106136ac578283fd5b81526020858101519082015260408086015190820152606085015160808601519194509250801515811461316f578182fd5b6000602082840312156136ef578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613741578151865260209586019590910190600101613723565b5093949350505050565b60008151808452613763816020860160208601613c65565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137b7818460208701613c65565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613710565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613710565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613992577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398085835161374b565b94509285019290850190600101613946565b5092979650505050505050565b600060208252611e136020830184613710565b60608101600485106139c057fe5b938152602081019290925260409091015290565b60608101600885106139c057fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a716040830185516136f6565b6020840151613a8360608401826136f6565b506040840151613a9660808401826136f6565b506060840151613aa960a08401826136f6565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1a61020087018561374b565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b59828761374b565b838b015196508489820301868a0152613b72818861374b565b955050808a0151955050505080858303016101e086015250613b94818361374b565b8481036020860152613ba6818761374b565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1257835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613bde565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c3d57600080fd5b604052919050565b600067ffffffffffffffff821115613c5b578081fd5b5060209081020190565b60005b83811015613c80578181015183820152602001613c68565b83811115613c8f576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cb757600080fd5b5056fea365627a7a723158204f89046f6ef91e066e56b4d991a1a9740ea0d2c2bfef6144bf56dbf1f65952d76c6578706572696d656e74616cf564736f6c63430005110040"
}
}
},
"compiler": {
"name": "solc",
"version": "0.5.17+commit.d19bba13",
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000000,
"details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
},
"evmVersion": "istanbul"
}
},
"chains": {}
}