0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063b88d4fde11610066578063b88d4fde146102bd578063c87b56dd146102d9578063d547cfb714610309578063e985e9c51461032757610100565b806370a0823114610223578063755edd171461025357806395d89b4114610283578063a22cb465146102a157610100565b806323b872dd116100d357806323b872dd1461019f57806330176e13146101bb57806342842e0e146101d75780636352211e146101f357610100565b806301ffc9a71461010557806306fdde0314610135578063081812fc14610153578063095ea7b314610183575b600080fd5b61011f600480360381019061011a9190611992565b610357565b60405161012c91906119da565b60405180910390f35b61013d610439565b60405161014a9190611a85565b60405180910390f35b61016d60048036038101906101689190611add565b6104cb565b60405161017a9190611b4b565b60405180910390f35b61019d60048036038101906101989190611b92565b610511565b005b6101b960048036038101906101b49190611bd2565b610628565b005b6101d560048036038101906101d09190611d5a565b610688565b005b6101f160048036038101906101ec9190611bd2565b61069b565b005b61020d60048036038101906102089190611add565b6106bb565b60405161021a9190611b4b565b60405180910390f35b61023d60048036038101906102389190611da3565b610741565b60405161024a9190611ddf565b60405180910390f35b61026d60048036038101906102689190611da3565b6107f8565b60405161027a9190611ddf565b60405180910390f35b61028b610825565b6040516102989190611a85565b60405180910390f35b6102bb60048036038101906102b69190611e26565b6108b7565b005b6102d760048036038101906102d29190611f07565b6108cd565b005b6102f360048036038101906102ee9190611add565b61092f565b6040516103009190611a85565b60405180910390f35b610311610997565b60405161031e9190611a85565b60405180910390f35b610341600480360381019061033c9190611f8a565b610a25565b60405161034e91906119da565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610432575061043182610ab9565b5b9050919050565b60606000805461044890611ff9565b80601f016020809104026020016040519081016040528092919081815260200182805461047490611ff9565b80156104c15780601f10610496576101008083540402835291602001916104c1565b820191906000526020600020905b8154815290600101906020018083116104a457829003601f168201915b5050505050905090565b60006104d682610b23565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061051c826106bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361058c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105839061209c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105ab610b6e565b73ffffffffffffffffffffffffffffffffffffffff1614806105da57506105d9816105d4610b6e565b610a25565b5b610619576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106109061212e565b60405180910390fd5b6106238383610b76565b505050565b610639610633610b6e565b82610c2f565b610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f906121c0565b60405180910390fd5b610683838383610cc4565b505050565b8060079081610697919061238c565b5050565b6106b6838383604051806020016040528060008152506108cd565b505050565b6000806106c783610fbd565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072f906124aa565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a89061253c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006108046006610ffa565b60006108106006611010565b905061081c838261101e565b80915050919050565b60606001805461083490611ff9565b80601f016020809104026020016040519081016040528092919081815260200182805461086090611ff9565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b5050505050905090565b6108c96108c2610b6e565b838361103c565b5050565b6108de6108d8610b6e565b83610c2f565b61091d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610914906121c0565b60405180910390fd5b610929848484846111a8565b50505050565b606061093a82610b23565b6000610944611204565b90506000815111610964576040518060200160405280600081525061098f565b8061096e84611296565b60405160200161097f929190612598565b6040516020818303038152906040525b915050919050565b600780546109a490611ff9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d090611ff9565b8015610a1d5780601f106109f257610100808354040283529160200191610a1d565b820191906000526020600020905b815481529060010190602001808311610a0057829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610b2c81611364565b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b62906124aa565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610be9836106bb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c3b836106bb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c7d5750610c7c8185610a25565b5b80610cbb57508373ffffffffffffffffffffffffffffffffffffffff16610ca3846104cb565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610ce4826106bb565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d319061262e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906126c0565b60405180910390fd5b610db683838360016113a5565b8273ffffffffffffffffffffffffffffffffffffffff16610dd6826106bb565b73ffffffffffffffffffffffffffffffffffffffff1614610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e239061262e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fb883838360016113ab565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6110388282604051806020016040528060008152506113b1565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a19061272c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161119b91906119da565b60405180910390a3505050565b6111b3848484610cc4565b6111bf8484848461140c565b6111fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f5906127be565b60405180910390fd5b50505050565b60606007805461121390611ff9565b80601f016020809104026020016040519081016040528092919081815260200182805461123f90611ff9565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b5050505050905090565b6060600060016112a584611593565b01905060008167ffffffffffffffff8111156112c4576112c3611c2f565b5b6040519080825280601f01601f1916602001820160405280156112f65781602001600182028036833780820191505090505b509050600082602001820190505b600115611359578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161134d5761134c6127de565b5b04945060008503611304575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661138683610fbd565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6113bb83836116e6565b6113c8600084848461140c565b611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe906127be565b60405180910390fd5b505050565b600061142d8473ffffffffffffffffffffffffffffffffffffffff16611903565b15611586578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611456610b6e565b8786866040518563ffffffff1660e01b81526004016114789493929190612862565b6020604051808303816000875af19250505080156114b457506040513d601f19601f820116820180604052508101906114b191906128c3565b60015b611536573d80600081146114e4576040519150601f19603f3d011682016040523d82523d6000602084013e6114e9565b606091505b50600081510361152e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611525906127be565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061158b565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106115f1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816115e7576115e66127de565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061162e576d04ee2d6d415b85acef81000000008381611624576116236127de565b5b0492506020810190505b662386f26fc10000831061165d57662386f26fc100008381611653576116526127de565b5b0492506010810190505b6305f5e1008310611686576305f5e100838161167c5761167b6127de565b5b0492506008810190505b61271083106116ab5761271083816116a1576116a06127de565b5b0492506004810190505b606483106116ce57606483816116c4576116c36127de565b5b0492506002810190505b600a83106116dd576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c9061293c565b60405180910390fd5b61175e81611364565b1561179e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611795906129a8565b60405180910390fd5b6117ac6000838360016113a5565b6117b581611364565b156117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec906129a8565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118ff6000838360016113ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61196f8161193a565b811461197a57600080fd5b50565b60008135905061198c81611966565b92915050565b6000602082840312156119a8576119a7611930565b5b60006119b68482850161197d565b91505092915050565b60008115159050919050565b6119d4816119bf565b82525050565b60006020820190506119ef60008301846119cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611a2f578082015181840152602081019050611a14565b60008484015250505050565b6000601f19601f8301169050919050565b6000611a57826119f5565b611a618185611a00565b9350611a71818560208601611a11565b611a7a81611a3b565b840191505092915050565b60006020820190508181036000830152611a9f8184611a4c565b905092915050565b6000819050919050565b611aba81611aa7565b8114611ac557600080fd5b50565b600081359050611ad781611ab1565b92915050565b600060208284031215611af357611af2611930565b5b6000611b0184828501611ac8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b3582611b0a565b9050919050565b611b4581611b2a565b82525050565b6000602082019050611b606000830184611b3c565b92915050565b611b6f81611b2a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b60008060408385031215611ba957611ba8611930565b5b6000611bb785828601611b7d565b9250506020611bc885828601611ac8565b9150509250929050565b600080600060608486031215611beb57611bea611930565b5b6000611bf986828701611b7d565b9350506020611c0a86828701611b7d565b9250506040611c1b86828701611ac8565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c6782611a3b565b810181811067ffffffffffffffff82111715611c8657611c85611c2f565b5b80604052505050565b6000611c99611926565b9050611ca58282611c5e565b919050565b600067ffffffffffffffff821115611cc557611cc4611c2f565b5b611cce82611a3b565b9050602081019050919050565b82818337600083830152505050565b6000611cfd611cf884611caa565b611c8f565b905082815260208101848484011115611d1957611d18611c2a565b5b611d24848285611cdb565b509392505050565b600082601f830112611d4157611d40611c25565b5b8135611d51848260208601611cea565b91505092915050565b600060208284031215611d7057611d6f611930565b5b600082013567ffffffffffffffff811115611d8e57611d8d611935565b5b611d9a84828501611d2c565b91505092915050565b600060208284031215611db957611db8611930565b5b6000611dc784828501611b7d565b91505092915050565b611dd981611aa7565b82525050565b6000602082019050611df46000830184611dd0565b92915050565b611e03816119bf565b8114611e0e57600080fd5b50565b600081359050611e2081611dfa565b92915050565b60008060408385031215611e3d57611e3c611930565b5b6000611e4b85828601611b7d565b9250506020611e5c85828601611e11565b9150509250929050565b600067ffffffffffffffff821115611e8157611e80611c2f565b5b611e8a82611a3b565b9050602081019050919050565b6000611eaa611ea584611e66565b611c8f565b905082815260208101848484011115611ec657611ec5611c2a565b5b611ed1848285611cdb565b509392505050565b600082601f830112611eee57611eed611c25565b5b8135611efe848260208601611e97565b91505092915050565b60008060008060808587031215611f2157611f20611930565b5b6000611f2f87828801611b7d565b9450506020611f4087828801611b7d565b9350506040611f5187828801611ac8565b925050606085013567ffffffffffffffff811115611f7257611f71611935565b5b611f7e87828801611ed9565b91505092959194509250565b60008060408385031215611fa157611fa0611930565b5b6000611faf85828601611b7d565b9250506020611fc085828601611b7d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061201157607f821691505b60208210810361202457612023611fca565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612086602183611a00565b91506120918261202a565b604082019050919050565b600060208201905081810360008301526120b581612079565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612118603d83611a00565b9150612123826120bc565b604082019050919050565b600060208201905081810360008301526121478161210b565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006121aa602d83611a00565b91506121b58261214e565b604082019050919050565b600060208201905081810360008301526121d98161219d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612205565b61224c8683612205565b95508019841693508086168417925050509392505050565b6000819050919050565b600061228961228461227f84611aa7565b612264565b611aa7565b9050919050565b6000819050919050565b6122a38361226e565b6122b76122af82612290565b848454612212565b825550505050565b600090565b6122cc6122bf565b6122d781848461229a565b505050565b5b818110156122fb576122f06000826122c4565b6001810190506122dd565b5050565b601f82111561234057612311816121e0565b61231a846121f5565b81016020851015612329578190505b61233d612335856121f5565b8301826122dc565b50505b505050565b600082821c905092915050565b600061236360001984600802612345565b1980831691505092915050565b600061237c8383612352565b9150826002028217905092915050565b612395826119f5565b67ffffffffffffffff8111156123ae576123ad611c2f565b5b6123b88254611ff9565b6123c38282856122ff565b600060209050601f8311600181146123f657600084156123e4578287015190505b6123ee8582612370565b865550612456565b601f198416612404866121e0565b60005b8281101561242c57848901518255600182019150602085019450602081019050612407565b868310156124495784890151612445601f891682612352565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612494601883611a00565b915061249f8261245e565b602082019050919050565b600060208201905081810360008301526124c381612487565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612526602983611a00565b9150612531826124ca565b604082019050919050565b6000602082019050818103600083015261255581612519565b9050919050565b600081905092915050565b6000612572826119f5565b61257c818561255c565b935061258c818560208601611a11565b80840191505092915050565b60006125a48285612567565b91506125b08284612567565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612618602583611a00565b9150612623826125bc565b604082019050919050565b600060208201905081810360008301526126478161260b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006126aa602483611a00565b91506126b58261264e565b604082019050919050565b600060208201905081810360008301526126d98161269d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612716601983611a00565b9150612721826126e0565b602082019050919050565b6000602082019050818103600083015261274581612709565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006127a8603283611a00565b91506127b38261274c565b604082019050919050565b600060208201905081810360008301526127d78161279b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006128348261280d565b61283e8185612818565b935061284e818560208601611a11565b61285781611a3b565b840191505092915050565b60006080820190506128776000830187611b3c565b6128846020830186611b3c565b6128916040830185611dd0565b81810360608301526128a38184612829565b905095945050505050565b6000815190506128bd81611966565b92915050565b6000602082840312156128d9576128d8611930565b5b60006128e7848285016128ae565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612926602083611a00565b9150612931826128f0565b602082019050919050565b6000602082019050818103600083015261295581612919565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612992601c83611a00565b915061299d8261295c565b602082019050919050565b600060208201905081810360008301526129c181612985565b905091905056fea26469706673582212207df34321cd18e4bf4d0480ac8fa8ae32b359f8431e2eb43dcb6ee6fbe05776c464736f6c63430008120033