UNPKG

@layerzerolabs/hyperliquid-composer

Version:

LayerZero Labs reference EVM OmniChain Fungible Token (OFT) implementation for Hyperliquid

1 lines 140 kB
{"abi":[{"type":"constructor","inputs":[{"name":"_endpoint","type":"address","internalType":"address"},{"name":"_oft","type":"address","internalType":"address"},{"name":"_coreIndexId","type":"uint64","internalType":"uint64"},{"name":"_assetDecimalDiff","type":"int64","internalType":"int64"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"CORE_WRITER_VERSION","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"HLP_CORE_WRITER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"HLP_PRECOMPILE_READ_SPOT_BALANCE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"HYPE_CHAIN_ID_MAINNET","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"HYPE_CHAIN_ID_TESTNET","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"HYPE_INDEX_MAINNET","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"HYPE_INDEX_TESTNET","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"SPOT_SEND_ACTION_ID","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"SPOT_SEND_HEADER","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"balanceOfHyperCore","inputs":[{"name":"_user","type":"address","internalType":"address"},{"name":"_tokenId","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"endpoint","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fundAddressOnHyperCore","inputs":[{"name":"_receiver","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_executor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getErrorPayload","inputs":[{"name":"_err","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"function","name":"getHypeAsset","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct IHyperAsset","components":[{"name":"assetBridgeAddress","type":"address","internalType":"address"},{"name":"coreIndexId","type":"uint64","internalType":"uint64"},{"name":"decimalDiff","type":"int64","internalType":"int64"}]}],"stateMutability":"view"},{"type":"function","name":"getOFTAsset","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct IHyperAsset","components":[{"name":"assetBridgeAddress","type":"address","internalType":"address"},{"name":"coreIndexId","type":"uint64","internalType":"uint64"},{"name":"decimalDiff","type":"int64","internalType":"int64"}]}],"stateMutability":"view"},{"type":"function","name":"hypeAsset","inputs":[],"outputs":[{"name":"assetBridgeAddress","type":"address","internalType":"address"},{"name":"coreIndexId","type":"uint64","internalType":"uint64"},{"name":"decimalDiff","type":"int64","internalType":"int64"}],"stateMutability":"view"},{"type":"function","name":"hypeIndexByChainId","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"lzCompose","inputs":[{"name":"_oft","type":"address","internalType":"address"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"_message","type":"bytes","internalType":"bytes"},{"name":"_executor","type":"address","internalType":"address"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"oft","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IOFT"}],"stateMutability":"view"},{"type":"function","name":"oftAsset","inputs":[],"outputs":[{"name":"assetBridgeAddress","type":"address","internalType":"address"},{"name":"coreIndexId","type":"uint64","internalType":"uint64"},{"name":"decimalDiff","type":"int64","internalType":"int64"}],"stateMutability":"view"},{"type":"function","name":"quoteHyperCoreAmount","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"},{"name":"_isOFT","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IHyperAssetAmount","components":[{"name":"evm","type":"uint256","internalType":"uint256"},{"name":"dust","type":"uint256","internalType":"uint256"},{"name":"core","type":"uint64","internalType":"uint64"}]}],"stateMutability":"view"},{"type":"function","name":"refundERC20","inputs":[{"name":"_refundAddress","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"refundNativeTokens","inputs":[{"name":"_refundAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"sendAssetToHyperCore","inputs":[{"name":"_receiver","type":"address","internalType":"address"},{"name":"_amountLD","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"type":"function","name":"validate_addresses_or_refund","inputs":[{"name":"_maybeReceiver","type":"bytes","internalType":"bytes"},{"name":"_senderBytes32","type":"bytes32","internalType":"bytes32"},{"name":"_amountLD","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"pure"},{"type":"function","name":"validate_message","inputs":[{"name":"_composeMessage","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes32","internalType":"bytes32"},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"pure"},{"type":"event","name":"ErrorERC20_Refund","inputs":[{"name":"refundTo","type":"address","indexed":false,"internalType":"address"},{"name":"refundAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ErrorHYPE_Refund","inputs":[{"name":"refundTo","type":"address","indexed":false,"internalType":"address"},{"name":"refundAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ErrorMessage","inputs":[{"name":"reason","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ErrorSpot_FailedToSend","inputs":[{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"tokenId","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"errorMessage","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"ExcessHYPE_Refund","inputs":[{"name":"refundTo","type":"address","indexed":false,"internalType":"address"},{"name":"refundAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"ErrorMsg","inputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"HyperLiquidComposerCore_SpotBalanceRead_Failed","inputs":[{"name":"user","type":"address","internalType":"address"},{"name":"tokenId","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"HyperLiquidComposer_FailedToRefund_HYPE","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"HyperLiquidComposer_FailedToSend_HYPE","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"HyperLiquidComposer_InvalidArgument_EndpointShouldNotBeZeroAddress","inputs":[{"name":"receivedEndpointAddress","type":"address","internalType":"address"}]},{"type":"error","name":"HyperLiquidComposer_InvalidCall_NotComposer","inputs":[{"name":"notComposerAddress","type":"address","internalType":"address"}]},{"type":"error","name":"HyperLiquidComposer_InvalidCall_NotEndpoint","inputs":[{"name":"notEndpointAddress","type":"address","internalType":"address"},{"name":"expectedEndpointAddress","type":"address","internalType":"address"}]},{"type":"error","name":"HyperLiquidComposer_InvalidCall_NotOFT","inputs":[{"name":"internalOFTAddress","type":"address","internalType":"address"},{"name":"receivedOFTAddress","type":"address","internalType":"address"}]},{"type":"error","name":"HyperLiquidComposer_InvalidComposeMessage","inputs":[{"name":"errorMessage","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b506040516200310d3803806200310d83398101604081905262000033916200028a565b83836001600160a01b0382166200006c5760405163fb82c1f160e01b81526001600160a01b038316600482015260240160405180910390fd5b6001600160a01b03808316608052811660a081905260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa158015620000bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000e19190620002f9565b6001600160a01b031660c05250505f60208190527f2802b8ca0a4d9948ac89ce9ba15f4015f0f68c52469c4df23bbaf374f1d4604080546001600160401b0319908116610451179091556103e79091527f332eac5de6beffe8ee7761a0342c75594c3acb5fdde0a2555227e56aa65d4141805490911660961790556040805160608101909152806200017c6001600160401b03851662000257565b6001600160a01b0390811682526001600160401b0394851660208084019190915260079490940b604092830152825160018054858701519284166001600160e01b031991821617600160a01b93891684021790915593830151600280546001600160401b031990811692891692909217905583516060810185527322222222222222222222222222222222222222228152465f90815280885285902054909716958701869052600a938701849052955160038054919093169416939093179390920292909217905560048054909216179055506200033c9050565b5f62000268826001609d1b6200031c565b92915050565b80516001600160a01b038116811462000285575f80fd5b919050565b5f805f80608085870312156200029e575f80fd5b620002a9856200026e565b9350620002b9602086016200026e565b60408601519093506001600160401b0381168114620002d6575f80fd5b8092505060608501518060070b8114620002ee575f80fd5b939692955090935050565b5f602082840312156200030a575f80fd5b62000315826200026e565b9392505050565b808201808211156200026857634e487b7160e01b5f52601160045260245ffd5b60805160a05160c051612d75620003985f395f8181610791015281816111b30152818161139701526118e401525f818161058401528181610b8e0152610c0501525f818161043201528181610aca0152610b420152612d755ff3fe6080604052600436106101a7575f3560e01c80638483bc00116100e7578063d0a1026011610087578063ebaeefd611610062578063ebaeefd6146106be578063f6e6b240146106dd578063f9716faf14610735578063fc0c546a14610780575f80fd5b8063d0a102601461066d578063d9acf0ec14610680578063da001a291461069f575f80fd5b8063aae12e46116100c2578063aae12e46146105a6578063ba8726791461062f578063bc963bc714610644578063d00b1ad514610659575f80fd5b80638483bc00146105305780639180b744146105455780639b5215f614610573575f80fd5b80634bd162df116101525780635e280f111161012d5780635e280f1114610421578063765008a1146104545780637ecd9ac3146104ea57806381e8dcb414610511575f80fd5b80634bd162df1461037a5780635241b496146103c85780635b9a23731461040c575f80fd5b806320d9af9a1161018257806320d9af9a1461024157806322dbe29c146102645780632d0e315c146102ac575f80fd5b806303be2050146101b25780630d1995e0146101e75780631f8164d91461022d575f80fd5b366101ae57005b5f80fd5b3480156101bd575f80fd5b506101d16101cc36600461236f565b6107b3565b6040516101de91906123fb565b60405180910390f35b3480156101f2575f80fd5b506101d16040518060400160405280600381526020017d06000000000000000000000000000000000000000000000000000000000081525081565b348015610238575f80fd5b506101d16107c8565b34801561024c575f80fd5b506102566103e681565b6040519081526020016101de565b34801561026f575f80fd5b506101d16040518060400160405280600181526020017f010000000000000000000000000000000000000000000000000000000000000081525081565b3480156102b7575f80fd5b50610335604080516060810182525f8082526020820181905291810191909152506040805160608101825260015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16602082015260025460070b9181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015167ffffffffffffffff16908201529181015160070b908201526060016101de565b348015610385575f80fd5b506103af61039436600461240d565b5f6020819052908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101de565b3480156103d3575f80fd5b506103e76103e23660046124d2565b61084c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101de565b348015610417575f80fd5b506102566103e781565b34801561042c575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b34801561045f575f80fd5b506001546002546104ac9173ffffffffffffffffffffffffffffffffffffffff8116917401000000000000000000000000000000000000000090910467ffffffffffffffff169060070b83565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015260070b908201526060016101de565b3480156104f5575f80fd5b506103e773333333333333333333333333333333333333333381565b34801561051c575f80fd5b506103af61052b366004612594565b610968565b61054361053e3660046125cb565b610973565b005b348015610550575f80fd5b5061056461055f36600461236f565b610a90565b6040516101de939291906125ed565b34801561057e575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b1575f80fd5b50610335604080516060810182525f8082526020820181905291810191909152506040805160608101825260035473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16602082015260045460070b9181019190915290565b34801561063a575f80fd5b506103e761080181565b34801561064f575f80fd5b506103af61045181565b348015610664575f80fd5b506103af609681565b61054361067b36600461260b565b610ac8565b34801561068b575f80fd5b5061054361069a3660046126a5565b611142565b3480156106aa575f80fd5b506105436106b93660046126cf565b6113c4565b3480156106c9575f80fd5b506105436106d83660046126a5565b611866565b3480156106e8575f80fd5b506003546004546104ac9173ffffffffffffffffffffffffffffffffffffffff8116917401000000000000000000000000000000000000000090910467ffffffffffffffff169060070b83565b348015610740575f80fd5b5061075461074f36600461270e565b61190b565b6040805182518152602080840151908201529181015167ffffffffffffffff16908201526060016101de565b34801561078b575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b60606107bf8383611a41565b90505b92915050565b604080518082018252600181527f010000000000000000000000000000000000000000000000000000000000000060208083019190915282518084018452600381527d06000000000000000000000000000000000000000000000000000000000081830152925161083a939101612735565b60405160208183030381529060405281565b5f8061085784611a8b565b90505f61086386611ab6565b905073ffffffffffffffffffffffffffffffffffffffff811661095f5785516040515f917f09b3473100000000000000000000000000000000000000000000000000000000916108b7918a91602401612763565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610923818487611b19565b6040517f4f95203300000000000000000000000000000000000000000000000000000000815260040161095691906123fb565b60405180910390fd5b95945050505050565b5f6107bf8383611b74565b3330146109ae576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f341180156109d2575073ffffffffffffffffffffffffffffffffffffffff811615155b15610a8d575f8173ffffffffffffffffffffffffffffffffffffffff16346040515f6040518083038185875af1925050503d805f8114610a2d576040519150601f19603f3d011682016040523d82523d5f602084013e610a32565b606091505b5050905080610a8b576040517fc8ee485e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152346024820152604401610956565b505b50565b5f8060605f610a9f8686611c88565b90505f610aac8787611ca0565b90505f610ab98888611caf565b92989197509195509350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610b75576040517fefa9309d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152336024820152604401610956565b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f86fee0c000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015288166024820152604401610956565b5f805f60603073ffffffffffffffffffffffffffffffffffffffff16639180b7448a8a6040518363ffffffff1660e01b8152600401610c7a929190612784565b5f60405180830381865afa925050508015610cb657506040513d5f823e601f3d908101601f19168201604052610cb391908101906127f4565b60015b610d1c573d808015610ce3576040519150601f19603f3d011682016040523d82523d5f602084013e610ce8565b606091505b50806040517ed4895a00000000000000000000000000000000000000000000000000000000815260040161095691906123fb565b919450925090506040517f5241b4960000000000000000000000000000000000000000000000000000000081523090635241b49690610d6390849086908890600401612840565b602060405180830381865afa925050508015610d9c575060408051601f3d908101601f19168201909252610d9991810190612864565b60015b610e1e573d808015610dc9576040519150601f19603f3d011682016040523d82523d5f602084013e610dce565b606091505b505f610dda828a611cbe565b90507f612baef0082f9abcf6dc7b491d75346418381b75756830d7029939026d1b46b981604051610e0b91906123fb565b60405180910390a1505050505050611139565b93503415610fa0576040517fda001a2900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015234602483015288166044820152309063da001a29906064015f604051808303815f87803b158015610e98575f80fd5b505af1925050508015610ea9575060015b610fa0573d808015610ed6576040519150601f19603f3d011682016040523d82523d5f602084013e610edb565b606091505b506040517f8483bc0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201523090638483bc009034906024015f604051808303818588803b158015610f42575f80fd5b505af1158015610f54573d5f803e3d5ffd5b50505050505f610f64828a611cbe565b90507f612baef0082f9abcf6dc7b491d75346418381b75756830d7029939026d1b46b981604051610f9591906123fb565b60405180910390a150505b6040517fd9acf0ec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101849052309063d9acf0ec906044015f604051808303815f87803b15801561100b575f80fd5b505af192505050801561101c575060015b611134573d808015611049576040519150601f19603f3d011682016040523d82523d5f602084013e61104e565b606091505b506040517febaeefd600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101859052309063ebaeefd6906044015f604051808303815f87803b1580156110ba575f80fd5b505af11580156110cc573d5f803e3d5ffd5b50506001546040517f775ce5b47736b2186798494ee89239e4c0341b516c05bf613205d83ffbfffdc6935061112a9250889174010000000000000000000000000000000000000000900467ffffffffffffffff16908890869061287f565b60405180910390a1505b505050505b50505050505050565b33301461117d576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f61118982600161190b565b80519091501561136d5760015481516111dd9173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690612024565b600154604082810151815173ffffffffffffffffffffffffffffffffffffffff871660208201527401000000000000000000000000000000000000000090930467ffffffffffffffff908116928401929092521660608201525f9060800160408051601f198184030181528282018252600183527f010000000000000000000000000000000000000000000000000000000000000060208481019190915282518084018452600381527d0600000000000000000000000000000000000000000000000000000000008183015292519194505f936112be939092909101612735565b60408051601f19818403018152908290526112dd918490602001612735565b60408051601f19818403018152908290527f17938e130000000000000000000000000000000000000000000000000000000082529150733333333333333333333333333333333333333333906317938e139061133d9084906004016123fb565b5f604051808303815f87803b158015611354575f80fd5b505af1158015611366573d5f803e3d5ffd5b5050505050505b6020810151156113bf5760208101516113bf9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908590612024565b505050565b3330146113ff576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f61140a835f61190b565b60035481516040519293505f9273ffffffffffffffffffffffffffffffffffffffff909216918381818185875af1925050503d805f8114611466576040519150601f19603f3d011682016040523d82523d5f602084013e61146b565b606091505b50509050806114a9576040517fb7e54a0700000000000000000000000000000000000000000000000000000000815260048101859052602401610956565b600354604083810151815173ffffffffffffffffffffffffffffffffffffffff891660208201527401000000000000000000000000000000000000000090930467ffffffffffffffff908116928401929092521660608201525f9060800160408051601f198184030181528282018252600183527f010000000000000000000000000000000000000000000000000000000000000060208481019190915282518084018452600381527d0600000000000000000000000000000000000000000000000000000000008183015292519194505f9361158a939092909101612735565b60408051601f19818403018152908290526115a9918490602001612735565b60408051601f19818403018152908290527f17938e130000000000000000000000000000000000000000000000000000000082529150733333333333333333333333333333333333333333906317938e13906116099084906004016123fb565b5f604051808303815f87803b158015611620575f80fd5b505af1158015611632573d5f803e3d5ffd5b505050506020840151156111395760208401516040517f8483bc0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891660048201523091638483bc00916024015f604051808303818588803b1580156116a9575f80fd5b505af1935050505080156116bb575060015b61180857602084015160405173ffffffffffffffffffffffffffffffffffffffff871691905f81818185875af1925050503d805f8114611716576040519150601f19603f3d011682016040523d82523d5f602084013e61171b565b606091505b50909350508215611781576020808501516040805173ffffffffffffffffffffffffffffffffffffffff89168152928301919091527fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa1791015b60405180910390a1611139565b60208401516040513291905f81818185875af1925050503d805f81146117c2576040519150601f19603f3d011682016040523d82523d5f602084013e6117c7565b606091505b505060208581015160408051328152928301919091529194507fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa179101611774565b6020808501516040805173ffffffffffffffffffffffffffffffffffffffff8b168152928301919091527fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa17910160405180910390a150505050505050565b3330146118a1576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f811180156118c5575073ffffffffffffffffffffffffffffffffffffffff821615155b15610a8b57610a8b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383612024565b61193660405180606001604052805f81526020015f81526020015f67ffffffffffffffff1681525090565b604080516060810182525f808252602082018190529181018290529083156119c9576040805160608101825260015473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910467ffffffffffffffff166020830181905260025460070b938301939093529093506119c291611b74565b9050611a36565b6040805160608101825260035473ffffffffffffffffffffffffffffffffffffffff81168083527401000000000000000000000000000000000000000090910467ffffffffffffffff166020830181905260045460070b93830193909352909350611a3391611b74565b90505b61095f8582846120b1565b6060611a5082604481866128cd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b5f8173ffffffffffffffffffffffffffffffffffffffff8111611aae5792915050565b505f92915050565b80515f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec8101611af457611aea836128f4565b60601c9392505050565b60208103611aae575f611b0684612943565b9050611b1181611a8b565b949350505050565b606060405180606001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200185815250604051602001611b5c9190612985565b60405160208183030381529060405290509392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015267ffffffffffffffff8316818301528151808203830181526060918201928390525f9283929161080191611bc891906129c9565b5f60405180830381855afa9150503d805f8114611c00576040519150601f19603f3d011682016040523d82523d5f602084013e611c05565b606091505b50909250905081611c6a576040517fa91ed72100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015267ffffffffffffffff85166024820152604401610956565b80806020019051810190611c7e91906129e4565b5195945050505050565b5f611c97602c600c84866128cd565b6107bf91612a36565b5f611c97604c602c84866128cd565b6060611a5082604c81866128cd565b6040517f03be20500000000000000000000000000000000000000000000000000000000081526060905f9030906303be205090611cff9087906004016123fb565b5f60405180830381865afa158015611d19573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d409190810190612a72565b90505f81806020019051810190611d579190612aa4565b805160208201516040517febaeefd600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152909150309063ebaeefd6906044015f604051808303815f87803b158015611dcb575f80fd5b505af1925050508015611ddc575060015b611e365780516020808301516040805173ffffffffffffffffffffffffffffffffffffffff9094168452918301527feb907f6e0de6862ca2ced78e890a55c5e8352dc4051697356bc835abf7cedcac910160405180910390a15b80515f9073ffffffffffffffffffffffffffffffffffffffff1615611e5c578151611e5e565b845b6040517f8483bc0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091503090638483bc009034906024015f604051808303818588803b158015611ec7575f80fd5b505af193505050508015611ed9575060015b612017575f8573ffffffffffffffffffffffffffffffffffffffff16346040515f6040518083038185875af1925050503d805f8114611f33576040519150601f19603f3d011682016040523d82523d5f602084013e611f38565b606091505b505090508015611f95576040805173ffffffffffffffffffffffffffffffffffffffff881681523460208201527fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa17910160405180910390a1612015565b604051329034905f81818185875af1925050503d805f8114611fd2576040519150601f19603f3d011682016040523d82523d5f602084013e611fd7565b606091505b5050604080513281523460208201529192507fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa17910160405180910390a15b505b5060400151949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526113bf90849061218c565b6120dc60405180606001604052805f81526020015f81526020015f67ffffffffffffffff1681525090565b5f805f806120f28767ffffffffffffffff612231565b90505f866040015160070b131561211e5761211288828860400151612259565b91955093509150612160565b612158888288604001517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6121539190612b56565b6122d2565b919550935091505b5060408051606081018252938452602084019290925267ffffffffffffffff1690820152949350505050565b5f8060205f8451602086015f885af1806121ab576040513d5f823e3d81fd5b50505f513d915081156121c25780600114156121dc565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561222b576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610956565b50505050565b5f8167ffffffffffffffff168367ffffffffffffffff161161225357826107bf565b50919050565b5f80808061226885600a612c9a565b90505f61227f8267ffffffffffffffff8916612caf565b905061228b8289612cf3565b93506122978489612d06565b97506122a3888261231c565b94506122af8589612d06565b6122b99085612d19565b93506122c58286612d2c565b9250505093509350939050565b5f8080806122e185600a612c9a565b90505f6122f88267ffffffffffffffff8916612d2c565b9050612304888261231c565b94506123108589612d06565b93506122c58286612caf565b5f81831161225357826107bf565b5f8083601f84011261233a575f80fd5b50813567ffffffffffffffff811115612351575f80fd5b602083019150836020828501011115612368575f80fd5b9250929050565b5f8060208385031215612380575f80fd5b823567ffffffffffffffff811115612396575f80fd5b6123a28582860161232a565b90969095509350505050565b5f5b838110156123c85781810151838201526020016123b0565b50505f910152565b5f81518084526123e78160208601602086016123ae565b601f01601f19169290920160200192915050565b602081525f6107bf60208301846123d0565b5f6020828403121561241d575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561247457612474612424565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156124a3576124a3612424565b604052919050565b5f67ffffffffffffffff8211156124c4576124c4612424565b50601f01601f191660200190565b5f805f606084860312156124e4575f80fd5b833567ffffffffffffffff8111156124fa575f80fd5b8401601f8101861361250a575f80fd5b803561251d612518826124ab565b61247a565b818152876020838501011115612531575f80fd5b816020840160208301375f6020838301015280955050505060208401359150604084013590509250925092565b73ffffffffffffffffffffffffffffffffffffffff81168114610a8d575f80fd5b67ffffffffffffffff81168114610a8d575f80fd5b5f80604083850312156125a5575f80fd5b82356125b08161255e565b915060208301356125c08161257f565b809150509250929050565b5f602082840312156125db575f80fd5b81356125e68161255e565b9392505050565b838152826020820152606060408201525f61095f60608301846123d0565b5f805f805f805f60a0888a031215612621575f80fd5b873561262c8161255e565b965060208801359550604088013567ffffffffffffffff8082111561264f575f80fd5b61265b8b838c0161232a565b909750955060608a013591506126708261255e565b90935060808901359080821115612685575f80fd5b506126928a828b0161232a565b989b979a50959850939692959293505050565b5f80604083850312156126b6575f80fd5b82356126c18161255e565b946020939093013593505050565b5f805f606084860312156126e1575f80fd5b83356126ec8161255e565b92506020840135915060408401356127038161255e565b809150509250925092565b5f806040838503121561271f575f80fd5b82359150602083013580151581146125c0575f80fd5b5f83516127468184602088016123ae565b83519083019061275a8183602088016123ae565b01949350505050565b604081525f61277560408301856123d0565b90508260208301529392505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f82601f8301126127c1575f80fd5b81516127cf612518826124ab565b8181528460208386010111156127e3575f80fd5b611b118260208301602087016123ae565b5f805f60608486031215612806575f80fd5b8351925060208401519150604084015167ffffffffffffffff81111561282a575f80fd5b612836868287016127b2565b9150509250925092565b606081525f61285260608301866123d0565b60208301949094525060400152919050565b5f60208284031215612874575f80fd5b81516125e68161255e565b73ffffffffffffffffffffffffffffffffffffffff8516815267ffffffffffffffff84166020820152826040820152608060608201525f6128c360808301846123d0565b9695505050505050565b5f80858511156128db575f80fd5b838611156128e7575f80fd5b5050820193919092039150565b5f815160208301517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008082169350601483101561293b5780818460140360031b1b83161693505b505050919050565b80516020808301519190811015612253577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152611b1160808401826123d0565b5f82516129da8184602087016123ae565b9190910192915050565b5f606082840312156129f4575f80fd5b6129fc612451565b8251612a078161257f565b81526020830151612a178161257f565b60208201526040830151612a2a8161257f565b60408201529392505050565b803560208310156107c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b5f60208284031215612a82575f80fd5b815167ffffffffffffffff811115612a98575f80fd5b611b11848285016127b2565b5f60208284031215612ab4575f80fd5b815167ffffffffffffffff80821115612acb575f80fd5b9083019060608286031215612ade575f80fd5b612ae6612451565b8251612af18161255e565b815260208381015190820152604083015182811115612b0e575f80fd5b612b1a878286016127b2565b60408301525095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8260070b8260070b028060070b9150808214612b7557612b75612b29565b5092915050565b600181815b80851115612bd557817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612bbb57612bbb612b29565b80851615612bc857918102915b93841c9390800290612b81565b509250929050565b5f82612beb575060016107c2565b81612bf757505f6107c2565b8160018114612c0d5760028114612c1757612c33565b60019150506107c2565b60ff841115612c2857612c28612b29565b50506001821b6107c2565b5060208310610133831016604e8410600b8410161715612c56575081810a6107c2565b612c608383612b7c565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c9257612c92612b29565b029392505050565b5f6107bf67ffffffffffffffff841683612bdd565b80820281158282048414176107c2576107c2612b29565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612d0157612d01612cc6565b500690565b818103818111156107c2576107c2612b29565b808201808211156107c2576107c2612b29565b5f82612d3a57612d3a612cc6565b50049056fea2646970667358221220a769ac7bb53580e18dcf9f1ed968ffebc1f5ebc309ab8b6b7ff21d29138c1a6164736f6c63430008160033","sourceMap":"769:11973:0:-:0;;;1645:1673;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1798:9;1809:4;-1:-1:-1;;;;;2395:23:1;;2391:195;;2441:134;;-1:-1:-1;;;2441:134:1;;-1:-1:-1;;;;;986:32:84;;2441:134:1;;;968:51:84;941:18;;2441:134:1;;;;;;;2391:195;-1:-1:-1;;;;;2595:20:1;;;;;2687:16;;;;;;2728:11;;;-1:-1:-1;;;2728:11:1;;;;:9;;:11;;;;;;;;;;;;;;;2687:16;2728:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2713:27:1;;;-1:-1:-1;;2751:18:1;:41;;;;;:62;;-1:-1:-1;;;;;;2751:62:1;;;1953:4;2751:62;;;;1806:3;2823:41;;;;:62;;;;;2092:3;2823:62;;;2751:41;2244:178:0;;::::1;::::0;::::1;::::0;;;;2290:38:::1;-1:-1:-1::0;;;;;2290:36:0;::::1;;:38::i;:::-;-1:-1:-1::0;;;;;2244:178:0;;::::1;::::0;;-1:-1:-1;;;;;2244:178:0;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;2233:189;;:8:::1;:189:::0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;2233:189:0;;;;-1:-1:-1;;;2233:189:0;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;;;;-1:-1:-1;;;;;;2233:189:0;;::::1;::::0;;;;;;::::1;::::0;;2950:361;;::::1;::::0;::::1;::::0;;2996:42:::1;2950:361:::0;;3084:13:::1;-1:-1:-1::0;3065:33:0;;;;;;;;;;;;::::1;2950:361:::0;;::::1;::::0;;;3294:6:::1;2950:361:::0;;;;;;2938:373;;:9:::1;:373:::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;;::::0;;-1:-1:-1;769:11973:0;;-1:-1:-1;769:11973:0;1873:177:7;1951:7;1993:48;2029:12;-1:-1:-1;;;1993:48:7;:::i;:::-;1970:73;1873:177;-1:-1:-1;;1873:177:7:o;14::84:-;93:13;;-1:-1:-1;;;;;135:31:84;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:621::-;290:6;298;306;314;367:3;355:9;346:7;342:23;338:33;335:53;;;384:1;381;374:12;335:53;407:40;437:9;407:40;:::i;:::-;397:50;;466:49;511:2;500:9;496:18;466:49;:::i;:::-;558:2;543:18;;537:25;456:59;;-1:-1:-1;;;;;;591:30:84;;581:41;;571:69;;636:1;633;626:12;571:69;659:5;649:15;;;709:2;698:9;694:18;688:25;758:7;755:1;744:22;735:7;732:35;722:63;;781:1;778;771:12;722:63;196:621;;;;-1:-1:-1;196:621:84;;-1:-1:-1;;196:621:84:o;1030:208::-;1100:6;1153:2;1141:9;1132:7;1128:23;1124:32;1121:52;;;1169:1;1166;1159:12;1121:52;1192:40;1222:9;1192:40;:::i;:::-;1182:50;1030:208;-1:-1:-1;;;1030:208:84:o;1243:222::-;1308:9;;;1329:10;;;1326:133;;;1381:10;1376:3;1372:20;1369:1;1362:31;1416:4;1413:1;1406:15;1444:4;1441:1;1434:15;1243:222;769:11973:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106101a7575f3560e01c80638483bc00116100e7578063d0a1026011610087578063ebaeefd611610062578063ebaeefd6146106be578063f6e6b240146106dd578063f9716faf14610735578063fc0c546a14610780575f80fd5b8063d0a102601461066d578063d9acf0ec14610680578063da001a291461069f575f80fd5b8063aae12e46116100c2578063aae12e46146105a6578063ba8726791461062f578063bc963bc714610644578063d00b1ad514610659575f80fd5b80638483bc00146105305780639180b744146105455780639b5215f614610573575f80fd5b80634bd162df116101525780635e280f111161012d5780635e280f1114610421578063765008a1146104545780637ecd9ac3146104ea57806381e8dcb414610511575f80fd5b80634bd162df1461037a5780635241b496146103c85780635b9a23731461040c575f80fd5b806320d9af9a1161018257806320d9af9a1461024157806322dbe29c146102645780632d0e315c146102ac575f80fd5b806303be2050146101b25780630d1995e0146101e75780631f8164d91461022d575f80fd5b366101ae57005b5f80fd5b3480156101bd575f80fd5b506101d16101cc36600461236f565b6107b3565b6040516101de91906123fb565b60405180910390f35b3480156101f2575f80fd5b506101d16040518060400160405280600381526020017d06000000000000000000000000000000000000000000000000000000000081525081565b348015610238575f80fd5b506101d16107c8565b34801561024c575f80fd5b506102566103e681565b6040519081526020016101de565b34801561026f575f80fd5b506101d16040518060400160405280600181526020017f010000000000000000000000000000000000000000000000000000000000000081525081565b3480156102b7575f80fd5b50610335604080516060810182525f8082526020820181905291810191909152506040805160608101825260015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16602082015260025460070b9181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015167ffffffffffffffff16908201529181015160070b908201526060016101de565b348015610385575f80fd5b506103af61039436600461240d565b5f6020819052908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101de565b3480156103d3575f80fd5b506103e76103e23660046124d2565b61084c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101de565b348015610417575f80fd5b506102566103e781565b34801561042c575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b34801561045f575f80fd5b506001546002546104ac9173ffffffffffffffffffffffffffffffffffffffff8116917401000000000000000000000000000000000000000090910467ffffffffffffffff169060070b83565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015260070b908201526060016101de565b3480156104f5575f80fd5b506103e773333333333333333333333333333333333333333381565b34801561051c575f80fd5b506103af61052b366004612594565b610968565b61054361053e3660046125cb565b610973565b005b348015610550575f80fd5b5061056461055f36600461236f565b610a90565b6040516101de939291906125ed565b34801561057e575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b1575f80fd5b50610335604080516060810182525f8082526020820181905291810191909152506040805160608101825260035473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900467ffffffffffffffff16602082015260045460070b9181019190915290565b34801561063a575f80fd5b506103e761080181565b34801561064f575f80fd5b506103af61045181565b348015610664575f80fd5b506103af609681565b61054361067b36600461260b565b610ac8565b34801561068b575f80fd5b5061054361069a3660046126a5565b611142565b3480156106aa575f80fd5b506105436106b93660046126cf565b6113c4565b3480156106c9575f80fd5b506105436106d83660046126a5565b611866565b3480156106e8575f80fd5b506003546004546104ac9173ffffffffffffffffffffffffffffffffffffffff8116917401000000000000000000000000000000000000000090910467ffffffffffffffff169060070b83565b348015610740575f80fd5b5061075461074f36600461270e565b61190b565b6040805182518152602080840151908201529181015167ffffffffffffffff16908201526060016101de565b34801561078b575f80fd5b506103e77f000000000000000000000000000000000000000000000000000000000000000081565b60606107bf8383611a41565b90505b92915050565b604080518082018252600181527f010000000000000000000000000000000000000000000000000000000000000060208083019190915282518084018452600381527d06000000000000000000000000000000000000000000000000000000000081830152925161083a939101612735565b60405160208183030381529060405281565b5f8061085784611a8b565b90505f61086386611ab6565b905073ffffffffffffffffffffffffffffffffffffffff811661095f5785516040515f917f09b3473100000000000000000000000000000000000000000000000000000000916108b7918a91602401612763565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610923818487611b19565b6040517f4f95203300000000000000000000000000000000000000000000000000000000815260040161095691906123fb565b60405180910390fd5b95945050505050565b5f6107bf8383611b74565b3330146109ae576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f341180156109d2575073ffffffffffffffffffffffffffffffffffffffff811615155b15610a8d575f8173ffffffffffffffffffffffffffffffffffffffff16346040515f6040518083038185875af1925050503d805f8114610a2d576040519150601f19603f3d011682016040523d82523d5f602084013e610a32565b606091505b5050905080610a8b576040517fc8ee485e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152346024820152604401610956565b505b50565b5f8060605f610a9f8686611c88565b90505f610aac8787611ca0565b90505f610ab98888611caf565b92989197509195509350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610b75576040517fefa9309d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152336024820152604401610956565b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610c3a576040517f86fee0c000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015288166024820152604401610956565b5f805f60603073ffffffffffffffffffffffffffffffffffffffff16639180b7448a8a6040518363ffffffff1660e01b8152600401610c7a929190612784565b5f60405180830381865afa925050508015610cb657506040513d5f823e601f3d908101601f19168201604052610cb391908101906127f4565b60015b610d1c573d808015610ce3576040519150601f19603f3d011682016040523d82523d5f602084013e610ce8565b606091505b50806040517ed4895a00000000000000000000000000000000000000000000000000000000815260040161095691906123fb565b919450925090506040517f5241b4960000000000000000000000000000000000000000000000000000000081523090635241b49690610d6390849086908890600401612840565b602060405180830381865afa925050508015610d9c575060408051601f3d908101601f19168201909252610d9991810190612864565b60015b610e1e573d808015610dc9576040519150601f19603f3d011682016040523d82523d5f602084013e610dce565b606091505b505f610dda828a611cbe565b90507f612baef0082f9abcf6dc7b491d75346418381b75756830d7029939026d1b46b981604051610e0b91906123fb565b60405180910390a1505050505050611139565b93503415610fa0576040517fda001a2900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015234602483015288166044820152309063da001a29906064015f604051808303815f87803b158015610e98575f80fd5b505af1925050508015610ea9575060015b610fa0573d808015610ed6576040519150601f19603f3d011682016040523d82523d5f602084013e610edb565b606091505b506040517f8483bc0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201523090638483bc009034906024015f604051808303818588803b158015610f42575f80fd5b505af1158015610f54573d5f803e3d5ffd5b50505050505f610f64828a611cbe565b90507f612baef0082f9abcf6dc7b491d75346418381b75756830d7029939026d1b46b981604051610f9591906123fb565b60405180910390a150505b6040517fd9acf0ec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101849052309063d9acf0ec906044015f604051808303815f87803b15801561100b575f80fd5b505af192505050801561101c575060015b611134573d808015611049576040519150601f19603f3d011682016040523d82523d5f602084013e61104e565b606091505b506040517febaeefd600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260248101859052309063ebaeefd6906044015f604051808303815f87803b1580156110ba575f80fd5b505af11580156110cc573d5f803e3d5ffd5b50506001546040517f775ce5b47736b2186798494ee89239e4c0341b516c05bf613205d83ffbfffdc6935061112a9250889174010000000000000000000000000000000000000000900467ffffffffffffffff16908890869061287f565b60405180910390a1505b505050505b50505050505050565b33301461117d576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f61118982600161190b565b80519091501561136d5760015481516111dd9173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690612024565b600154604082810151815173ffffffffffffffffffffffffffffffffffffffff871660208201527401000000000000000000000000000000000000000090930467ffffffffffffffff908116928401929092521660608201525f9060800160408051601f198184030181528282018252600183527f010000000000000000000000000000000000000000000000000000000000000060208481019190915282518084018452600381527d0600000000000000000000000000000000000000000000000000000000008183015292519194505f936112be939092909101612735565b60408051601f19818403018152908290526112dd918490602001612735565b60408051601f19818403018152908290527f17938e130000000000000000000000000000000000000000000000000000000082529150733333333333333333333333333333333333333333906317938e139061133d9084906004016123fb565b5f604051808303815f87803b158015611354575f80fd5b505af1158015611366573d5f803e3d5ffd5b5050505050505b6020810151156113bf5760208101516113bf9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908590612024565b505050565b3330146113ff576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f61140a835f61190b565b60035481516040519293505f9273ffffffffffffffffffffffffffffffffffffffff909216918381818185875af1925050503d805f8114611466576040519150601f19603f3d011682016040523d82523d5f602084013e61146b565b606091505b50509050806114a9576040517fb7e54a0700000000000000000000000000000000000000000000000000000000815260048101859052602401610956565b600354604083810151815173ffffffffffffffffffffffffffffffffffffffff891660208201527401000000000000000000000000000000000000000090930467ffffffffffffffff908116928401929092521660608201525f9060800160408051601f198184030181528282018252600183527f010000000000000000000000000000000000000000000000000000000000000060208481019190915282518084018452600381527d0600000000000000000000000000000000000000000000000000000000008183015292519194505f9361158a939092909101612735565b60408051601f19818403018152908290526115a9918490602001612735565b60408051601f19818403018152908290527f17938e130000000000000000000000000000000000000000000000000000000082529150733333333333333333333333333333333333333333906317938e13906116099084906004016123fb565b5f604051808303815f87803b158015611620575f80fd5b505af1158015611632573d5f803e3d5ffd5b505050506020840151156111395760208401516040517f8483bc0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891660048201523091638483bc00916024015f604051808303818588803b1580156116a9575f80fd5b505af1935050505080156116bb575060015b61180857602084015160405173ffffffffffffffffffffffffffffffffffffffff871691905f81818185875af1925050503d805f8114611716576040519150601f19603f3d011682016040523d82523d5f602084013e61171b565b606091505b50909350508215611781576020808501516040805173ffffffffffffffffffffffffffffffffffffffff89168152928301919091527fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa1791015b60405180910390a1611139565b60208401516040513291905f81818185875af1925050503d805f81146117c2576040519150601f19603f3d011682016040523d82523d5f602084013e6117c7565b606091505b505060208581015160408051328152928301919091529194507fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa179101611774565b6020808501516040805173ffffffffffffffffffffffffffffffffffffffff8b168152928301919091527fbb643711c959f203f346d453edf6f91a40b637a95c46c992089c63726b8eaa17910160405180910390a150505050505050565b3330146118a1576040517f5950c85e000000000000000000000000000000000000000000000000000000008152336004820152602401610956565b5f811180156118c5575073ffffffffffffffffffffffffffffffffffffffff821615155b15610a8b57610a8b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168383612024565b61193660405180606001604052805f81526020015f81526020015f67ffffffffffffffff1681525090565b604080516060810182525f808252602082018190529181018290529083156119c9576040805160608101825260015473ffffffffffffffffffffffffffffffffffffffff8116808352740100