60806040523480156200001157600080fd5b506200001d3262000023565b62000322565b6200002e81620000af565b6200003b816001620000eb565b6040805180820190915260078152664675726e61636560c81b602082015260009062000068908262000256565b506040805180820190915260078152664655524e41434560c81b602082015260019062000096908262000256565b50506003805466ffffffffff0000191662230000179055565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6200017782620001368362000126836001600160a01b0316600090815268a20d6e21d0e525531060205260409020546001600160581b031690565b6001600160581b0316906200017b565b6001600160a01b0391909116600090815268a20d6e21d0e52553106020526040902080546001600160581b0319166001600160581b03909216919091179055565b5050565b6000811515620001908460571c600116151590565b151514620001aa576a800000000000000000000092909218915b5090919050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001dc57607f821691505b602082108103620001fd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025157600081815260208120601f850160051c810160208610156200022c5750805b601f850160051c820191505b818110156200024d5782815560010162000238565b5050505b505050565b81516001600160401b03811115620002725762000272620001b1565b6200028a81620002838454620001c7565b8462000203565b602080601f831160018114620002c25760008415620002a95750858301515b600019600386901b1c1916600185901b1785556200024d565b600085815260208120601f198616915b82811015620002f357888601518255948401946001909101908401620002d2565b5085821015620003125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6129b280620003326000396000f3fe6080604052600436106102605760003560e01c806355f804b3116101445780638da5cb5b116100b6578063c87b56dd1161007a578063c87b56dd14610a77578063dd62ed3e14610a97578063ee31e15214610ae5578063f04e283e14610b04578063f2fde38b14610b17578063fee81cf414610b2a57610267565b80638da5cb5b14610a29578063931688cb1461091d57806395d89b4114610a42578063a9059cbb14610a57578063a98b1581146108f557610267565b806370a082311161010857806370a08231146109ac578063715018a6146109cc57806375b238fc146109d457806383020bef146109e957806387db703414610a095780638812a9a5146109e957610267565b806355f804b31461091d5780635a4462151461093d5780635d148e5c1461095d5780636338cb8a1461097757806368b9f8a51461098c57610267565b80632a6a935d116101dd5780634a4ee7b1116101a15780634a4ee7b1146108385780634ef41efc1461084b578063514e62fc146108855780635327bba3146108bc57806353d6fd59146108f557806354d1f13d1461091557610267565b80632a6a935d1461079c5780632de94807146107bc578063313ce567146107ef5780633af32abf146108035780633ccfd60b1461082357610267565b80631c10893f116102245780631c10893f1461070a5780631cd64df41461071d57806323b872dd146107545780632569296214610774578063274e430b1461077c57610267565b806304dfe79d1461063757806306fdde031461066e578063095ea7b31461069057806318160ddd146106c0578063183a4f6e146106f757610267565b3661026757005b68a20d6e21d0e525530860003560e01c63e985e9c581900361030d5760018201546001600160a01b031633146102b05760405163ce5a776b60e01b815260040160405180910390fd5b60443610156102be57600080fd5b6004356001600160a01b0381811660009081526003850160209081526040808320602435948516845290915290205461030a9060ff166102ff576000610302565b60015b60ff16610b5d565b50505b80636352211e036103725760018201546001600160a01b031633146103455760405163ce5a776b60e01b815260040160405180910390fd5b602436101561035357600080fd5b60043561037061036282610b67565b6001600160a01b0316610b5d565b505b8063e5eb36c8036103df5760018201546001600160a01b031633146103aa5760405163ce5a776b60e01b815260040160405180910390fd5b60843610156103b857600080fd5b6004356024356044356064356103d084848484610b9e565b6103da6001610b5d565b505050505b8063813500fc036104795760018201546001600160a01b031633146104175760405163ce5a776b60e01b815260040160405180910390fd5b606436101561042557600080fd5b6001600160a01b03604435818116600090815268a20d6e21d0e525530b6020908152604080832060043595861684529091529020805460ff19166024351515908117909155906104756001610b5d565b5050505b8063d10b6e0c036104da5760018201546001600160a01b031633146104b15760405163ce5a776b60e01b815260040160405180910390fd5b60643610156104bf57600080fd5b6004356024356044356104d6610362848484610be5565b5050505b8063081812fc036105315760018201546001600160a01b031633146105125760405163ce5a776b60e01b815260040160405180910390fd5b602436101561052057600080fd5b60043561052f61036282610cdd565b505b8063f5b100ea036105b95760018201546001600160a01b031633146105695760405163ce5a776b60e01b815260040160405180910390fd5b602436101561057757600080fd5b6004356105b76105b2826001600160a01b0316600090815268a20d6e21d0e5255310602052604090205463ffffffff600160801b9091041690565b610b5d565b505b8063e2c79281036106205760018201546001600160a01b031633146105f15760405163ce5a776b60e01b815260040160405180910390fd5b60043610156105ff57600080fd5b68a20d6e21d0e52553085461062090600160401b900463ffffffff16610b5d565b8063b7a94eb803610635576106356001610b5d565b005b34801561064357600080fd5b506003546106579062010000900460ff1681565b60405160ff90911681526020015b60405180910390f35b34801561067a57600080fd5b50610683610d29565b60405161066591906124e6565b34801561069c57600080fd5b506106b06106ab36600461254b565b610dbb565b6040519015158152602001610665565b3480156106cc57600080fd5b5068a20d6e21d0e525530854600160601b90046001600160601b03165b604051908152602001610665565b610635610705366004612575565b610e31565b61063561071836600461254b565b610e3e565b34801561072957600080fd5b506106b061073836600461254b565b638b78c6d8600c90815260009290925260209091205481161490565b34801561076057600080fd5b506106b061076f36600461258e565b610e54565b610635610ef7565b34801561078857600080fd5b506106b06107973660046125ca565b610f47565b3480156107a857600080fd5b506106356107b73660046125f5565b610f96565b3480156107c857600080fd5b506106e96107d73660046125ca565b638b78c6d8600c908152600091909152602090205490565b3480156107fb57600080fd5b506012610657565b34801561080f57600080fd5b506106b061081e3660046125ca565b610fa0565b34801561082f57600080fd5b50610635610fb9565b61063561084636600461254b565b610fcd565b34801561085757600080fd5b5068a20d6e21d0e5255309546001600160a01b03165b6040516001600160a01b039091168152602001610665565b34801561089157600080fd5b506106b06108a036600461254b565b638b78c6d8600c90815260009290925260209091205416151590565b3480156108c857600080fd5b506003546108e0906301000000900463ffffffff1681565b60405163ffffffff9091168152602001610665565b34801561090157600080fd5b50610635610910366004612610565b610fdf565b610635610ff9565b34801561092957600080fd5b50610635610938366004612685565b611035565b34801561094957600080fd5b506106356109583660046126c7565b61104d565b34801561096957600080fd5b506003546106b09060ff1681565b34801561098357600080fd5b5061063561107b565b34801561099857600080fd5b506106356109a73660046125ca565b611098565b3480156109b857600080fd5b506106e96109c73660046125ca565b6110d2565b610635611105565b3480156109e057600080fd5b506106e9600181565b3480156109f557600080fd5b50610635610a04366004612733565b611119565b348015610a1557600080fd5b50610635610a24366004612759565b61114b565b348015610a3557600080fd5b50638b78c6d8195461086d565b348015610a4e57600080fd5b50610683611175565b348015610a6357600080fd5b506106b0610a7236600461254b565b611184565b348015610a8357600080fd5b50610683610a92366004612575565b61119a565b348015610aa357600080fd5b506106e9610ab236600461277c565b6001600160a01b03918216600090815268a20d6e21d0e525530d6020908152604080832093909416825291909152205490565b348015610af157600080fd5b506003546106b090610100900460ff1681565b610635610b123660046125ca565b611294565b610635610b253660046125ca565b6112d1565b348015610b3657600080fd5b506106e9610b453660046125ca565b63389a75e1600c908152600091909152602090205490565b8060005260206000f35b6000610b72826112f8565b610b8f5760405163677510db60e11b815260040160405180910390fd5b610b9882611315565b92915050565b610baa8484848461136a565b610bb484846116d6565b826001600160a01b0316846001600160a01b031614610bdf57610bdf84670de0b6b3a7640000611769565b50505050565b600068a20d6e21d0e52553088168a20d6e21d0e525530a81610c3368a20d6e21d0e525530f600189901b5b600381901c600090815260209290925260409091205460059190911b60e0161c90565b63ffffffff1681526020810191909152604001600020546001600160a01b03908116915084168114610ca7576001600160a01b03808216600090815260038401602090815260408083209388168352929052205460ff16610ca7576040516367d9dca160e11b815260040160405180910390fd5b60008581526004909201602052604090912080546001600160a01b0387166001600160a01b031990911617905590509392505050565b6000610ce8826112f8565b610d055760405163677510db60e11b815260040160405180910390fd5b50600090815268a20d6e21d0e525530c60205260409020546001600160a01b031690565b606060008054610d38906127a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d64906127a6565b8015610db15780601f10610d8657610100808354040283529160200191610db1565b820191906000526020600020905b815481529060010190602001808311610d9457829003601f168201915b5050505050905090565b60008068a20d6e21d0e525530833600081815260058301602090815260408083206001600160a01b038a16808552908352928190208890555187815293945090927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610e3b33826117e4565b50565b610e466117f0565b610e50828261180b565b5050565b6001600160a01b038316600090815268a20d6e21d0e525530d6020908152604080832033845290915281205468a20d6e21d0e5255308906000198114610ee05780841115610eb5576040516313be252b60e01b815260040160405180910390fd5b6001600160a01b03861660009081526005830160209081526040808320338452909152902084820390555b610eeb868686611817565b50600195945050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6001600160a01b038116600090815268a20d6e21d0e5255310602052604081208054600160581b90046001168203610f8357823b5b9392505050565b54600160581b9004600216151592915050565b610e3b338261184f565b6000610b98610fae836118df565b60571c600116151590565b6001610fc48161190b565b610e3b3361193e565b610fd56117f0565b610e5082826117e4565b6001610fea8161190b565b610ff4838361195a565b505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b60016110408161190b565b6002610bdf838583612836565b60016110588161190b565b6000611065858783612836565b506001611073838583612836565b505050505050565b60016110868161190b565b506003805461ff001916610100179055565b60016110a38161190b565b60006110b9670de0b6b3a764000061271061290c565b9050336110c782828661197f565b610bdf81600161195a565b6001600160a01b0316600090815268a20d6e21d0e52553106020526040902054600160a01b90046001600160601b031690565b61110d6117f0565b6111176000611b0f565b565b60016111248161190b565b506003805463ffffffff90921663010000000266ffffffff00000019909216919091179055565b60016111568161190b565b506003805460ff909216620100000262ff000019909216919091179055565b606060018054610d38906127a6565b6000611191338484611817565b50600192915050565b60606111a5826112f8565b6111c25760405163677510db60e11b815260040160405180910390fd5b600280546111cf906127a6565b15905061128f57610b98600280546111e6906127a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611212906127a6565b801561125f5780601f106112345761010080835404028352916020019161125f565b820191906000526020600020905b81548152906001019060200180831161124257829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b81525061128a85611b4d565b611b91565b919050565b61129c6117f0565b63389a75e1600c52806000526020600c2080544211156112c457636f5e88186000526004601cfd5b60009055610e3b81611b0f565b6112d96117f0565b8060601b6112ef57637448fbae6000526004601cfd5b610e3b81611b0f565b60008061130483611315565b6001600160a01b0316141592915050565b600068a20d6e21d0e525530868a20d6e21d0e525530a8261134368a20d6e21d0e525530f600187901b610c10565b63ffffffff1681526020810191909152604001600020546001600160a01b03169392505050565b68a20d6e21d0e52553086001600160a01b03841661139b57604051633a954ecd60e21b815260040160405180910390fd5b60008160020160006113b484600701610c108860011b90565b63ffffffff1681526020810191909152604001600020546001600160a01b039081169150861681146113f85760405162a1148160e81b815260040160405180910390fd5b856001600160a01b0316836001600160a01b03161461147c576001600160a01b03808716600090815260038401602090815260408083209387168352929052205460ff1661147c5760008481526004830160205260409020546001600160a01b0384811691161461147c57604051632ce44b5f60e11b815260040160405180910390fd5b600061148787611cb4565b9050600061149487611cb4565b8254909150670de0b6b3a76400009083906014906114c3908490600160a01b90046001600160601b0316612923565b82546101009290920a6001600160601b0381810219909316918316021790915582546001600160a01b038116670de0b6b3a7640000600160a01b92839004841601909216021782555061152760078501600188901b611522848b611d20565b611dc3565b6000868152600485016020908152604080832080546001600160a01b03191690556001600160a01b038b168352600687018252808320855463ffffffff60801b198116600160801b9182900463ffffffff90811660001901908116909202178755631fffffff600382901c168552925282205460059190911b60e0161c6001600160a01b038a166000908152600687016020526040902063ffffffff9190911691506115eb906115df6007880160018b811b01610c10565b63ffffffff1683611dc3565b8154600163ffffffff600160801b80840482169283019091160263ffffffff60801b1990921691909117835561163d6007870161162b84600190811b0190565b61152260078a0160018d811b01610c10565b6001600160a01b0389166000908152600687016020526040902061166290828a611dc3565b6116756007870160018a811b0183611dc3565b5050866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef670de0b6b3a76400006040516116c491815260200190565b60405180910390a35050505050505050565b60035462010000900460ff1660008190036116f057505050565b80670de0b6b3a764000002611704836110d2565b1161170e57505050565b61171a610fae836118df565b1561172457505050565b638b78c6d819546001600160a01b0316836001600160a01b03160361174857505050565b638b78c6d8600c9081526000849052602090205460011615610ff457505050565b6003546301000000900463ffffffff16600081900361178757505050565b6000806117a684611797876118df565b6001600160581b031690611df7565b91509150600281106117d35780800283026301312d008082106117c7578091505b6117d082611e6e565b50505b6117dd8583611ea2565b5050505050565b610e5082826000611ee7565b638b78c6d819543314611117576382b429006000526004601cfd5b610e5082826001611ee7565b611822838383611f40565b61182c83836116d6565b816001600160a01b0316836001600160a01b031614610ff457610ff48382611769565b600061185a83611cb4565b8054909150600160581b900460021615158215151461189557805460ff600160581b80830482166002189091160260ff60581b199091161781555b826001600160a01b03167fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d6420393836040516118d2911515815260200190565b60405180910390a2505050565b6001600160a01b0316600090815268a20d6e21d0e525531060205260409020546001600160581b031690565b638b78c6d819543314610e3b57638b78c6d8600c5233600052806020600c205416610e3b576382b429006000526004601cfd5b60003860003847855af1610e3b5763b12d13eb6000526004601cfd5b610e508261197a8361196b866118df565b6001600160581b03169061240f565b611ea2565b68a20d6e21d0e52553088054640100000000900463ffffffff16156119b757604051633ab534b960e21b815260040160405180910390fd5b6001600160a01b0382166119de576040516339a84a7b60e01b815260040160405180910390fd5b6119e782612435565b805467ffffffff0000000019166401000000001781556001810180546001600160a01b0384166001600160a01b03199091161790558315610bdf576001600160a01b038316611a4957604051633a954ecd60e21b815260040160405180910390fd5b6b0de0b6b39983494c589bffff841115611a765760405163e5cfe95760e01b815260040160405180910390fd5b80546bffffffffffffffffffffffff60601b1916600160601b6001600160601b038616021781556000611aa884611cb4565b80546001600160a01b03908116600160a01b6001600160601b038916021782556040518781529192508516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36117dd84600161184f565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a900480611b68575050819003601f19909101908152919050565b60608351835183516020870196506020860195506020850194506020604051019350828701838311611c6357600183820301600060208510611bd257508388205b601f851660200360031b89515b8b51818118831c611c4a578315611c195783888e2014611c1957808a5260019c8d019c90990198848d10611c135750611c5e565b50611bdf565b60005b8b8101518b820152602001878110611c1c57509b87019b988601988715611c4a57848d10611c135750611c5e565b895260019b8c019b90980197838c10611bdf575b505050505b84935060206040510194508781038585030192505b80881015611c93578751845260209788019790930192611c78565b50506000818401908152602001604052601f19909201918252509392505050565b6001600160a01b038116600090815268a20d6e21d0e5255310602052604081208054909168a20d6e21d0e525530891600160581b90046001169003611d1a576001833b15611d00576002175b825460ff909116600160581b0260ff60581b199091161782555b50919050565b8154600160601b900463ffffffff1668a20d6e21d0e52553086000829003611dbc5780548190600090611d589063ffffffff16612943565b825463ffffffff8083166101009490940a848102910219909116179092558554600160601b820263ffffffff60601b199091161786556000908152600283016020526040902080546001600160a01b0386166001600160a01b031990911617905591505b5092915050565b826020528160031c60005260406000206007831660051b815463ffffffff8482841c188116831b8218845550505050505050565b600080605784901c60011615611e1257508290506000611e67565b637fffffff620151804204811690603886901c1666ffffffffffffff8616818314611e3e575081905060005b60389190911b66ffffffffffffff602887901c811692909201918216179350620de0b690049150505b9250929050565b80600117601052605b8104607882110260005b818114611e975760108080209052600101611e81565b5050601051610e3b57fe5b6001600160a01b0391909116600090815268a20d6e21d0e52553106020526040902080546affffffffffffffffffffff19166001600160581b03909216919091179055565b638b78c6d8600c52826000526020600c20805483811783611f09575080841681185b80835580600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a3505050505050565b6001600160a01b038216611f6757604051633a954ecd60e21b815260040160405180910390fd5b68a20d6e21d0e52553086000611f7c85611cb4565b90506000611f8985611cb4565b9050611fc46040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b825463ffffffff600160801b808304821660808501528454041660a08301526001600160601b03600160a01b909104166040820181905285111561201b57604051631e9acf1760e31b815260040160405180910390fd5b6040810180518690039081905283546001600160601b03808316600160a01b9081026001600160a01b03938416178755855481810483168a0160608701819052909216029116178355608082015161208191670de0b6b3a7640000900480821191030290565b81528154600160581b90046002166000036120f057856001600160a01b0316876001600160a01b0316036120bd57805160808201510360a08201525b6120ea670de0b6b3a76400008260600151816120db576120db612966565b048260a0015180821191030290565b60208201525b600061213a82602001518360000151016040805180820190915260608152600060208201526040805101828152806020018360051b81016040528183528083602001525050919050565b825190915015612234576001600160a01b0388166000908152600686016020526040902060808301518351875463ffffffff600160401b808304821684900382160263ffffffff60401b199092169190911789558754918303908116600160801b0263ffffffff60801b199092169190911787555b60001991909101600381901c600090815260208490526040812054919291600584901b60e0161c63ffffffff1690506121ee8960070182600080612467565b600081815260048a016020908152604090912080546001600160a01b0319169055858101805160089390931b60608f901b176001178352910190528082036121af575050505b602082015115612397576001600160a01b03871660009081526006860160209081526040822060a085015191850151909290820190612273878c611d20565b8954602088015163ffffffff60401b19821663ffffffff600160401b80850482169093018116909202178c55895463ffffffff60801b1916600160801b86831602178a55919250670de0b6b3a7640000600160601b82046001600160601b03160491640100000000909104165b6122f18b600701610c108360011b90565b63ffffffff1615612310576001018181111561230b575060015b6122e0565b61231b868683611dc3565b6123308b600701828588806001019950612467565b61235a878e8360008360200151818360081b8560601b171781526020810185602001525050505050565b60010181811115612369575060015b8385036122e0578a5463ffffffff9091166401000000000267ffffffff0000000019909116178a5550505050505b805151156123b85760018501546123b89082906001600160a01b03166124ad565b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516123fe91815260200190565b60405180910390a350505050505050565b60006001605784901c1615158215151461242e57600160571b92909218915b5090919050565b630f4599e560005233602052602060006024601c6000855af160016000511416610e3b5763d125259c6000526004601cfd5b8163ffffffff168160201b17846020528360021c60005260406000206003851660061b815467ffffffffffffffff8482841c188116831b82188455505050505050505050565b81516040810363263c69d68152602080820152815160051b604401915060208183601c84016000875af1600182511416610bdf57600081fd5b600060208083528351808285015260005b81811015612513578581018301518582016040015282016124f7565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461128f57600080fd5b6000806040838503121561255e57600080fd5b61256783612534565b946020939093013593505050565b60006020828403121561258757600080fd5b5035919050565b6000806000606084860312156125a357600080fd5b6125ac84612534565b92506125ba60208501612534565b9150604084013590509250925092565b6000602082840312156125dc57600080fd5b610f7c82612534565b8035801515811461128f57600080fd5b60006020828403121561260757600080fd5b610f7c826125e5565b6000806040838503121561262357600080fd5b61262c83612534565b915061263a602084016125e5565b90509250929050565b60008083601f84011261265557600080fd5b50813567ffffffffffffffff81111561266d57600080fd5b602083019150836020828501011115611e6757600080fd5b6000806020838503121561269857600080fd5b823567ffffffffffffffff8111156126af57600080fd5b6126bb85828601612643565b90969095509350505050565b600080600080604085870312156126dd57600080fd5b843567ffffffffffffffff808211156126f557600080fd5b61270188838901612643565b9096509450602087013591508082111561271a57600080fd5b5061272787828801612643565b95989497509550505050565b60006020828403121561274557600080fd5b813563ffffffff81168114610f7c57600080fd5b60006020828403121561276b57600080fd5b813560ff81168114610f7c57600080fd5b6000806040838503121561278f57600080fd5b61279883612534565b915061263a60208401612534565b600181811c908216806127ba57607f821691505b602082108103611d1a57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b601f821115610ff457600081815260208120601f850160051c810160208610156128175750805b601f850160051c820191505b8181101561107357828155600101612823565b67ffffffffffffffff83111561284e5761284e6127da565b6128628361285c83546127a6565b836127f0565b6000601f841160018114612896576000851561287e5750838201355b600019600387901b1c1916600186901b1783556117dd565b600083815260209020601f19861690835b828110156128c757868501358255602094850194600190920191016128a7565b50868210156128e45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b9857610b986128f6565b6001600160601b03828116828216039080821115611dbc57611dbc6128f6565b600063ffffffff80831681810361295c5761295c6128f6565b6001019392505050565b634e487b7160e01b600052601260045260246000fdfea2646970667358221220fa8c9c700e9ca4fb5e6fa20552b7baa7ee327f6bd473732ee02335a8f872645664736f6c63430008130033