0x608060405234801561001057600080fd5b50612be3806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063aef2f165116100de578063d149c0d711610097578063f50b2efe11610071578063f50b2efe146104bf578063f90c4924146104db578063fba03158146104f9578063fd1f4bef146105175761018e565b8063d149c0d714610441578063d22158fa1461045f578063ecc1f0831461048f5761018e565b8063aef2f1651461037f578063b0f106b01461039e578063b1fcc5cf146103bd578063b24ebfcc146103d9578063bb1f29b714610409578063c14c9204146104255761018e565b80636dafaf6a1161014b57806395262d9f1161012557806395262d9f146102e7578063971b9c0314610317578063a8b940e614610347578063ada11457146103635761018e565b80636dafaf6a1461028f5780637a02bdf1146102bf5780638129fc1c146102dd5761018e565b80631b2758ee146101935780631de7c788146101b15780633ce142f5146101cf578063429989f0146101ff57806344e029821461022f5780636668316a1461025f575b600080fd5b61019b610535565b6040516101a89190612121565b60405180910390f35b6101b961055d565b6040516101c69190612155565b60405180910390f35b6101e960048036038101906101e491906121e2565b610585565b6040516101f6919061222b565b60405180910390f35b610219600480360381019061021491906121e2565b610597565b604051610226919061222b565b60405180910390f35b61024960048036038101906102449190612272565b610c1b565b6040516102569190612121565b60405180910390f35b61027960048036038101906102749190612272565b610c47565b6040516102869190612121565b60405180910390f35b6102a960048036038101906102a49190612272565b610c8d565b6040516102b69190612121565b60405180910390f35b6102c7610ce8565b6040516102d49190612121565b60405180910390f35b6102e5610d0f565b005b61030160048036038101906102fc91906121e2565b610e45565b60405161030e919061222b565b60405180910390f35b610331600480360381019061032c91906123f8565b610e57565b60405161033e91906124ff565b60405180910390f35b610361600480360381019061035c91906121e2565b610edd565b005b61037d6004803603810190610378919061254d565b610ee0565b005b610387610ef5565b60405161039592919061257a565b60405180910390f35b6103a6610f06565b6040516103b49291906125ce565b60405180910390f35b6103d760048036038101906103d291906125f7565b610f46565b005b6103f360048036038101906103ee91906126fa565b610fe8565b6040516104009190612121565b60405180910390f35b610423600480360381019061041e919061254d565b610ffa565b005b61043f600480360381019061043a919061254d565b6110d3565b005b61044961111e565b6040516104569190612121565b60405180910390f35b610479600480360381019061047491906121e2565b611127565b604051610486919061222b565b60405180910390f35b6104a960048036038101906104a491906123f8565b6111bd565b6040516104b691906124ff565b60405180910390f35b6104d960048036038101906104d4919061254d565b611272565b005b6104e36112fe565b6040516104f0919061222b565b60405180910390f35b610501611307565b60405161050e9190612801565b60405180910390f35b61051f611380565b60405161052c9190612121565b60405180910390f35b600061053f610f06565b9050806fffffffffffffffffffffffffffffffff1690508091505090565b60007f4254430000000000000000000000000000000000000000000000000000000000905090565b600061059082610e45565b9050919050565b600073f39fd6e51aad88f6f4ce6ab8827279cfffb9226673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105e95760009050610c16565b7370997970c51812dc3a010c7d01b50e0d17dc79c873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106395760019050610c16565b733c44cdddb6a900fa2b585dd299e03d12fa4293bc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106895760029050610c16565b7390f79bf6eb2c4f870365e785982e1f101e93b90673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106d95760039050610c16565b7315d34aaf54267db7d7c367839aaf71a00a2c6a6573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107295760049050610c16565b739965507d1a55bcc2695c58ba16fb37d819b0a4dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107795760059050610c16565b73976ea74026e726554db657fa54763abd0c3a0aa973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107c95760069050610c16565b7314dc79964da2c08b23698b3d3cc7ca32193d995573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108195760079050610c16565b7323618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108695760089050610c16565b73a0ee7a142d267c1f36714e4a8f75612f20a7972073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108b95760099050610c16565b73bcd4042de499d14e55001ccbb24a551f3b95409673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361090957600a9050610c16565b7371be63f3384f5fb98995898a86b02fb2426c578873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361095957600b9050610c16565b73fabb0ac9d68b0b445fb7357272ff202c5651694a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109a957600c9050610c16565b731cbd3b2770909d4e10f157cabc84c7264073c9ec73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109f957600d9050610c16565b73df3e18d64bc6a983f673ab319ccae4f1a57c709773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a4957600e9050610c16565b73cd3b766ccdd6ae721141f452c550ca635964ce7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a9957600f9050610c16565b732546bcd3c84621e976d8185a91a922ae77ecec3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ae95760109050610c16565b73bda5747bfd65f08deb54cb465eb87d40e51b197e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b395760119050610c16565b73dd2fd4581271e230360230f9337d5c0430bf44c073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b895760129050610c16565b738626f6940e2eb28930efb4cef49b2d1f2c9c119973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bd95760139050610c16565b816040517fec459bc0000000000000000000000000000000000000000000000000000000008152600401610c0d9190612832565b60405180910390fd5b919050565b6000610c2682610c8d565b506000610c3283610c47565b9050610c3e8382610f46565b80915050919050565b6000807f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa5490508073ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000610c9761055d565b8203610ca65760009050610ce3565b816040517f93829403000000000000000000000000000000000000000000000000000000008152600401610cda9190612155565b60405180910390fd5b919050565b6000610cf2610f06565b816fffffffffffffffffffffffffffffffff169150508091505090565b60008060019054906101000a900460ff16159050808015610d405750600160008054906101000a900460ff1660ff16105b80610d6d5750610d4f306113a9565b158015610d6c5750600160008054906101000a900460ff1660ff16145b5b610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da3906128d0565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610de9576001600060016101000a81548160ff0219169083151502179055505b8015610e425760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610e399190612935565b60405180910390a15b50565b6000610e5082611127565b9050919050565b60606000610e64836111bd565b905060005b8351811015610ed3576000848281518110610e8757610e86612950565b5b60200260200101519050610e9a81610c8d565b50610ebf81848481518110610eb257610eb1612950565b5b6020026020010151610f46565b508080610ecb906129ae565b915050610e69565b5080915050919050565b50565b610ee9816113cc565b610ef281610ffa565b50565b6000806104b091506104b090509091565b60008060007f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa54905060d081901c925060d0603082901b901c9150509091565b60008103610f8b57816040517f0565ce2a000000000000000000000000000000000000000000000000000000008152600401610f829190612155565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811115610fe457806040517f339fa517000000000000000000000000000000000000000000000000000000008152600401610fdb9190612121565b60405180910390fd5b5050565b6000610ff382611422565b9050919050565b60006103e88261100a9190612a25565b9050600080611017610ef5565b915091508242101561107a578142846110309190612a56565b11156110755782426040517fb6b0916d00000000000000000000000000000000000000000000000000000000815260040161106c92919061257a565b60405180910390fd5b6110cd565b8083426110879190612a56565b11156110cc5782426040517f0321d0b50000000000000000000000000000000000000000000000000000000081526004016110c392919061257a565b60405180910390fd5b5b50505050565b6110dc33610edd565b6110e4611434565b6110ed81610ee0565b6110f6816114aa565b6000611100611307565b9050600061110d82611521565b90506111198282611533565b505050565b60006003905090565b6000738626f6940e2eb28930efb4cef49b2d1f2c9c119973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ad57816040517fec459bc00000000000000000000000000000000000000000000000000000000081526004016111a49190612832565b60405180910390fd5b6111b682610597565b9050919050565b6060815167ffffffffffffffff8111156111da576111d96122b5565b5b6040519080825280602002602001820160405280156112085781602001602082028036833780820191505090505b50905060005b825181101561126c5761123a83828151811061122d5761122c612950565b5b6020026020010151610c47565b82828151811061124d5761124c612950565b5b6020026020010181815250508080611264906129ae565b91505061120e565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603156112fb5760006112b1610ce8565b90508082146112f95780826040517f6bc11ec50000000000000000000000000000000000000000000000000000000081526004016112f092919061257a565b60405180910390fd5b505b50565b60006002905090565b6060600167ffffffffffffffff811115611324576113236122b5565b5b6040519080825280602002602001820160405280156113525781602001602082028036833780820191505090505b50905061135d61055d565b8160008151811061137157611370612950565b5b60200260200101818152505090565b60007f3d01e4d77237ea0f771f1786da4d4ff757fcba6a92933aa53b1dcef2d6bd6fe254905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006113d6610ce8565b905080821161141e5781816040517fef05deba00000000000000000000000000000000000000000000000000000000815260040161141592919061257a565b60405180910390fd5b5050565b600061142d8261159b565b9050919050565b60004290506000611443610535565b9050600061144f61111e565b9050808261145d9190612a8a565b8310156114a5578282826040517f83b3f5c400000000000000000000000000000000000000000000000000000000815260040161149c93929190612abe565b60405180910390fd5b505050565b600060d082901b905060a042901b811790507f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa5473ffffffffffffffffffffffffffffffffffffffff811690508181177f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa55505050565b606061152c8261168f565b9050919050565b60005b825181101561159657600083828151811061155457611553612950565b5b602002602001015190506115828184848151811061157557611574612950565b5b602002602001015161189e565b50808061158e906129ae565b915050611536565b505050565b6000808251036115d7576040517f9e198af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115e08261191c565b6000600283516115f09190612a25565b90506000600284516116029190612af5565b0361166b5760006116538460018461161a9190612a56565b8151811061162b5761162a612950565b5b602002602001015185848151811061164657611645612950565b5b602002602001015161196f565b90506002816116629190612a25565b9250505061168a565b82818151811061167e5761167d612950565b5b60200260200101519150505b919050565b60606000825167ffffffffffffffff8111156116ae576116ad6122b5565b5b6040519080825280602002602001820160405280156116dc5781602001602082028036833780820191505090505b5090506000835167ffffffffffffffff8111156116fc576116fb6122b5565b5b60405190808252806020026020018201604052801561172a5781602001602082028036833780820191505090505b5090506000845167ffffffffffffffff81111561174a576117496122b5565b5b60405190808252806020026020018201604052801561177d57816020015b60608152602001906001900390816117685790505b50905060005b8551811015611810576117946112fe565b60ff1667ffffffffffffffff8111156117b0576117af6122b5565b5b6040519080825280602002602001820160405280156117de5781602001602082028036833780820191505090505b508282815181106117f2576117f1612950565b5b60200260200101819052508080611808906129ae565b915050611783565b50600061181b611985565b9050600061182882611a96565b61ffff16905060028261183b9190612a8a565b91506000604051905060005b8281101561188657600061185e8a89898989611af2565b9050808561186c9190612a8a565b94508260405250808061187e906129ae565b915050611847565b506118918487611dea565b9650505050505050919050565b6118a88282610f46565b7f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690508181179050807f632f4a585e47073d66129e9ebce395c9b39d8a1fc5b15d4d7df2e462fb1fccfa55505050565b805160208201602082028101815b8181101561196857825b8181101561195c57815181518082101561194f578084528183525b5050602081019050611934565b5060208101905061192a565b5050505050565b6000818361197d9190612a8a565b905092915050565b60008060203603356602ed57011e000081166602ed57011e000014915050806119da576040517fe7764c9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008036905060291115611a1a576040517f5796f78a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602936033590506000600960038362ffffff16611a379190612a8a565b611a419190612a8a565b90506000369050600282611a559190612a8a565b1115611a8d576040517fc30a7bd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80935050505090565b600080602083611aa69190612a8a565b90506000369050811115611ae6576040517f5796f78a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80360335915050919050565b600080600080611b0185611f37565b91509150600080600060606000600d611b2f602088611b209190612a8a565b89611fad90919063ffffffff16565b611b399190612a8a565b90506000611b6060688c611b4d9190612a8a565b6000369050611fc390919063ffffffff16565b90506000611b928360418e611b759190612a8a565b611b7f9190612a8a565b6000369050611fc390919063ffffffff16565b9050611b9e8382611bcc565b9350826020850120945081359650611be8565b60006040519050818152602081019050818101604052919050565b6000611bd783611bb1565b838382376020810391505092915050565b611bf98765ffffffffffff16611272565b611c0f8560418e611c0a9190612a8a565b611fd9565b9550611c1a86610585565b60ff1699505050505050505060008060005b84811015611db557611c3f888583612058565b809350819450505060005b8c51811015611da1578c8181518110611c6657611c65612950565b5b60200260200101518403611d8e5760008b8281518110611c8957611c88612950565b5b60200260200101519050611c9d81896120de565b158015611ccd5750611cad6112fe565b60ff168d8381518110611cc357611cc2612950565b5b6020026020010151105b15611d88578c8281518110611ce557611ce4612950565b5b602002602001018051809190611cfa906129ae565b81525050838b8381518110611d1257611d11612950565b5b602002602001015160018f8581518110611d2f57611d2e612950565b5b6020026020010151611d419190612a56565b81518110611d5257611d51612950565b5b602002602001018181525050611d6881896120f7565b8c8381518110611d7b57611d7a612950565b5b6020026020010181815250505b50611da1565b8080611d99906129ae565b915050611c4a565b508080611dad906129ae565b915050611c2c565b50505081602082611dc69190612a8a565b611dd09190612b26565b604e611ddc9190612a8a565b935050505095945050505050565b60606000835167ffffffffffffffff811115611e0957611e086122b5565b5b604051908082528060200260200182016040528015611e375781602001602082028036833780820191505090505b5090506000611e446112fe565b60ff16905060005b8551811015611f2b5781858281518110611e6957611e68612950565b5b60200260200101511015611ed057848181518110611e8a57611e89612950565b5b6020026020010151826040517f2b13aef5000000000000000000000000000000000000000000000000000000008152600401611ec792919061257a565b60405180910390fd5b6000611ef5878381518110611ee857611ee7612950565b5b6020026020010151610fe8565b905080848381518110611f0b57611f0a612950565b5b602002602001018181525050508080611f23906129ae565b915050611e4c565b50819250505092915050565b6000806000806000604186611f4c9190612a8a565b90506000611f73602083611f609190612a8a565b6000369050611fc390919063ffffffff16565b905080359350611f8d600382611fc390919063ffffffff16565b9050803592508362ffffff1695508263ffffffff16945050505050915091565b60008183611fbb9190612b26565b905092915050565b60008183611fd19190612a56565b905092915050565b6000806000808436038035935060208101905080359250602081019050803560001a915050600186828585604051600081526020016040526040516120219493929190612b68565b6020604051602081039080840390855afa158015612043573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000806000604e8661206a9190612a8a565b905060006120ab61209c6020886120819190612a8a565b87600161208e9190612a8a565b611fad90919063ffffffff16565b8361196f90919063ffffffff16565b905060006120c6826000369050611fc390919063ffffffff16565b90508035945060208101359350505050935093915050565b600080826001901b841690506000811191505092915050565b6000816001901b8317905092915050565b6000819050919050565b61211b81612108565b82525050565b60006020820190506121366000830184612112565b92915050565b6000819050919050565b61214f8161213c565b82525050565b600060208201905061216a6000830184612146565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121af82612184565b9050919050565b6121bf816121a4565b81146121ca57600080fd5b50565b6000813590506121dc816121b6565b92915050565b6000602082840312156121f8576121f761217a565b5b6000612206848285016121cd565b91505092915050565b600060ff82169050919050565b6122258161220f565b82525050565b6000602082019050612240600083018461221c565b92915050565b61224f8161213c565b811461225a57600080fd5b50565b60008135905061226c81612246565b92915050565b6000602082840312156122885761228761217a565b5b60006122968482850161225d565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122ed826122a4565b810181811067ffffffffffffffff8211171561230c5761230b6122b5565b5b80604052505050565b600061231f612170565b905061232b82826122e4565b919050565b600067ffffffffffffffff82111561234b5761234a6122b5565b5b602082029050602081019050919050565b600080fd5b600061237461236f84612330565b612315565b905080838252602082019050602084028301858111156123975761239661235c565b5b835b818110156123c057806123ac888261225d565b845260208401935050602081019050612399565b5050509392505050565b600082601f8301126123df576123de61229f565b5b81356123ef848260208601612361565b91505092915050565b60006020828403121561240e5761240d61217a565b5b600082013567ffffffffffffffff81111561242c5761242b61217f565b5b612438848285016123ca565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61247681612108565b82525050565b6000612488838361246d565b60208301905092915050565b6000602082019050919050565b60006124ac82612441565b6124b6818561244c565b93506124c18361245d565b8060005b838110156124f25781516124d9888261247c565b97506124e483612494565b9250506001810190506124c5565b5085935050505092915050565b6000602082019050818103600083015261251981846124a1565b905092915050565b61252a81612108565b811461253557600080fd5b50565b60008135905061254781612521565b92915050565b6000602082840312156125635761256261217a565b5b600061257184828501612538565b91505092915050565b600060408201905061258f6000830185612112565b61259c6020830184612112565b9392505050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6125c8816125a3565b82525050565b60006040820190506125e360008301856125bf565b6125f060208301846125bf565b9392505050565b6000806040838503121561260e5761260d61217a565b5b600061261c8582860161225d565b925050602061262d85828601612538565b9150509250929050565b600067ffffffffffffffff821115612652576126516122b5565b5b602082029050602081019050919050565b600061267661267184612637565b612315565b905080838252602082019050602084028301858111156126995761269861235c565b5b835b818110156126c257806126ae8882612538565b84526020840193505060208101905061269b565b5050509392505050565b600082601f8301126126e1576126e061229f565b5b81356126f1848260208601612663565b91505092915050565b6000602082840312156127105761270f61217a565b5b600082013567ffffffffffffffff81111561272e5761272d61217f565b5b61273a848285016126cc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127788161213c565b82525050565b600061278a838361276f565b60208301905092915050565b6000602082019050919050565b60006127ae82612743565b6127b8818561274e565b93506127c38361275f565b8060005b838110156127f45781516127db888261277e565b97506127e683612796565b9250506001810190506127c7565b5085935050505092915050565b6000602082019050818103600083015261281b81846127a3565b905092915050565b61282c816121a4565b82525050565b60006020820190506128476000830184612823565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006128ba602e8361284d565b91506128c58261285e565b604082019050919050565b600060208201905081810360008301526128e9816128ad565b9050919050565b6000819050919050565b6000819050919050565b600061291f61291a612915846128f0565b6128fa565b61220f565b9050919050565b61292f81612904565b82525050565b600060208201905061294a6000830184612926565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129b982612108565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129eb576129ea61297f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612a3082612108565b9150612a3b83612108565b925082612a4b57612a4a6129f6565b5b828204905092915050565b6000612a6182612108565b9150612a6c83612108565b9250828203905081811115612a8457612a8361297f565b5b92915050565b6000612a9582612108565b9150612aa083612108565b9250828201905080821115612ab857612ab761297f565b5b92915050565b6000606082019050612ad36000830186612112565b612ae06020830185612112565b612aed6040830184612112565b949350505050565b6000612b0082612108565b9150612b0b83612108565b925082612b1b57612b1a6129f6565b5b828206905092915050565b6000612b3182612108565b9150612b3c83612108565b9250828202612b4a81612108565b91508282048414831517612b6157612b6061297f565b5b5092915050565b6000608082019050612b7d6000830187612146565b612b8a602083018661221c565b612b976040830185612146565b612ba46060830184612146565b9594505050505056fea26469706673582212202041305ec51b626b82740921b99d494113b1264d4cb1a60f13cf6b65f6cf77b264736f6c63430008110033