608060405234801561001057600080fd5b506040516200251338038062002513833981016040819052610031916100bf565b600080546001600160a01b0319166001600160a01b038316908117825580825260056020908152604080842080546b204fce5e3e250261100000006001600160601b0319909116811790915560038190554260025590519081529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3506100ef565b6000602082840312156100d157600080fd5b81516001600160a01b03811681146100e857600080fd5b9392505050565b61241480620000ff6000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c8063775e9ce4116100f9578063cf09e0d011610097578063dd62ed3e11610071578063dd62ed3e146104a5578063e7a324dc146104e7578063f1127ed81461050e578063f39c38a01461057657600080fd5b8063cf09e0d014610476578063d38bfff41461047f578063d505accf1461049257600080fd5b806395d89b41116100d357806395d89b4114610401578063a9059cbb1461043d578063b4b5ea5714610450578063c3cda5201461046357600080fd5b8063775e9ce4146103a3578063782d6fe1146103b65780637ecebe00146103e157600080fd5b8063313ce567116101665780635c19a95c116101405780635c19a95c146103195780635d36b1901461032e5780636fcfff451461033657806370a082311461037157600080fd5b8063313ce567146102ab578063587cde1e146102c55780635aa6e6751461030657600080fd5b806320606b701161019757806320606b701461024a57806323b872dd1461027157806330adf81f1461028457600080fd5b806306fdde03146101be578063095ea7b31461021057806318160ddd14610233575b600080fd5b6101fa6040518060400160405280600e81526020017f4175726967616d6920546f6b656e00000000000000000000000000000000000081525081565b6040516102079190611e59565b60405180910390f35b61022361021e366004611eca565b610589565b6040519015158152602001610207565b61023c60035481565b604051908152602001610207565b61023c7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61022361027f366004611ef4565b61064f565b61023c7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102b3601281565b60405160ff9091168152602001610207565b6102ee6102d3366004611f30565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610207565b6000546102ee906001600160a01b031681565b61032c610327366004611f30565b610799565b005b61032c6107a6565b61035c610344366004611f30565b60086020526000908152604090205463ffffffff1681565b60405163ffffffff9091168152602001610207565b61023c61037f366004611f30565b6001600160a01b03166000908152600560205260409020546001600160601b031690565b61032c6103b1366004611f4b565b61087b565b6103c96103c4366004611eca565b610a6c565b6040516001600160601b039091168152602001610207565b61023c6103ef366004611f30565b60096020526000908152604090205481565b6101fa6040518060400160405280600381526020017f504c59000000000000000000000000000000000000000000000000000000000081525081565b61022361044b366004611eca565b610d0c565b6103c961045e366004611f30565b610d48565b61032c610471366004611f9f565b610dc7565b61023c60025481565b61032c61048d366004611f30565b61112c565b61032c6104a0366004611ff7565b6111f2565b61023c6104b3366004612061565b6001600160a01b0391821660009081526004602090815260408083209390941682529190915220546001600160601b031690565b61023c7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b61055261051c366004612094565b600760209081526000928352604080842090915290825290205463ffffffff81169064010000000090046001600160601b031682565b6040805163ffffffff90931683526001600160601b03909116602083015201610207565b6001546102ee906001600160a01b031681565b6000806000198314156105a457506001600160601b036105c9565b6105c68360405180606001604052806024815260200161220560249139611612565b90505b3360008181526004602090815260408083206001600160a01b0389168085529083529281902080546bffffffffffffffffffffffff19166001600160601b03871690811790915590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a360019150505b92915050565b6001600160a01b03831660009081526004602090815260408083203380855290835281842054825160608101909352602480845291936001600160601b039091169285926106a7928892919061220590830139611612565b9050866001600160a01b0316836001600160a01b0316141580156106d457506001600160601b0382811614155b156107815760006106fe83836040518060600160405280603c81526020016123a3603c9139611645565b6001600160a01b038981166000818152600460209081526040808320948a168084529482529182902080546bffffffffffffffffffffffff19166001600160601b0387169081179091559151918252939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b61078c87878361168f565b5060019695505050505050565b6107a33382611969565b50565b6001546001600160a01b031633146108055760405162461bcd60e51b815260206004820152601060248201527f57726f6e6720676f7665726e616e63650000000000000000000000000000000060448201526064015b60405180910390fd5b60018054600080546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000091821681179092559091169091556040519081527f7ce9f0b2f920547bdcee6a4c6760e8545ed1d90004643f66b4872bdba125ba499060200160405180910390a1565b6000546001600160a01b031633146108d55760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420676f7665726e616e6365000000000000000060448201526064016107fc565b6002546108e6906301e133806120f8565b42116109345760405162461bcd60e51b815260206004820152601460248201527f4d7573742062652061667465722031207965617200000000000000000000000060448201526064016107fc565b6001600160a01b03821660009081526005602090815260409182902054825160608101909352602b80845261097f936001600160601b03909216928592919061237890830139611a0b565b60056000846001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160601b0302191690836001600160601b031602179055506109ed6003548260405180606001604052806023815260200161235560239139611a0b565b6001600160601b03166003556001600160a01b03808316600090815260066020526040812054610a1e921683611a58565b6040516001600160601b03821681526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000438210610ae35760405162461bcd60e51b815260206004820152602660248201527f506c793a3a6765745072696f72566f7465733a206e6f7420796574206465746560448201527f726d696e6564000000000000000000000000000000000000000000000000000060648201526084016107fc565b6001600160a01b03831660009081526008602052604090205463ffffffff1680610b11576000915050610649565b6001600160a01b03841660009081526007602052604081208491610b36600185612110565b63ffffffff90811682526020820192909252604001600020541611610baa576001600160a01b038416600090815260076020526040812090610b79600184612110565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b031691506106499050565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff16831015610be5576000915050610649565b600080610bf3600184612110565b90505b8163ffffffff168163ffffffff161115610cc65760006002610c188484612110565b610c229190612135565b610c2c9083612110565b6001600160a01b038816600090815260076020908152604080832063ffffffff8581168552908352928190208151808301909252549283168082526401000000009093046001600160601b031691810191909152919250871415610c9a576020015194506106499350505050565b805163ffffffff16871115610cb157819350610cbf565b610cbc600183612110565b92505b5050610bf6565b506001600160a01b038516600090815260076020908152604080832063ffffffff909416835292905220546001600160601b036401000000009091041691505092915050565b600080610d31836040518060600160405280602581526020016122fb60259139611612565b9050610d3e33858361168f565b5060019392505050565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610d73576000610dc0565b6001600160a01b038316600090815260076020526040812090610d97600184612110565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b9392505050565b604080518082018252600e81527f4175726967616d6920546f6b656e00000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fd124143b502bb80f6301883906fe154333e81a44ddfae9a08732bcae2c831cee81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08301526001600160a01b038a1660e08301526101008201899052610120808301899052845180840390910181526101408301909452835193909201929092207f19010000000000000000000000000000000000000000000000000000000000006101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610f7a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110035760405162461bcd60e51b815260206004820152602560248201527f506c793a3a64656c656761746542795369673a20696e76616c6964207369676e60448201527f617475726500000000000000000000000000000000000000000000000000000060648201526084016107fc565b6001600160a01b03811660009081526009602052604081208054916110278361217f565b91905055891461109f5760405162461bcd60e51b815260206004820152602160248201527f506c793a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b874211156111155760405162461bcd60e51b815260206004820152602560248201527f506c793a3a64656c656761746542795369673a207369676e617475726520657860448201527f706972656400000000000000000000000000000000000000000000000000000060648201526084016107fc565b61111f818b611969565b505050505b505050505050565b6000546001600160a01b031633146111865760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420676f7665726e616e6365000000000000000060448201526064016107fc565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527fde4aabcd09171142d82dd9e667db43bf0dca12f30fa0aec30859875d35ecb5d69060200160405180910390a150565b600060001986141561120c57506001600160601b03611231565b61122e866040518060600160405280602381526020016122d860239139611612565b90505b604080518082018252600e81527f4175726967616d6920546f6b656e00000000000000000000000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fd124143b502bb80f6301883906fe154333e81a44ddfae9a08732bcae2c831cee81840152466060820152306080808301919091528351808303909101815260a090910183528051908201206001600160a01b038b166000908152600990925291812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190866113248361217f565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e001604051602081830303815290604052805190602001209050600082826040516020016113be9291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa158015611429573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661148c5760405162461bcd60e51b815260206004820152601e60248201527f506c793a3a7065726d69743a20696e76616c6964207369676e6174757265000060448201526064016107fc565b8b6001600160a01b0316816001600160a01b0316146114ed5760405162461bcd60e51b815260206004820152601960248201527f506c793a3a7065726d69743a20756e617574686f72697a65640000000000000060448201526064016107fc565b8842111561153d5760405162461bcd60e51b815260206004820152601e60248201527f506c793a3a7065726d69743a207369676e61747572652065787069726564000060448201526064016107fc565b84600460008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160601b0302191690836001600160601b031602179055508a6001600160a01b03168c6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516115fc91906001600160601b0391909116815260200190565b60405180910390a3505050505050505050505050565b6000816001600160601b0384111561163d5760405162461bcd60e51b81526004016107fc9190611e59565b509192915050565b6000836001600160601b0316836001600160601b03161115829061167c5760405162461bcd60e51b81526004016107fc9190611e59565b50611687838561219a565b949350505050565b6001600160a01b03831661170b5760405162461bcd60e51b815260206004820152603b60248201527f506c793a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726160448201527f6e736665722066726f6d20746865207a65726f2061646472657373000000000060648201526084016107fc565b6001600160a01b0382166117875760405162461bcd60e51b815260206004820152603960248201527f506c793a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726160448201527f6e7366657220746f20746865207a65726f20616464726573730000000000000060648201526084016107fc565b6001600160a01b0382163014156118065760405162461bcd60e51b815260206004820152603a60248201527f506c793a3a5f7472616e73666572546f6b656e733a2063616e6e6f742074726160448201527f6e7366657220746f2074686520746f6b656e206164647265737300000000000060648201526084016107fc565b6001600160a01b038316600090815260056020908152604091829020548251606081019093526035808452611851936001600160601b03909216928592919061232090830139611645565b6001600160a01b03848116600090815260056020908152604080832080546bffffffffffffffffffffffff19166001600160601b0396871617905592861682529082902054825160608101909352602f8084526118be949190911692859290919061227690830139611a0b565b6001600160a01b0383811660008181526005602090815260409182902080546bffffffffffffffffffffffff19166001600160601b03968716179055905193851684529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b0380841660009081526006602052604080822054858416835291205461196492918216911683611a58565b505050565b6001600160a01b03808316600081815260066020818152604080842080546005845282862054949093528787167fffffffffffffffffffffffff000000000000000000000000000000000000000084168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a05828483611a58565b50505050565b600080611a1884866121ba565b9050846001600160601b0316816001600160601b031610158390611a4f5760405162461bcd60e51b81526004016107fc9190611e59565b50949350505050565b816001600160a01b0316836001600160a01b031614158015611a8357506000816001600160601b0316115b15611964576001600160a01b03831615611b49576001600160a01b03831660009081526008602052604081205463ffffffff169081611ac3576000611b10565b6001600160a01b038516600090815260076020526040812090611ae7600185612110565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000611b37828560405180606001604052806027815260200161224f60279139611645565b9050611b4586848484611c02565b5050505b6001600160a01b03821615611964576001600160a01b03821660009081526008602052604081205463ffffffff169081611b84576000611bd1565b6001600160a01b038416600090815260076020526040812090611ba8600185612110565b63ffffffff16815260208101919091526040016000205464010000000090046001600160601b03165b90506000611bf8828560405180606001604052806026815260200161222960269139611a0b565b9050611124858484845b6000611c26436040518060600160405280603381526020016122a560339139611e35565b905060008463ffffffff16118015611c8057506001600160a01b038516600090815260076020526040812063ffffffff831691611c64600188612110565b63ffffffff908116825260208201929092526040016000205416145b15611d04576001600160a01b03851660009081526007602052604081208391611caa600188612110565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216640100000000027fffffffffffffffffffffffffffffffff000000000000000000000000ffffffff909216919091179055611de0565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600782528681208b8616825290915294909420925183549451909116640100000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909416911617919091179055611d948460016121e5565b6001600160a01b038616600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b60008163ffffffff84111561163d5760405162461bcd60e51b81526004016107fc91905b600060208083528351808285015260005b81811015611e8657858101830151858201604001528201611e6a565b81811115611e98576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611ec557600080fd5b919050565b60008060408385031215611edd57600080fd5b611ee683611eae565b946020939093013593505050565b600080600060608486031215611f0957600080fd5b611f1284611eae565b9250611f2060208501611eae565b9150604084013590509250925092565b600060208284031215611f4257600080fd5b610dc082611eae565b60008060408385031215611f5e57600080fd5b611f6783611eae565b915060208301356001600160601b0381168114611f8357600080fd5b809150509250929050565b803560ff81168114611ec557600080fd5b60008060008060008060c08789031215611fb857600080fd5b611fc187611eae565b95506020870135945060408701359350611fdd60608801611f8e565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561201257600080fd5b61201b88611eae565b965061202960208901611eae565b9550604088013594506060880135935061204560808901611f8e565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561207457600080fd5b61207d83611eae565b915061208b60208401611eae565b90509250929050565b600080604083850312156120a757600080fd5b6120b083611eae565b9150602083013563ffffffff81168114611f8357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561210b5761210b6120c9565b500190565b600063ffffffff8381169083168181101561212d5761212d6120c9565b039392505050565b600063ffffffff80841680612173577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b6000600019821415612193576121936120c9565b5060010190565b60006001600160601b038381169083168181101561212d5761212d6120c9565b60006001600160601b038083168185168083038211156121dc576121dc6120c9565b01949350505050565b600063ffffffff8083168185168083038211156121dc576121dc6120c956fe506c793a3a617070726f76653a20616d6f756e7420657863656564732039362062697473506c793a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f7773506c793a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773506c793a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f7773506c793a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473506c793a3a7065726d69743a20616d6f756e7420657863656564732039362062697473506c793a3a7472616e736665723a20616d6f756e7420657863656564732039362062697473506c793a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e6365506c793a6d696e74506c793a20746f74616c20737570706c79206f766572666c6f7773506c793a3a6d696e74506c793a206e6577206163636f756e742062616c616e6365206f766572666c6f7773506c793a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e6365a2646970667358221220e781ef015064e63f6c67ce9e0e6df5b55b82150fd3d9b9bd26142dc3fd2bbeb364736f6c634300080b0033000000000000000000000000c86ed20c7b8a95aebd102e60e686f363f70d4938