0x60e060405234801561001057600080fd5b50604051612ca1380380612ca183398101604081905261002f916101de565b600160005580516001600160a01b031660a052604051819081907f2211c44ab42f12a3442a54c6652c8674addb2129fc4ee747e1f8dcfcdce6fd49906100789033908490610301565b60405180910390a160208101516100a8906040808201519181902060009081528251602093840120909252902090565b6080525050604081015180516000916100c991810160209081019101610379565b6001600160a01b031660c0525061039d9050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715610115576101156100dd565b60405290565b6001600160a01b038116811461013057600080fd5b50565b60005b8381101561014e578181015183820152602001610136565b50506000910152565b600082601f83011261016857600080fd5b81516001600160401b0380821115610182576101826100dd565b604051601f8301601f19908116603f011681019082821181831017156101aa576101aa6100dd565b816040528381528660208588010111156101c357600080fd5b6101d4846020830160208901610133565b9695505050505050565b6000602082840312156101f057600080fd5b81516001600160401b038082111561020757600080fd5b908301906060828603121561021b57600080fd5b6102236100f3565b825161022e8161011b565b815260208301518281111561024257600080fd5b83016060818803121561025457600080fd5b61025c6100f3565b81516102678161011b565b815260208201516102778161011b565b602082015260408201518481111561028e57600080fd5b61029a89828501610157565b60408301525080602084015250506040830151828111156102ba57600080fd5b6102c687828601610157565b60408301525095945050505050565b600081518084526102ed816020860160208601610133565b601f01601f19169290920160200192915050565b600060018060a01b0380851683526040602084015280845116604084015260208401516060808501528181511660a08501528160208201511660c08501526040810151915050606060e084015261035c6101008401826102d5565b90506040840151603f198483030160808501526101d482826102d5565b60006020828403121561038b57600080fd5b81516103968161011b565b9392505050565b60805160a05160c0516128906104116000396000818160da015281816102b9015281816102fb015281816103540152610416015260008181610175015281816108c2015281816109040152818161094e01528181610a080152610c23015260008181610133015261045101526128906000f3fe6080604052600436106100655760003560e01c80637b40155e116100435780637b40155e146101215780638df8ee1114610163578063f89d86591461019757610065565b806301ffc9a714610073578063059bebe6146100a85780630f8cc55c146100c8575b34801561007157600080fd5b005b34801561007f57600080fd5b5061009361008e3660046119e1565b6101aa565b60405190151581526020015b60405180910390f35b3480156100b457600080fd5b506100716100c3366004611a4f565b61028f565b3480156100d457600080fd5b506100fc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161009f565b34801561012d57600080fd5b506101557f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161009f565b34801561016f57600080fd5b506100fc7f000000000000000000000000000000000000000000000000000000000000000081565b6100716101a5366004611af9565b610446565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f059bebe600000000000000000000000000000000000000000000000000000000148061023d57507fffffffff0000000000000000000000000000000000000000000000000000000082167ff89d865900000000000000000000000000000000000000000000000000000000145b8061028957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b61029d868686868686610c0b565b6102df73ffffffffffffffffffffffffffffffffffffffff87167f00000000000000000000000000000000000000000000000000000000000000006000610c84565b61034073ffffffffffffffffffffffffffffffffffffffff87167f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610c84565b600061034e82840184611c81565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632646478b89888a8930886040518763ffffffff1660e01b81526004016103b596959493929190611d24565b6020604051808303816000875af11580156103d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f89190611d7d565b905061043c73ffffffffffffffffffffffffffffffffffffffff89167f00000000000000000000000000000000000000000000000000000000000000006000610c84565b5050505050505050565b61044e610e84565b807f000000000000000000000000000000000000000000000000000000000000000061049b61047c83611d96565b6040808201519181902060009081528251602093840120909252902090565b146104d2576040517f4c30975700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006104e16040830183611e22565b90501115610714576000806104f96020840184611e87565b73ffffffffffffffffffffffffffffffffffffffff1663d6e3357a6105246040860160208701611e87565b6000808052306020526040902061053e6040880188611e22565b604080516000808252602082019092526105d7908261056d565b60608152602001906001900390816105585790505b5060408051600080825260208201909252906105d1565b6105be6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081525090565b8152602001906001900390816105845790505b50610ef7565b604080516000815260208101918290527fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b169091526106249695949392919060248101611f29565b600060405180830381865afa158015610641573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610687919081019061206e565b8051919350915015610711576106a36040840160208501611e87565b73ffffffffffffffffffffffffffffffffffffffff1663946aadc66000836040518363ffffffff1660e01b81526004016106de9291906120d2565b600060405180830381600087803b1580156106f857600080fd5b505af115801561070c573d6000803e3d6000fd5b505050505b50505b61072160608501856120eb565b905060000361075c576040517f9c95219f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061076b60608601866120eb565b600081811061077c5761077c612153565b905060200281019061078e9190612182565b61079890806121c0565b6107a69060408101906121f4565b6107b360608801886120eb565b60008181106107c4576107c4612153565b90506020028101906107d69190612182565b602001358181106107e9576107e9612153565b6107ff9260206060909202019081019150611e87565b9050600061081060608701876120eb565b600081811061082157610821612153565b90506020028101906108339190612182565b61083d90806121c0565b61084b9060608101906121f4565b61085860608901896120eb565b600081811061086957610869612153565b905060200281019061087b9190612182565b6040013581811061088e5761088e612153565b6108a49260206060909202019081019150611e87565b90506108e873ffffffffffffffffffffffffffffffffffffffff83167f00000000000000000000000000000000000000000000000000000000000000006000610c84565b61094973ffffffffffffffffffffffffffffffffffffffff83167f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610c84565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630997c4a0896040518263ffffffff1660e01b81526004016109a5919061255b565b60408051808303816000875af11580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e791906127dd565b9092509050610a2e73ffffffffffffffffffffffffffffffffffffffff85167f00000000000000000000000000000000000000000000000000000000000000006000610c84565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611d7d565b905087811015610b0a576040517f0c08b5bc00000000000000000000000000000000000000000000000000000000815260048101899052602481018290526044015b60405180910390fd5b8015610b3157610b3173ffffffffffffffffffffffffffffffffffffffff86163383611207565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015610b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc29190611d7d565b90508015610beb57610beb73ffffffffffffffffffffffffffffffffffffffff86163383611207565b610bf5334761125d565b50505050505050610c066001600055565b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c7c576040517f0bc3cde0000000000000000000000000000000000000000000000000000000008152336004820152602401610b01565b505050505050565b801580610d2457506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015610cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d229190611d7d565b155b610db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610b01565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c069084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113b7565b600260005403610ef0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b01565b6002600055565b60606000825167ffffffffffffffff811115610f1557610f15611b75565b604051908082528060200260200182016040528015610f3e578160200160208202803683370190505b509050600080845111610f52576000610f58565b83516001015b855160010101905060008167ffffffffffffffff811115610f7b57610f7b611b75565b604051908082528060200260200182016040528015610fae57816020015b6060815260200190600190039081610f995790505b5090506000610fd3604080516002815233602082015230818301526060810190915290565b828281518110610fe557610fe5612153565b602002602001018190525060005b875181101561104357818060010192505087818151811061101657611016612153565b602002602001015183838151811061103057611030612153565b6020908102919091010152600101610ff3565b508551156111fd5780806001019150508382828151811061106657611066612153565b602002602001018190525060005b86518110156111fb5761112587828151811061109257611092612153565b6020026020010151600001516111026110cf8a85815181106110b6576110b6612153565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b89848151811061111457611114612153565b6020026020010151604001516114c6565b61115e576040517f52bf984800000000000000000000000000000000000000000000000000000000815260048101829052602401610b01565b86818151811061117057611170612153565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff168582815181106111a4576111a4612153565b60200260200101818152505081806001019250508681815181106111ca576111ca612153565b6020026020010151602001518383815181106111e8576111e8612153565b6020908102919091010152600101611074565b505b5095945050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610c069084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610e02565b804710156112c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b01565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b5050905080610c06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b01565b6000611419826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115419092919063ffffffff16565b905080516000148061143a57508080602001905181019061143a9190612801565b610c06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b01565b60008060006114d58585611558565b909250905060008160048111156114ee576114ee612823565b14801561152657508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611537575061153786868661159d565b9695505050505050565b606061155084846000856116fa565b949350505050565b600080825160410361158e5760208301516040840151606085015160001a61158287828585611813565b94509450505050611596565b506000905060025b9250929050565b60008060008573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016115d4929190612852565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161165d919061286b565b600060405180830381855afa9150503d8060008114611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b50915091508180156116b157506020815110155b8015611537575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906116ef9083016020908101908401611d7d565b149695505050505050565b60608247101561178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b01565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516117b5919061286b565b60006040518083038185875af1925050503d80600081146117f2576040519150601f19603f3d011682016040523d82523d6000602084013e6117f7565b606091505b509150915061180887838387611902565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561184a57506000905060036118f9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561189e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166118f2576000600192509250506118f9565b9150600090505b94509492505050565b606083156119985782516000036119915773ffffffffffffffffffffffffffffffffffffffff85163b611991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b01565b5081611550565b61155083838151156119ad5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b01919061287d565b6000602082840312156119f357600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611a2357600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611a4c57600080fd5b50565b60008060008060008060a08789031215611a6857600080fd5b8635611a7381611a2a565b95506020870135611a8381611a2a565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611aae57600080fd5b818901915089601f830112611ac257600080fd5b813581811115611ad157600080fd5b8a6020828501011115611ae357600080fd5b6020830194508093505050509295509295509295565b600080600060608486031215611b0e57600080fd5b833567ffffffffffffffff80821115611b2657600080fd5b9085019060a08288031215611b3a57600080fd5b9093506020850135925060408501359080821115611b5757600080fd5b50840160608187031215611b6a57600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611beb57611beb611b75565b604052919050565b600082601f830112611c0457600080fd5b813567ffffffffffffffff811115611c1e57611c1e611b75565b611c4f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611ba4565b818152846020838601011115611c6457600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611c9357600080fd5b813567ffffffffffffffff811115611caa57600080fd5b61155084828501611bf3565b60005b83811015611cd1578181015183820152602001611cb9565b50506000910152565b60008151808452611cf2816020860160208601611cb6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff8089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611d7160c0830184611cda565b98975050505050505050565b600060208284031215611d8f57600080fd5b5051919050565b600060608236031215611da857600080fd5b6040516060810167ffffffffffffffff8282108183111715611dcc57611dcc611b75565b8160405284359150611ddd82611a2a565b908252602084013590611def82611a2a565b8160208401526040850135915080821115611e0957600080fd5b50611e1636828601611bf3565b60408301525092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e5757600080fd5b83018035915067ffffffffffffffff821115611e7257600080fd5b60200191503681900382131561159657600080fd5b600060208284031215611e9957600080fd5b8135611a2381611a2a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60008151808452602080850194506020840160005b83811015611f1e57815187529582019590820190600101611f02565b509495945050505050565b73ffffffffffffffffffffffffffffffffffffffff8816815260006020888184015260c06040840152611f6060c08401888a611ea4565b86606085015283810360808501528086518083528383019150838160051b84010184890160005b83811015611fd3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552611fc1838351611eed565b94870194925090860190600101611f87565b505086810360a0880152611fe78189611eed565b9e9d5050505050505050505050505050565b600082601f83011261200a57600080fd5b8151602067ffffffffffffffff82111561202657612026611b75565b8160051b612035828201611ba4565b928352848101820192828101908785111561204f57600080fd5b83870192505b8483101561180857825182529183019190830190612055565b6000806040838503121561208157600080fd5b825167ffffffffffffffff8082111561209957600080fd5b6120a586838701611ff9565b935060208501519150808211156120bb57600080fd5b506120c885828601611ff9565b9150509250929050565b8281526040602082015260006115506040830184611eed565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261212057600080fd5b83018035915067ffffffffffffffff82111561213b57600080fd5b6020019150600581901b360382131561159657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126121b657600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126121b657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261222957600080fd5b83018035915067ffffffffffffffff82111561224457600080fd5b602001915060608102360382131561159657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261229057600080fd5b830160208101925035905067ffffffffffffffff8111156122b057600080fd5b8060051b360382131561159657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126122f657600080fd5b90910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261233457600080fd5b830160208101925035905067ffffffffffffffff81111561235457600080fd5b80360382131561159657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261239857600080fd5b830160208101925035905067ffffffffffffffff8111156123b857600080fd5b60608102360382131561159657600080fd5b818352600060208085019450826000805b8681101561243a5782356123ee81611a2a565b73ffffffffffffffffffffffffffffffffffffffff1688528284013560ff8116808214612419578384fd5b898601525060408381013590890152606097880197909201916001016123db565b50959695505050505050565b818352602080840193600091600585811b830182018585805b8981101561254c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878503018b52612498838a6122c2565b606081356124a581611a2a565b73ffffffffffffffffffffffffffffffffffffffff1686526124c98289018361225b565b828a8901528083890152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612503578586fd5b881b80828985013787019050604061251d848201856122ff565b94508389840301828a01526125358484018683611ea4565b9f8b019f985050509488019450505060010161245f565b50919998505050505050505050565b6000602080835260c08301843582850152604082860135818601526060818701358187015261258c8188018861225b565b60a060808901528481865260e08901905060e08260051b8a010195508260005b83811015612792577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff208b890301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8186360301811261260d57600080fd5b85018035368290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101811261264257600080fd5b60808a528101803561265381611a2a565b73ffffffffffffffffffffffffffffffffffffffff80821660808d015261267c8d8401846122c2565b915060a0808d0152813561268f81611a2a565b81166101208d0152818d01356126a481611a2a565b166101408c01526126b7818b01826122ff565b9150896101608d01526126cf6101808d018383611ea4565b9150506126de8a830183612363565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808e85030160c08f01526127148483856123ca565b93506127228c860186612363565b93509150808e85030160e08f01525061273c8383836123ca565b9250505060808201356101008c01528b8301358c8c0152898301358a8c01526127678984018461225b565b935091508a8103898c015261277d818484612446565b9a5050509289019250908801906001016125ac565b505050505050506127a660808601866122ff565b92507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08583030160a0860152611537828483611ea4565b600080604083850312156127f057600080fd5b505080516020909101519092909150565b60006020828403121561281357600080fd5b81518015158114611a2357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8281526040602082015260006115506040830184611cda565b600082516121b6818460208701611cb6565b602081526000611a236020830184611cda560000000000000000000000000000000000000000000000000000000000000020000000000000000000000000a2f56f8f74b7d04d61f281be6576b6155581dcba000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000009b0d254bd858208074de3d2daf5af11b3d2f377f