608060405234801561001057600080fd5b50611dcf806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80638dd98fed11610130578063ba087652116100b8578063d905777e1161007c578063d905777e1461046a578063db8c1e481461047d578063dd62ed3e14610490578063ea32825a146104a3578063ef8b30f7146104b657600080fd5b8063ba08765214610436578063c5f956af14610449578063c63d75b61461045c578063c6e6f59214610267578063ce96cb771461045c57600080fd5b80639d1b464a116100ff5780639d1b464a14610404578063a9059cbb1461040c578063ad083d451461041f578063b3d7f6b91461029d578063b460af941461042857600080fd5b80638dd98fed146103d257806394bf804d146103db57806395d89b41146103e957806398b6ee32146103f157600080fd5b8063313ce567116101be57806359ea69f71161018257806359ea69f7146103875780636e553f651461039057806370a08231146103a357806380e5e055146103b65780638888c827146103c957600080fd5b8063313ce5671461031257806338d52e0f1461032c578063402d267d1461034c5780634cdad506146103615780634f548f961461037457600080fd5b80630a28a477116102055780630a28a4771461029d57806318160ddd146102b05780631e2720ff146102d757806323b872dd146102ec5780632cf436f2146102ff57600080fd5b806301e1d1141461023757806306fdde031461025257806307a2d13a14610267578063095ea7b31461027a575b600080fd5b61023f6104c9565b6040519081526020015b60405180910390f35b61025a610542565b6040516102499190611711565b61023f610275366004611744565b610605565b61028d610288366004611772565b610631565b6040519015158152602001610249565b61023f6102ab366004611744565b610649565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025461023f565b6102ea6102e5366004611744565b6106a6565b005b61028d6102fa36600461179e565b610743565b61023f61030d3660046117df565b610767565b61031a6107e4565b60405160ff9091168152602001610249565b610334610828565b6040516001600160a01b039091168152602001610249565b61023f61035a366004611811565b5060001990565b61023f61036f366004611744565b610856565b61023f61038236600461182e565b61087f565b61023f60035481565b61023f61039e36600461185a565b6108b8565b61023f6103b1366004611811565b6109ad565b6102ea6103c436600461192d565b6109d5565b61023f60015481565b61023f60045481565b61023f6102ab36600461185a565b61025a610b30565b61023f6103ff3660046119d1565b610b6f565b61023f610d33565b61028d61041a366004611772565b610d86565b61023f60025481565b61023f6102ab366004611a1b565b61023f610444366004611a1b565b610d94565b600054610334906001600160a01b031681565b61023f6102ab366004611811565b61023f610478366004611811565b610ecd565b61023f61048b366004611a5d565b610ed8565b61023f61049e366004611a84565b611034565b61023f6104b1366004611ab2565b61107e565b61023f6104c4366004611744565b6110ec565b60006104d3610828565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610519573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053d9190611aed565b905090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace038054606091600080516020611d7a8339815191529161058190611b06565b80601f01602080910402602001604051908101604052809291908181526020018280546105ad90611b06565b80156105fa5780601f106105cf576101008083540402835291602001916105fa565b820191906000526020600020905b8154815290600101906020018083116105dd57829003601f168201915b505050505091505090565b600061060f610d33565b61062183670de0b6b3a7640000611b56565b61062b9190611b6d565b92915050565b60003361063f8185856110fb565b5060019392505050565b604051631d04569d60e21b815260206004820152602360248201527f4572726f723a20546869732066756e6374696f6e206973206e6f7420616c6c6f6044820152621dd95960ea1b60648201526000906084015b60405180910390fd5b80600460008282546106b89190611b8f565b909155506106c69050610828565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b0391909116906323b872dd906064016020604051808303816000875af115801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f9190611ba2565b5050565b60003361075185828561110d565b61075c858585611173565b506001949350505050565b600080670de0b6b3a764000061077d8488611b56565b6107879190611b6d565b670de0b6b3a764000061079a8689611b56565b6107a49190611b6d565b6107ae9190611b8f565b6107b89087611bc4565b90506000856107cf83670de0b6b3a7640000611b56565b6107d99190611b6d565b979650505050505050565b6000807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e009050600081546108229190600160a01b900460ff16611bd7565b91505090565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b60008061087883610865610d33565b61086d6104c9565b60025460035461107e565b9392505050565b60006ec097ce7bc90715b34b9f10000000008261089c8587611b56565b6108a69190611b56565b6108b09190611b6d565b949350505050565b6000806108d1846108c7610d33565b6001546000610767565b90506108db610828565b6040516323b872dd60e01b8152336004820152306024820152604481018690526001600160a01b0391909116906323b872dd906064016020604051808303816000875af1158015610930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109549190611ba2565b5061095f83826111d2565b60408051858152602081018390526001600160a01b0385169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a3509192915050565b6001600160a01b03166000908152600080516020611d7a833981519152602052604090205490565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610a1b5750825b905060008267ffffffffffffffff166001148015610a385750303b155b905081158015610a46575080155b15610a645760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a8e57845460ff60401b1916600160401b1785555b610a978c611208565b610aa18b8b61121c565b610ab26001655af3107a40006111d2565b600188905560028790556003869055600080546001600160a01b0319166001600160a01b038b161790558315610b2257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020611d7a8339815191529161058190611b06565b60006001600160a01b0382163314610bab57610b8b8233611034565b851115610bab57604051637c0232c360e01b815260040161069d90611bf0565b6000610bb986610865610d33565b905084811015610c3d5760405163c659f68960e01b815260206004820152604260248201527f4572726f723a206d696e696d756d52656365697661626c65416d6f756e74206960448201527f73206c657373207468616e2065787065637465642061737365747320616d6f756064820152611b9d60f21b608482015260a40161069d565b6000610c5387610c4b610d33565b60035461087f565b9050610c5f848861122e565b610c67610828565b60405163a9059cbb60e01b81526001600160a01b03878116600483015260248201859052919091169063a9059cbb906044016020604051808303816000875af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc9190611ba2565b5060408051838152602081018990526001600160a01b03808716929088169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a4509495945050505050565b600080610d3e6104c9565b90506000610d6a7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b610d7c83670de0b6b3a7640000611b56565b6108789190611b6d565b60003361063f818585611173565b60006001600160a01b0382163314610dd057610db08233611034565b841115610dd057604051630740486f60e11b815260040161069d90611bf0565b6000610dde85610865610d33565b90506000610dee86610c4b610d33565b9050610dfa848761122e565b610e02610828565b60405163a9059cbb60e01b81526001600160a01b03878116600483015260248201859052919091169063a9059cbb906044016020604051808303816000875af1158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e779190611ba2565b5060408051838152602081018890526001600160a01b03808716929088169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45093949350505050565b600061062b826109ad565b600080610ee7856108c7610d33565b905082811015610f575760405163c659f68960e01b815260206004820152603460248201527f4572726f723a206d696e416d6f756e74206973206c657373207468616e2065786044820152731c1958dd1959081cda185c995cc8185b5bdd5b9d60621b606482015260840161069d565b610f5f610828565b6040516323b872dd60e01b81526001600160a01b0386811660048301523060248301526044820188905291909116906323b872dd906064016020604051808303816000875af1158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190611ba2565b50610fe584826111d2565b60408051868152602081018390526001600160a01b0386169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350929392505050565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b60008061108b8787611264565b905060006110998287611270565b905060006110a7828761127c565b905060006110b5828761129a565b905060006ec097ce7bc90715b34b9f10000000006110d38387611b56565b6110dd9190611b6d565b9b9a5050505050505050505050565b600080610878836108c7610d33565b61110883838360016112cb565b505050565b60006111198484611034565b9050600019811461116d578181101561115e57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161069d565b61116d848484840360006112cb565b50505050565b6001600160a01b03831661119d57604051634b637e8f60e11b81526000600482015260240161069d565b6001600160a01b0382166111c75760405163ec442f0560e01b81526000600482015260240161069d565b6111088383836113b3565b6001600160a01b0382166111fc5760405163ec442f0560e01b81526000600482015260240161069d565b61073f600083836113b3565b6112106114f1565b6112198161153c565b50565b6112246114f1565b61073f82826115c0565b6001600160a01b03821661125857604051634b637e8f60e11b81526000600482015260240161069d565b61073f826000836113b3565b60006108788284611b56565b60006108788284611b6d565b600061129083670de0b6b3a7640000611bc4565b6108789083611b56565b6000816112af670de0b6b3a764000085611b6d565b6112c190670de0b6b3a7640000611bc4565b6108789190611bc4565b600080516020611d7a8339815191526001600160a01b0385166113045760405163e602df0560e01b81526000600482015260240161069d565b6001600160a01b03841661132e57604051634a1406b160e11b81526000600482015260240161069d565b6001600160a01b038086166000908152600183016020908152604080832093881683529290522083905581156113ac57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516113a391815260200190565b60405180910390a35b5050505050565b600080516020611d7a8339815191526001600160a01b0384166113ef57818160020160008282546113e49190611b8f565b909155506114619050565b6001600160a01b038416600090815260208290526040902054828110156114425760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161069d565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b03831661147f57600281018054839003905561149e565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e391815260200190565b60405180910390a350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661153a57604051631afcd79f60e31b815260040160405180910390fd5b565b6115446114f1565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0060008061157184611611565b9150915081611581576012611583565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b6115c86114f1565b600080516020611d7a8339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036116028482611c9d565b506004810161116d8382611c9d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000918291829182916001600160a01b0387169161165891611d5d565b600060405180830381855afa9150503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b50915091508180156116ac57506020815110155b156116e0576000818060200190518101906116c79190611aed565b905060ff81116116de576001969095509350505050565b505b5060009485945092505050565b60005b838110156117085781810151838201526020016116f0565b50506000910152565b60208152600082518060208401526117308160408501602087016116ed565b601f01601f19169190910160400192915050565b60006020828403121561175657600080fd5b5035919050565b6001600160a01b038116811461121957600080fd5b6000806040838503121561178557600080fd5b82356117908161175d565b946020939093013593505050565b6000806000606084860312156117b357600080fd5b83356117be8161175d565b925060208401356117ce8161175d565b929592945050506040919091013590565b600080600080608085870312156117f557600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561182357600080fd5b81356108788161175d565b60008060006060848603121561184357600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561186d57600080fd5b82359150602083013561187f8161175d565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126118b157600080fd5b813567ffffffffffffffff808211156118cc576118cc61188a565b604051601f8301601f19908116603f011681019082821181831017156118f4576118f461188a565b8160405283815286602085880101111561190d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a03121561194857600080fd5b87356119538161175d565b9650602088013567ffffffffffffffff8082111561197057600080fd5b61197c8b838c016118a0565b975060408a013591508082111561199257600080fd5b5061199f8a828b016118a0565b95505060608801356119b08161175d565b9699959850939660808101359560a0820135955060c0909101359350915050565b600080600080608085870312156119e757600080fd5b84359350602085013592506040850135611a008161175d565b91506060850135611a108161175d565b939692955090935050565b600080600060608486031215611a3057600080fd5b833592506020840135611a428161175d565b91506040840135611a528161175d565b809150509250925092565b600080600060608486031215611a7257600080fd5b8335925060208401356117ce8161175d565b60008060408385031215611a9757600080fd5b8235611aa28161175d565b9150602083013561187f8161175d565b600080600080600060a08688031215611aca57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215611aff57600080fd5b5051919050565b600181811c90821680611b1a57607f821691505b602082108103611b3a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761062b5761062b611b40565b600082611b8a57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561062b5761062b611b40565b600060208284031215611bb457600080fd5b8151801515811461087857600080fd5b8181038181111561062b5761062b611b40565b60ff818116838216019081111561062b5761062b611b40565b60208082526037908201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e206660408201527f726f6d206f776e657220746f2074616b65207368617265000000000000000000606082015260800190565b601f821115611108576000816000526020600020601f850160051c81016020861015611c765750805b601f850160051c820191505b81811015611c9557828155600101611c82565b505050505050565b815167ffffffffffffffff811115611cb757611cb761188a565b611ccb81611cc58454611b06565b84611c4d565b602080601f831160018114611d005760008415611ce85750858301515b600019600386901b1c1916600185901b178555611c95565b600085815260208120601f198616915b82811015611d2f57888601518255948401946001909101908401611d10565b5085821015611d4d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251611d6f8184602087016116ed565b919091019291505056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a26469706673582212209e0acf048bf58ec0d49e2e1e7f8f16471e627df83a80f649e2dfe1e489f2640964736f6c63430008180033