0x6080604052600436106101d15760003560e01c8063b0cd3d14116100f7578063e3a0f26411610095578063ed33639f11610064578063ed33639f146105ad578063f178e47c146105e1578063f2fde38b1461060e578063fc7e9c6f1461062e57600080fd5b8063e3a0f26414610509578063e5285dcc14610529578063e829558814610559578063ec7329591461057957600080fd5b8063beabacc8116100d1578063beabacc814610476578063c2b40ae414610496578063c59d4847146104c3578063cd87a3b4146104f457600080fd5b8063b0cd3d141461041b578063b214faa514610439578063ba70f7571461044c57600080fd5b8063715018a61161016f5780638ea3099e1161013e5780638ea3099e1461039b57806390eeb02b146103bb5780639fa12d0b146103d8578063a1244c671461040557600080fd5b8063715018a61461031b578063839df945146103305780638bca6d16146103605780638da5cb5b1461037657600080fd5b80632b7ac3f3116101ab5780632b7ac3f31461025b578063414a37ba146102a75780634ecf518b146102c95780636d9833e3146102fb57600080fd5b80631101f818146101dd57806317cc915c1461020657806321a0adb61461024657600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101f3600a5481565b6040519081526020015b60405180910390f35b34801561021257600080fd5b50610236610221366004611cc2565b60076020526000908152604090205460ff1681565b60405190151581526020016101fd565b610259610254366004611cfb565b610653565b005b34801561026757600080fd5b5061028f7f00000000000000000000000058b71e98db6eb8ada8581fb8707f320ff50a22b781565b6040516001600160a01b0390911681526020016101fd565b3480156102b357600080fd5b506101f360008051602061229883398151915281565b3480156102d557600080fd5b506000546102e69063ffffffff1681565b60405163ffffffff90911681526020016101fd565b34801561030757600080fd5b50610236610316366004611cc2565b61091d565b34801561032757600080fd5b50610259610998565b34801561033c57600080fd5b5061023661034b366004611cc2565b60086020526000908152604090205460ff1681565b34801561036c57600080fd5b506101f360065481565b34801561038257600080fd5b50600354600160401b90046001600160a01b031661028f565b3480156103a757600080fd5b506101f36103b6366004611db1565b6109ac565b3480156103c757600080fd5b506003546102e69063ffffffff1681565b3480156103e457600080fd5b506103f86103f3366004611de6565b610b97565b6040516101fd9190611e5b565b34801561041157600080fd5b506101f360095481565b34801561042757600080fd5b506005546001600160a01b031661028f565b610259610447366004611cc2565b610c5d565b34801561045857600080fd5b5060035463ffffffff166000908152600260205260409020546101f3565b34801561048257600080fd5b50610259610491366004611ea1565b610d62565b3480156104a257600080fd5b506101f36104b1366004611cc2565b60026020526000908152604090205481565b3480156104cf57600080fd5b50600654600954600a54604080519384526020840192909252908201526060016101fd565b34801561050057600080fd5b506102e6601e81565b34801561051557600080fd5b5060055461028f906001600160a01b031681565b34801561053557600080fd5b50610236610544366004611cc2565b60009081526007602052604090205460ff1690565b34801561056557600080fd5b506101f3610574366004611cc2565b610df6565b34801561058557600080fd5b506101f37f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c81565b3480156105b957600080fd5b5061028f7f000000000000000000000000cc06fd09b40dbc60ebe4e6244ed8f11ce93d1ce981565b3480156105ed57600080fd5b506101f36105fc366004611cc2565b60016020526000908152604090205481565b34801561061a57600080fd5b50610259610629366004611ee2565b611435565b34801561063a57600080fd5b506003546102e690640100000000900463ffffffff1681565b61065b6114ab565b6006548211156106b25760405162461bcd60e51b815260206004820152601a60248201527f4665652065786365656473207472616e736665722076616c756500000000000060448201526064015b60405180910390fd5b60008581526007602052604090205460ff16156107115760405162461bcd60e51b815260206004820152601f60248201527f546865206e6f746520686173206265656e20616c7265616479207370656e740060448201526064016106a9565b61071a8661091d565b6107665760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742066696e6420796f7572206d65726b6c6520726f6f740000000060448201526064016106a9565b6040805160c081018252878152602081018790526001600160a01b038681168284015285811660608301526080820185905260a08201849052915163695ef6f960e01b81527f00000000000000000000000058b71e98db6eb8ada8581fb8707f320ff50a22b79092169163695ef6f9916107e6918c918c91600401611f06565b602060405180830381600087803b15801561080057600080fd5b505af1158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190611f64565b61087d5760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b2103bb4ba34323930bb90383937b7b360511b60448201526064016106a9565b6000858152600760205260409020805460ff191660011790556108a284848484611505565b6001600a60008282546108b59190611f9c565b9091555050604080516001600160a01b03868116825260208201889052918101849052908416907fe9e508bad6d4c3227e881ca19068f099da81b5164dd6d62b2eaf1e8bc6c349319060600160405180910390a26109136001600455565b5050505050505050565b60008161092c57506000919050565b60035463ffffffff16805b63ffffffff811660009081526002602052604090205484141561095e575060019392505050565b63ffffffff811661096d5750601e5b8061097781611fb4565b9150508163ffffffff168163ffffffff161415610937575060009392505050565b6109a0611851565b6109aa60006118b3565b565b60006000805160206122988339815191528310610a0b5760405162461bcd60e51b815260206004820181905260248201527f5f6c6566742073686f756c6420626520696e7369646520746865206669656c6460448201526064016106a9565b6000805160206122988339815191528210610a725760405162461bcd60e51b815260206004820152602160248201527f5f72696768742073686f756c6420626520696e7369646520746865206669656c6044820152601960fa1b60648201526084016106a9565b60405163f47d33b560e01b81526004810184905260006024820181905284916001600160a01b0387169063f47d33b590604401604080518083038186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af49190611fd4565b909250905060008051602061229883398151915284830860405163f47d33b560e01b815260048101829052602481018390529092506001600160a01b0387169063f47d33b590604401604080518083038186803b158015610b5457600080fd5b505afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c9190611fd4565b509695505050505050565b60608167ffffffffffffffff811115610bb257610bb261200e565b604051908082528060200260200182016040528015610bdb578160200160208202803683370190505b50905060005b82811015610c5657610c1a848483818110610bfe57610bfe612024565b9050602002013560009081526007602052604090205460ff1690565b15610c44576001828281518110610c3357610c33612024565b911515602092830291909101909101525b80610c4e8161203a565b915050610be1565b5092915050565b610c656114ab565b60008181526008602052604090205460ff1615610cce5760405162461bcd60e51b815260206004820152602160248201527f54686520636f6d6d69746d656e7420686173206265656e207375626d697474656044820152601960fa1b60648201526084016106a9565b6000610cd982611916565b6000838152600860205260409020805460ff191660011790559050610cfc611b07565b600160096000828254610d0f9190611f9c565b90915550506040805163ffffffff8316815242602082015283917fa945e51eec50ab98c161376f0db4cf2aeba3ec92755fe2fcd388bdbbb80ff196910160405180910390a250610d5f6001600455565b50565b610d6a611851565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820183905283919082169063a9059cbb90604401602060405180830381600087803b158015610db757600080fd5b505af1158015610dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610def9190611f64565b5050505050565b600081610e2457507f2fe54c60d3acabf3343a35b6eba15db4821b340f76e741e2249685ed4899af6c919050565b8160011415610e5457507f256a6135777eee2fd26f54b8b7037a25439d5235caee224154186d2b8a52e31d919050565b8160021415610e8457507f1151949895e82ab19924de92c40a3d6f7bcb60d92b00504b8199613683f0c200919050565b8160031415610eb457507f20121ee811489ff8d61f09fb89e313f14959a0f28bb428a20dba6b0b068b3bdb919050565b8160041415610ee457507f0a89ca6ffa14cc462cfedb842c30ed221a50a3d6bf022a6a57dc82ab24c157c9919050565b8160051415610f1457507f24ca05c2b5cd42e890d6be94c68d0689f4f21c9cec9c0f13fe41d566dfb54959919050565b8160061415610f4457507f1ccb97c932565a92c60156bdba2d08f3bf1377464e025cee765679e604a7315c919050565b8160071415610f7457507f19156fbd7d1a8bf5cba8909367de1b624534ebab4f0f79e003bccdd1b182bdb4919050565b8160081415610fa457507f261af8c1f0912e465744641409f622d466c3920ac6e5ff37e36604cb11dfff80919050565b8160091415610fd357507e58459724ff6ca5a1652fcbc3e82b93895cf08e975b19beab3f54c217d1c007919050565b81600a141561100357507f1f04ef20dee48d39984d8eabe768a70eafa6310ad20849d4573c3c40c2ad1e30919050565b81600b141561103357507f1bea3dec5dab51567ce7e200a30f7ba6d4276aeaa53e2686f962a46c66d511e5919050565b81600c141561106357507f0ee0f941e2da4b9e31c3ca97a40d8fa9ce68d97c084177071b3cb46cd3372f0f919050565b81600d141561109357507f1ca9503e8935884501bbaf20be14eb4c46b89772c97b96e3b2ebf3a36a948bbd919050565b81600e14156110c357507f133a80e30697cd55d8f7d4b0965b7be24057ba5dc3da898ee2187232446cb108919050565b81600f14156110f357507f13e6d8fc88839ed76e182c2a779af5b2c0da9dd18c90427a644f7e148a6253b6919050565b816010141561112357507f1eb16b057a477f4bc8f572ea6bee39561098f78f15bfb3699dcbb7bd8db61854919050565b816011141561115357507f0da2cb16a1ceaabf1c16b838f7a9e3f2a3a3088d9e0a6debaa748114620696ea919050565b816012141561118357507f24a3b3d822420b14b5d8cb6c28a574f01e98ea9e940551d2ebd75cee12649f9d919050565b81601314156111b357507f198622acbd783d1b0d9064105b1fc8e4d8889de95c4c519b3f635809fe6afc05919050565b81601414156111e357507f29d7ed391256ccc3ea596c86e933b89ff339d25ea8ddced975ae2fe30b5296d4919050565b816015141561121357507f19be59f2f0413ce78c0c3703a3a5451b1d7f39629fa33abd11548a76065b2967919050565b816016141561124357507f1ff3f61797e538b70e619310d33f2a063e7eb59104e112e95738da1254dc3453919050565b816017141561127357507f10c16ae9959cf8358980d9dd9616e48228737310a10e2b6b731c1a548f036c48919050565b81601814156112a357507f0ba433a63174a90ac20992e75e3095496812b652685b5e1a2eae0b1bf4e8fcd1919050565b81601914156112d357507f019ddb9df2bc98d987d0dfeca9d2b643deafab8f7036562e627c3667266a044c919050565b81601a141561130357507f2d3c88b23175c5a5565db928414c66d1912b11acf974b2e644caaac04739ce99919050565b81601b141561133357507f2eab55f6ae4e66e32c5189eed5c470840863445760f5ed7e7b69b2a62600f354919050565b81601c141561136257507e2df37a2642621802383cf952bf4dd1f32e05433beeb1fd41031fb7eace979d919050565b81601d141561139257507f104aeb41435db66c3e62feccc1d6f5d98d0a0ed75d1374db457cf462e3a1f427919050565b81601e14156113c257507f1f3c6fd858e9a7d4b0d1f38e256a09d81d5a5e3c963987e2d4b814cfab7c6ebb919050565b81601f14156113f257507f2c7a07d20dff79d01fecedc1134284a8d08436606c93693b67e333f671bf69cc919050565b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016106a9565b919050565b61143d611851565b6001600160a01b0381166114a25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a9565b610d5f816118b3565b600260045414156114fe5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a9565b6002600455565b34156115715760405162461bcd60e51b815260206004820152603560248201527f4d6573736167652076616c756520697320737570706f73656420746f206265206044820152747a65726f20666f722045544820696e7374616e636560581b60648201526084016106a9565b80156115dc5760405162461bcd60e51b815260206004820152603460248201527f526566756e642076616c756520697320737570706f73656420746f206265207a60448201527365726f20666f722045544820696e7374616e636560601b60648201526084016106a9565b60006115e6611b7e565b6115ee611c00565b6006546115fb9190612055565b6116059190612074565b9050600083826006546116189190612088565b6116229190612088565b90506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114611671576040519150601f19603f3d011682016040523d82523d6000602084013e611676565b606091505b50509050806116d55760405162461bcd60e51b815260206004820152602560248201527f7061796d656e7420746f205f726563697069656e7420646964206e6f7420676f604482015264207468727560d81b60648201526084016106a9565b82156117935760006116e5611c45565b6001600160a01b03168460405160006040518083038185875af1925050503d806000811461172f576040519150601f19603f3d011682016040523d82523d6000602084013e611734565b606091505b50509050806117915760405162461bcd60e51b815260206004820152602360248201527f7061796d656e7420746f20747265617375727920646964206e6f7420676f207460448201526268727560e81b60648201526084016106a9565b505b8415611848576000866001600160a01b03168660405160006040518083038185875af1925050503d80600081146117e6576040519150601f19603f3d011682016040523d82523d6000602084013e6117eb565b606091505b50509050806109135760405162461bcd60e51b815260206004820152602360248201527f7061796d656e7420746f205f72656c6179657220646964206e6f7420676f207460448201526268727560e81b60648201526084016106a9565b50505050505050565b6003546001600160a01b03600160401b9091041633146109aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a9565b600380546001600160a01b03838116600160401b81810268010000000000000000600160e01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460008054909163ffffffff64010000000090910481169161193c911660026121b2565b63ffffffff168163ffffffff1614156119b05760405162461bcd60e51b815260206004820152603060248201527f4d65726b6c6520747265652069732066756c6c2e204e6f206d6f7265206c656160448201526f1d995cc818d85b88189948185919195960821b60648201526084016106a9565b8083600080805b60005463ffffffff9081169082161015611a79576119d66002866121cf565b63ffffffff16611a11578392506119f28163ffffffff16610df6565b63ffffffff821660009081526001602052604090208590559150611a2d565b63ffffffff811660009081526001602052604090205492508391505b611a587f000000000000000000000000cc06fd09b40dbc60ebe4e6244ed8f11ce93d1ce984846109ac565b9350611a656002866121f2565b945080611a7181612215565b9150506119b7565b50600354600090601e90611a949063ffffffff166001612239565b611a9e91906121cf565b6003805463ffffffff191663ffffffff831690811790915560009081526002602052604090208590559050611ad4866001612239565b6003805463ffffffff929092166401000000000267ffffffff000000001990921691909117905550939695505050505050565b60065434146109aa5760405162461bcd60e51b815260206004820152603860248201527f506c656173652073656e6420606d697844656e6f6d696e6174696f6e6020455460448201527f4820616c6f6e672077697468207472616e73616374696f6e000000000000000060648201526084016106a9565b60055460408051630c0586bf60e11b815290516000926001600160a01b03169163180b0d7e916004808301926020929190829003018186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190612261565b905090565b60055460408051637436f52560e11b815290516000926001600160a01b03169163e86dea4a916004808301926020929190829003018186803b158015611bc357600080fd5b600554604080516361d027b360e01b815290516000926001600160a01b0316916361d027b3916004808301926020929190829003018186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb919061227a565b600060208284031215611cd457600080fd5b5035919050565b6001600160a01b0381168114610d5f57600080fd5b803561143081611cdb565b60008060008060008060008060e0898b031215611d1757600080fd5b883567ffffffffffffffff80821115611d2f57600080fd5b818b0191508b601f830112611d4357600080fd5b813581811115611d5257600080fd5b8c6020828501011115611d6457600080fd5b60209283019a50985050890135955060408901359450611d8660608a01611cf0565b9350611d9460808a01611cf0565b925060a0890135915060c089013590509295985092959890939650565b600080600060608486031215611dc657600080fd5b8335611dd181611cdb565b95602085013595506040909401359392505050565b60008060208385031215611df957600080fd5b823567ffffffffffffffff80821115611e1157600080fd5b818501915085601f830112611e2557600080fd5b813581811115611e3457600080fd5b8660208260051b8501011115611e4957600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015611e95578351151583529284019291840191600101611e77565b50909695505050505050565b600080600060608486031215611eb657600080fd5b8335611ec181611cdb565b92506020840135611ed181611cdb565b929592945050506040919091013590565b600060208284031215611ef457600080fd5b8135611eff81611cdb565b9392505050565b60e081528260e08201526000610100848682850137600081868501015280601f19601f87011684010191505060208083018460005b6006811015611f5857815183529183019190830190600101611f3b565b50505050949350505050565b600060208284031215611f7657600080fd5b81518015158114611eff57600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611faf57611faf611f86565b500190565b600063ffffffff821680611fca57611fca611f86565b6000190192915050565b60008060408385031215611fe757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060001982141561204e5761204e611f86565b5060010190565b600081600019048311821515161561206f5761206f611f86565b500290565b60008261208357612083611ff8565b500490565b60008282101561209a5761209a611f86565b500390565b600181815b808511156120dc578163ffffffff048211156120c2576120c2611f86565b808516156120cf57918102915b93841c93908002906120a4565b509250929050565b6000826120f3575060016121ac565b81612100575060006121ac565b8160018114612116576002811461212057612151565b60019150506121ac565b60ff84111561213157612131611f86565b6001841b915063ffffffff82111561214b5761214b611f86565b506121ac565b5060208310610133831016604e8410600b8410161715612188575081810a63ffffffff81111561218357612183611f86565b6121ac565b612192838361209f565b8063ffffffff048211156121a8576121a8611f86565b0290505b92915050565b600063ffffffff6121c78185168285166120e4565b949350505050565b600063ffffffff808416806121e6576121e6611ff8565b92169190910692915050565b600063ffffffff8084168061220957612209611ff8565b92169190910492915050565b600063ffffffff8083168181141561222f5761222f611f86565b6001019392505050565b600063ffffffff80831681851680830382111561225857612258611f86565b01949350505050565b60006020828403121561227357600080fd5b5051919050565b60006020828403121561228c57600080fd5b8151611eff81611cdb56fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220559b93a22f81ca60cd04c42eee8fca1172441d40195666ce88df724fe47e340664736f6c63430008090033