60806040523480156200001157600080fd5b5060405162002dda38038062002dda833981016040819052620000349162000342565b6040518060400160405280600e81526020016d414c50484120505245535449474560901b81525060405180604001604052806002815260200161041560f41b8152508160009081620000879190620004c7565b506001620000968282620004c7565b505050620000b3620000ad620000de60201b60201c565b620000e2565b620000be8262000134565b620000c98162000188565b620000d66101f4620001a4565b505062000593565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200013e620001c9565b6001600160a01b0381166200016657604051632969679960e11b815260040160405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b62000192620001c9565b600d620001a08282620004c7565b5050565b620001ae620001c9565b600954620001c6906001600160a01b0316826200022b565b50565b6008546001600160a01b03163314620002295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6127106001600160601b03821611156200029b5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000220565b6001600160a01b038216620002f35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000220565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200035657600080fd5b82516001600160a01b03811681146200036e57600080fd5b602084810151919350906001600160401b03808211156200038e57600080fd5b818601915086601f830112620003a357600080fd5b815181811115620003b857620003b86200032c565b604051601f8201601f19908116603f01168101908382118183101715620003e357620003e36200032c565b816040528281528986848701011115620003fc57600080fd5b600093505b8284101562000420578484018601518185018701529285019262000401565b60008684830101528096505050505050509250929050565b600181811c908216806200044d57607f821691505b6020821081036200046e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004c257600081815260208120601f850160051c810160208610156200049d5750805b601f850160051c820191505b81811015620004be57828155600101620004a9565b5050505b505050565b81516001600160401b03811115620004e357620004e36200032c565b620004fb81620004f4845462000438565b8462000474565b602080601f8311600181146200053357600084156200051a5750858301515b600019600386901b1c1916600185901b178555620004be565b600085815260208120601f198616915b82811015620005645788860151825594840194600190910190840162000543565b5085821015620005835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61283780620005a36000396000f3fe6080604052600436106101b75760003560e01c80636605bfda116100ec578063b77a147b1161008a578063c87b56dd11610064578063c87b56dd146104f4578063e985e9c514610514578063f2fde38b1461056a578063f46eccc41461058a57600080fd5b8063b77a147b14610494578063b88d4fde146104a7578063c5f956af146104c757600080fd5b80637cb64759116100c65780637cb64759146104145780638da5cb5b1461043457806395d89b411461045f578063a22cb4651461047457600080fd5b80636605bfda146103bf57806370a08231146103df578063715018a6146103ff57600080fd5b80632a55205a116101595780633ccfd60b116101335780633ccfd60b1461034a57806342842e0e1461035f5780634af9345e1461037f5780636352211e1461039f57600080fd5b80632a55205a146102d25780632eb4a7ab1461031e57806332cb6b0c1461033457600080fd5b8063095ea7b311610195578063095ea7b31461025857806318160ddd1461027a578063232cadcc1461029d57806323b872dd146102b257600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461222e565b6105ba565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b506102066105da565b6040516101e891906122b9565b34801561021f57600080fd5b5061023361022e3660046122cc565b61066c565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e8565b34801561026457600080fd5b50610278610273366004612307565b6106a0565b005b34801561028657600080fd5b5061028f61085c565b6040519081526020016101e8565b3480156102a957600080fd5b5061027861086c565b3480156102be57600080fd5b506102786102cd366004612333565b6108db565b3480156102de57600080fd5b506102f26102ed366004612374565b61097c565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101e8565b34801561032a57600080fd5b5061028f600a5481565b34801561034057600080fd5b5061028f6101f481565b34801561035657600080fd5b50610278610a73565b34801561036b57600080fd5b5061027861037a366004612333565b610aa0565b34801561038b57600080fd5b5061027861039a366004612396565b610abb565b3480156103ab57600080fd5b506102336103ba3660046122cc565b610ae9565b3480156103cb57600080fd5b506102786103da3660046123c4565b610b75565b3480156103eb57600080fd5b5061028f6103fa3660046123c4565b610c11565b34801561040b57600080fd5b50610278610cdf565b34801561042057600080fd5b5061027861042f3660046122cc565b610cf1565b34801561044057600080fd5b5060085473ffffffffffffffffffffffffffffffffffffffff16610233565b34801561046b57600080fd5b50610206610cfe565b34801561048057600080fd5b5061027861048f3660046123e1565b610d0d565b6102786104a236600461241f565b610d1c565b3480156104b357600080fd5b506102786104c23660046124c3565b610eca565b3480156104d357600080fd5b506009546102339073ffffffffffffffffffffffffffffffffffffffff1681565b34801561050057600080fd5b5061020661050f3660046122cc565b610f6c565b34801561052057600080fd5b506101dc61052f3660046125c1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561057657600080fd5b506102786105853660046123c4565b610fd3565b34801561059657600080fd5b506101dc6105a53660046123c4565b600b6020526000908152604090205460ff1681565b60006105c582611087565b806105d457506105d482611087565b92915050565b6060600080546105e9906125ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610615906125ef565b80156106625780601f1061063757610100808354040283529160200191610662565b820191906000526020600020905b81548152906001019060200180831161064557829003601f168201915b5050505050905090565b6000610677826110dd565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006106ab82610ae9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806107c1575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b61084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610764565b6108578383611168565b505050565b6000610867600c5490565b905090565b610874611208565b336000610880600c5490565b90506000610890826101f4612671565b905060005b818110156108d5576108ab600c80546001019055565b60006108b6600c5490565b90506108c28582611289565b50806108cd81612684565b915050610895565b50505050565b6108e533826112a3565b610971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610764565b610857838383611363565b600082815260076020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16928201929092528291610a3757506040805180820190915260065473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b602081015160009061271090610a5b906bffffffffffffffffffffffff16876126bc565b610a659190612702565b915196919550909350505050565b610a7b611208565b600954610a9e9073ffffffffffffffffffffffffffffffffffffffff16476115ca565b565b61085783838360405180602001604052806000815250610eca565b610ac3611208565b600954610ae69073ffffffffffffffffffffffffffffffffffffffff1682611724565b50565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610764565b610b7d611208565b73ffffffffffffffffffffffffffffffffffffffff8116610bca576040517f52d2cf3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216610cb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610764565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b610ce7611208565b610a9e600061189d565b610cf9611208565b600a55565b6060600180546105e9906125ef565b610d18338383611914565b5050565b336000610d28600c5490565b90506101f48110610d65576040517fe51add9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606084901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020808301919091528251601481840301815260349092019092528051910120610dbb908585611a41565b1515600003610df5576040517e27b15500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff161515600103610e59576040517f3ead0e1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610eb5600c80546001019055565b60018101610ec38382611289565b5050505050565b610ed433836112a3565b610f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610764565b6108d584848484611a51565b6060610f77826110dd565b6000610f81611af4565b90506000815111610fa15760405180602001604052806000815250610fcc565b80610fab84611b03565b604051602001610fbc929190612716565b6040516020818303038152906040525b9392505050565b610fdb611208565b73ffffffffffffffffffffffffffffffffffffffff811661107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610764565b610ae68161189d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806105d457506105d482611c38565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16610ae6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610764565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906111c282610ae9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60085473ffffffffffffffffffffffffffffffffffffffff163314610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610764565b610d18828260405180602001604052806000815250611d1b565b6000806112af83610ae9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061131d575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b8061135b57508373ffffffffffffffffffffffffffffffffffffffff166113438461066c565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661138382610ae9565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610764565b73ffffffffffffffffffffffffffffffffffffffff82166114c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610764565b6114d3600082611168565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611509908490612671565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611544908490612745565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80471015611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610764565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461168e576040519150601f19603f3d011682016040523d82523d6000602084013e611693565b606091505b5050905080610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610764565b6127106bffffffffffffffffffffffff821611156117c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610764565b73ffffffffffffffffffffffffffffffffffffffff8216611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610764565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600655565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610764565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600061135b8383600a5487611dbe565b611a5c848484611363565b611a6884848484611dd6565b6108d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610764565b6060600d80546105e9906125ef565b606081600003611b4657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b705780611b5a81612684565b9150611b699050600a83612702565b9150611b4a565b60008167ffffffffffffffff811115611b8b57611b8b612494565b6040519080825280601f01601f191660200182016040528015611bb5576020820181803683370190505b5090505b841561135b57611bca600183612671565b9150611bd7600a86612758565b611be2906030612745565b60f81b818381518110611bf757611bf761276c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611c31600a86612702565b9450611bb9565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611ccb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105d457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d4565b611d258383611fc6565b611d326000848484611dd6565b610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610764565b600082611dcc868685612188565b1495945050505050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611fbe576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290611e4d90339089908890889060040161279b565b6020604051808303816000875af1925050508015611ea6575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ea3918101906127e4565b60015b611f73573d808015611ed4576040519150601f19603f3d011682016040523d82523d6000602084013e611ed9565b606091505b508051600003611f6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610764565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061135b565b50600161135b565b73ffffffffffffffffffffffffffffffffffffffff8216612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610764565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156120cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610764565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290612105908490612745565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b848110156121cb576121b7828787848181106121ab576121ab61276c565b905060200201356121d4565b9150806121c381612684565b91505061218d565b50949350505050565b60008183106121f0576000828152602084905260409020610fcc565b5060009182526020526040902090565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610ae657600080fd5b60006020828403121561224057600080fd5b8135610fcc81612200565b60005b8381101561226657818101518382015260200161224e565b50506000910152565b6000815180845261228781602086016020860161224b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610fcc602083018461226f565b6000602082840312156122de57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ae657600080fd5b6000806040838503121561231a57600080fd5b8235612325816122e5565b946020939093013593505050565b60008060006060848603121561234857600080fd5b8335612353816122e5565b92506020840135612363816122e5565b929592945050506040919091013590565b6000806040838503121561238757600080fd5b50508035926020909101359150565b6000602082840312156123a857600080fd5b81356bffffffffffffffffffffffff81168114610fcc57600080fd5b6000602082840312156123d657600080fd5b8135610fcc816122e5565b600080604083850312156123f457600080fd5b82356123ff816122e5565b91506020830135801515811461241457600080fd5b809150509250929050565b6000806020838503121561243257600080fd5b823567ffffffffffffffff8082111561244a57600080fd5b818501915085601f83011261245e57600080fd5b81358181111561246d57600080fd5b8660208260051b850101111561248257600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156124d957600080fd5b84356124e4816122e5565b935060208501356124f4816122e5565b925060408501359150606085013567ffffffffffffffff8082111561251857600080fd5b818701915087601f83011261252c57600080fd5b81358181111561253e5761253e612494565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561258457612584612494565b816040528281528a602084870101111561259d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156125d457600080fd5b82356125df816122e5565b91506020830135612414816122e5565b600181811c9082168061260357607f821691505b60208210810361263c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105d4576105d4612642565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036126b5576126b5612642565b5060010190565b80820281158282048414176105d4576105d4612642565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612711576127116126d3565b500490565b6000835161272881846020880161224b565b83519083019061273c81836020880161224b565b01949350505050565b808201808211156105d4576105d4612642565b600082612767576127676126d3565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526127da608083018461226f565b9695505050505050565b6000602082840312156127f657600080fd5b8151610fcc8161220056fea264697066735822122099751465ad9c20292078a108bf5471929c68b844c57a3eed3567289effaf25b864736f6c63430008110033000000000000000000000000459c5440e65dc8db5287eccf86080f7a66b0f17600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569656f336163636f6563717475706b687a676c6c616769636934373268347136747a6873336e70756f796d3374366b6d74347672652f0000000000000000000000000000000000000000000000000000000000