60806040526001600c5534801561001557600080fd5b50604080518082018252600f81526e21b7b637b73c902628102a37b5b2b760891b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f850f0dc1b413448f4e85a627870e72685d9497b8f951c88421b082b29a8171a8918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120600355600580546001600160a01b031916331790556121ba806101136000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a71461040a578063d505accf1461041d578063dd62ed3e14610430578063fff6cae91461045b57600080fd5b8063ba9a7a56146103db578063bc25cf77146103e4578063c45a0155146103f757600080fd5b806389afcb44116100d357806389afcb441461036b57806395d89b41146103935780639dbeedea146103b5578063a9059cbb146103c857600080fd5b806370a08231146103225780637464fc3d146103425780637ecebe001461034b57600080fd5b806330adf81f11610166578063485cc95511610140578063485cc955146102e85780635909c0d5146102fd5780635a3d5493146103065780636a6278421461030f57600080fd5b806330adf81f1461029e578063313ce567146102c55780633644e515146102df57600080fd5b806306fdde03146101ae5780630902f1ac146101f2578063095ea7b3146102265780630dfe16811461024957806318160ddd1461027457806323b872dd1461028b575b600080fd5b6101dc6040518060400160405280600f81526020016e21b7b637b73c902628102a37b5b2b760891b81525081565b6040516101e99190611d51565b60405180910390f35b6101fa610463565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101e9565b610239610234366004611d9c565b61048d565b60405190151581526020016101e9565b60065461025c906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b61027d60005481565b6040519081526020016101e9565b610239610299366004611dc8565b6104a3565b61027d7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102cd601281565b60405160ff90911681526020016101e9565b61027d60035481565b6102fb6102f6366004611e09565b61051d565b005b61027d60095481565b61027d600a5481565b61027d61031d366004611e42565b6105a1565b61027d610330366004611e42565b60016020526000908152604090205481565b61027d600b5481565b61027d610359366004611e42565b60046020526000908152604090205481565b61037e610379366004611e42565b61088a565b604080519283526020830191909152016101e9565b6101dc604051806040016040528060038152602001620434c560ec1b81525081565b6102fb6103c3366004611e5f565b610c2b565b6102396103d6366004611d9c565b6111b0565b61027d6103e881565b6102fb6103f2366004611e42565b6111bd565b60055461025c906001600160a01b031681565b60075461025c906001600160a01b031681565b6102fb61042b366004611f10565b6112df565b61027d61043e366004611e09565b600260209081526000928352604080842090915290825290205481565b6102fb6114f3565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b600061049a338484611635565b50600192915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610508576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610502908490611f9d565b90915550505b610513848484611697565b5060019392505050565b6005546001600160a01b031633146105735760405162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b60448201526064015b60405180910390fd5b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b6000600c546001146105c55760405162461bcd60e51b815260040161056a90611fb4565b6000600c819055806105d5610463565b506006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561062257600080fd5b505afa158015610636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065a9190611fdf565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b1580156106a357600080fd5b505afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db9190611fdf565b905060006106f26001600160701b03861684611f9d565b905060006107096001600160701b03861684611f9d565b905060006107178787611738565b60005490915080610755576103e86107376107328587611ff8565b611886565b6107419190611f9d565b985061075060006103e86118f6565b61079c565b6107996001600160701b03891661076c8387611ff8565b610776919061202d565b6001600160701b03891661078a8487611ff8565b610794919061202d565b61197f565b98505b600089116107fd5760405162461bcd60e51b815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152671657d3525395115160c21b606482015260840161056a565b6108078a8a6118f6565b61081386868a8a611997565b811561083c57600854610838906001600160701b03600160701b820481169116611ff8565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b600080600c546001146108af5760405162461bcd60e51b815260040161056a90611fb4565b6000600c819055806108bf610463565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b15801561091457600080fd5b505afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c9190611fdf565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561099157600080fd5b505afa1580156109a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611fdf565b306000908152600160205260408120549192506109e68888611738565b600054909150806109f78685611ff8565b610a01919061202d565b9a5080610a0e8585611ff8565b610a18919061202d565b995060008b118015610a2a575060008a115b610a875760405162461bcd60e51b815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152671657d0955493915160c21b606482015260840161056a565b610a913084611b4f565b610a9c878d8d611bd2565b610aa7868d8c611bd2565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a082319060240160206040518083038186803b158015610ae657600080fd5b505afa158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190611fdf565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a082319060240160206040518083038186803b158015610b6057600080fd5b505afa158015610b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b989190611fdf565b9350610ba685858b8b611997565b8115610bcf57600854610bcb906001600160701b03600160701b820481169116611ff8565b600b555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b600c54600114610c4d5760405162461bcd60e51b815260040161056a90611fb4565b6000600c5584151580610c605750600084115b610cba5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056323a20494e53554646494349454e545f4f55545055545f416044820152641353d5539560da1b606482015260840161056a565b600080610cc5610463565b5091509150816001600160701b031687108015610cea5750806001600160701b031686105b610d405760405162461bcd60e51b815260206004820152602160248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152605960f81b606482015260840161056a565b60648861ffff161115610d8e5760405162461bcd60e51b81526020600482015260166024820152750aadcd2e6eec2e0ac6474408c8a8abea89ebe90928e960531b604482015260640161056a565b60065460075460009182916001600160a01b03918216919081169089168214801590610dcc5750806001600160a01b0316896001600160a01b031614155b610e105760405162461bcd60e51b8152602060048201526015602482015274556e697377617056323a20494e56414c49445f544f60581b604482015260640161056a565b8a15610e2157610e21828a8d611bd2565b8915610e3257610e32818a8c611bd2565b8615610e9f576040516304347a1760e21b81526001600160a01b038a16906310d1e85c90610e6c9033908f908f908e908e90600401612041565b600060405180830381600087803b158015610e8657600080fd5b505af1158015610e9a573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f169190611fdf565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b158015610f5857600080fd5b505afa158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f909190611fdf565b92505050600089856001600160701b0316610fab9190611f9d565b8311610fb8576000610fd5565b610fcb8a6001600160701b038716611f9d565b610fd59084611f9d565b90506000610fec8a6001600160701b038716611f9d565b8311610ff9576000611016565b61100c8a6001600160701b038716611f9d565b6110169084611f9d565b905060008211806110275750600081115b61107f5760405162461bcd60e51b8152602060048201526024808201527f556e697377617056323a20494e53554646494349454e545f494e5055545f414d60448201526313d5539560e21b606482015260840161056a565b600061108f61ffff8e1684611ff8565b61109b86612710611ff8565b6110a59190611f9d565b905060006110b761ffff8f1684611ff8565b6110c386612710611ff8565b6110cd9190611f9d565b90506110e56001600160701b03808916908a16611ff8565b6110f3906305f5e100611ff8565b6110fd8284611ff8565b101561113a5760405162461bcd60e51b815260206004820152600c60248201526b556e697377617056323a204b60a01b604482015260640161056a565b505061114884848888611997565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c5550505050505050505050565b600061049a338484611697565b600c546001146111df5760405162461bcd60e51b815260040161056a90611fb4565b6000600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161128d91849186916001600160701b03169083906370a08231906024015b60206040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127e9190611fdf565b6112889190611f9d565b611bd2565b6008546040516370a0823160e01b81523060048201526112d59183918691600160701b90046001600160701b0316906001600160a01b038416906370a082319060240161122e565b50506001600c5550565b428410156113245760405162461bcd60e51b8152602060048201526012602482015271155b9a5cddd85c158c8e881156141254915160721b604482015260640161056a565b6003546001600160a01b038816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876113778361208d565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016113f092919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa15801561145b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906114915750886001600160a01b0316816001600160a01b0316145b6114dd5760405162461bcd60e51b815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015260640161056a565b6114e8898989611635565b505050505050505050565b600c546001146115155760405162461bcd60e51b815260040161056a90611fb4565b6000600c556006546040516370a0823160e01b815230600482015261162e916001600160a01b0316906370a082319060240160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115979190611fdf565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156115da57600080fd5b505afa1580156115ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116129190611fdf565b6008546001600160701b0380821691600160701b900416611997565b6001600c55565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316600090815260016020526040812080548392906116bf908490611f9d565b90915550506001600160a01b038216600090815260016020526040812080548392906116ec9084906120a8565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161168a91815260200190565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561178957600080fd5b505afa15801561179d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c191906120c0565b600b546001600160a01b03821615801594509192509061187257801561186d5760006117fc6107326001600160701b03808816908916611ff8565b9050600061180983611886565b90508082111561186a57600061181f8284611f9d565b60005461182c9190611ff8565b905060008261183c856005611ff8565b61184691906120a8565b90506000611854828461202d565b905080156118665761186687826118f6565b5050505b50505b61187e565b801561187e576000600b555b505092915050565b600060038211156118e757508060006118a060028361202d565b6118ab9060016120a8565b90505b818110156118e1579050806002816118c6818661202d565b6118d091906120a8565b6118da919061202d565b90506118ae565b50919050565b81156118f1575060015b919050565b8060008082825461190791906120a8565b90915550506001600160a01b038216600090815260016020526040812080548392906119349084906120a8565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b600081831061198e5781611990565b825b9392505050565b6001600160701b0384118015906119b557506001600160701b038311155b6119f75760405162461bcd60e51b8152602060048201526013602482015272556e697377617056323a204f564552464c4f5760681b604482015260640161056a565b6000611a08640100000000426120dd565b60085490915063ffffffff600160e01b9091048116820390811615801590611a3857506001600160701b03841615155b8015611a4c57506001600160701b03831615155b15611ab7578063ffffffff16611a7485611a6586611ced565b6001600160e01b031690611d0c565b600980546001600160e01b03929092169290920201905563ffffffff8116611a9f84611a6587611ced565b600a80546001600160e01b0392909216929092020190555b506008805463ffffffff8316600160e01b026001600160e01b036001600160701b03888116600160701b9081026001600160e01b03199095168b83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a15050505050565b6001600160a01b03821660009081526001602052604081208054839290611b77908490611f9d565b9250508190555080600080828254611b8f9190611f9d565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611973565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611c2e91906120f1565b6000604051808303816000865af19150503d8060008114611c6b576040519150601f19603f3d011682016040523d82523d6000602084013e611c70565b606091505b5091509150818015611c9a575080511580611c9a575080806020019051810190611c9a919061210d565b611ce65760405162461bcd60e51b815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015260640161056a565b5050505050565b6000611d06600160701b6001600160701b03841661212f565b92915050565b60006119906001600160701b0383168461215e565b60005b83811015611d3c578181015183820152602001611d24565b83811115611d4b576000848401525b50505050565b6020815260008251806020840152611d70816040850160208701611d21565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611d9957600080fd5b50565b60008060408385031215611daf57600080fd5b8235611dba81611d84565b946020939093013593505050565b600080600060608486031215611ddd57600080fd5b8335611de881611d84565b92506020840135611df881611d84565b929592945050506040919091013590565b60008060408385031215611e1c57600080fd5b8235611e2781611d84565b91506020830135611e3781611d84565b809150509250929050565b600060208284031215611e5457600080fd5b813561199081611d84565b60008060008060008060a08789031215611e7857600080fd5b863561ffff81168114611e8a57600080fd5b955060208701359450604087013593506060870135611ea881611d84565b9250608087013567ffffffffffffffff80821115611ec557600080fd5b818901915089601f830112611ed957600080fd5b813581811115611ee857600080fd5b8a6020828501011115611efa57600080fd5b6020830194508093505050509295509295509295565b600080600080600080600060e0888a031215611f2b57600080fd5b8735611f3681611d84565b96506020880135611f4681611d84565b95506040880135945060608801359350608088013560ff81168114611f6a57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b600052601160045260246000fd5b600082821015611faf57611faf611f87565b500390565b602080825260119082015270155b9a5cddd85c158c8e881313d0d2d151607a1b604082015260600190565b600060208284031215611ff157600080fd5b5051919050565b600081600019048311821515161561201257612012611f87565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261203c5761203c612017565b500490565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006000198214156120a1576120a1611f87565b5060010190565b600082198211156120bb576120bb611f87565b500190565b6000602082840312156120d257600080fd5b815161199081611d84565b6000826120ec576120ec612017565b500690565b60008251612103818460208701611d21565b9190910192915050565b60006020828403121561211f57600080fd5b8151801515811461199057600080fd5b60006001600160e01b038281168482168115158284048211161561215557612155611f87565b02949350505050565b60006001600160e01b038381168061217857612178612017565b9216919091049291505056fea26469706673582212208e14c0cbb7ef001494ef63fe9917ab7b6dd68bf74dd0255013136c7d6f3cdf7e64736f6c63430008090033