{
    "_format": "hh-sol-artifact-1",
    "contractName": "MarginCalculator",
    "sourceName": "contracts/vanilla/MarginCalculator.sol",
    "abi": [
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_oracle",
                    "type": "address"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "constructor"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "collateral",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "dust",
                    "type": "uint256"
                }
            ],
            "name": "CollateralDustUpdated",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "productHash",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "timeToExpiry",
                    "type": "uint256"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                }
            ],
            "name": "MaxPriceAdded",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "productHash",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "timeToExpiry",
                    "type": "uint256"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "oldValue",
                    "type": "uint256"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "newValue",
                    "type": "uint256"
                }
            ],
            "name": "MaxPriceUpdated",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "oracleDeviation",
                    "type": "uint256"
                }
            ],
            "name": "OracleDeviationUpdated",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "previousOwner",
                    "type": "address"
                },
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "newOwner",
                    "type": "address"
                }
            ],
            "name": "OwnershipTransferred",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "product",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "spotShock",
                    "type": "uint256"
                }
            ],
            "name": "SpotShockUpdated",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "productHash",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "uint256",
                    "name": "timeToExpiry",
                    "type": "uint256"
                }
            ],
            "name": "TimeToExpiryAdded",
            "type": "event"
        },
        {
            "inputs": [],
            "name": "AUCTION_TIME",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                }
            ],
            "name": "getCollateralDust",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address[]",
                            "name": "shortVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "longVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "collateralAssets",
                            "type": "address[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "shortAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "longAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "collateralAmounts",
                            "type": "uint256[]"
                        }
                    ],
                    "internalType": "struct LibMarginVault.Vault",
                    "name": "_vault",
                    "type": "tuple"
                },
                {
                    "internalType": "uint256",
                    "name": "_vaultType",
                    "type": "uint256"
                }
            ],
            "name": "getExcessCollateral",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                },
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_vToken",
                    "type": "address"
                }
            ],
            "name": "getExpiredPayoutRate",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address[]",
                            "name": "shortVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "longVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "collateralAssets",
                            "type": "address[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "shortAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "longAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "collateralAmounts",
                            "type": "uint256[]"
                        }
                    ],
                    "internalType": "struct LibMarginVault.Vault",
                    "name": "_vault",
                    "type": "tuple"
                },
                {
                    "internalType": "uint256",
                    "name": "_vaultType",
                    "type": "uint256"
                }
            ],
            "name": "getMarginRequired",
            "outputs": [
                {
                    "components": [
                        {
                            "internalType": "int256",
                            "name": "value",
                            "type": "int256"
                        }
                    ],
                    "internalType": "struct LibFixedPointInt256.FixedPointInt",
                    "name": "",
                    "type": "tuple"
                },
                {
                    "components": [
                        {
                            "internalType": "int256",
                            "name": "value",
                            "type": "int256"
                        }
                    ],
                    "internalType": "struct LibFixedPointInt256.FixedPointInt",
                    "name": "",
                    "type": "tuple"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                },
                {
                    "internalType": "uint256",
                    "name": "_timeToExpiry",
                    "type": "uint256"
                }
            ],
            "name": "getMaxPrice",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "_shortAmount",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_strikePrice",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_underlyingPrice",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_shortExpiryTimestamp",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_collateralDecimals",
                    "type": "uint256"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                }
            ],
            "name": "getNakedMarginRequired",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getOracleDeviation",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                }
            ],
            "name": "getSpotShock",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                }
            ],
            "name": "getTimesToExpiry",
            "outputs": [
                {
                    "internalType": "uint256[]",
                    "name": "",
                    "type": "uint256[]"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address[]",
                            "name": "shortVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "longVTokens",
                            "type": "address[]"
                        },
                        {
                            "internalType": "address[]",
                            "name": "collateralAssets",
                            "type": "address[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "shortAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "longAmounts",
                            "type": "uint256[]"
                        },
                        {
                            "internalType": "uint256[]",
                            "name": "collateralAmounts",
                            "type": "uint256[]"
                        }
                    ],
                    "internalType": "struct LibMarginVault.Vault",
                    "name": "_vault",
                    "type": "tuple"
                },
                {
                    "internalType": "uint256",
                    "name": "_vaultType",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_vaultLatestUpdate",
                    "type": "uint256"
                }
            ],
            "name": "isLiquidatable",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                },
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "oracle",
            "outputs": [
                {
                    "internalType": "contract IOracleV2",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "owner",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "renounceOwnership",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "uint256",
                    "name": "_dust",
                    "type": "uint256"
                }
            ],
            "name": "setCollateralDust",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "uint256",
                    "name": "_deviation",
                    "type": "uint256"
                }
            ],
            "name": "setOracleDeviation",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                },
                {
                    "internalType": "uint256",
                    "name": "_shockValue",
                    "type": "uint256"
                }
            ],
            "name": "setSpotShock",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                },
                {
                    "internalType": "uint256[]",
                    "name": "_timesToExpiry",
                    "type": "uint256[]"
                },
                {
                    "internalType": "uint256[]",
                    "name": "_values",
                    "type": "uint256[]"
                }
            ],
            "name": "setUpperBoundValues",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "newOwner",
                    "type": "address"
                }
            ],
            "name": "transferOwnership",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_underlying",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_strike",
                    "type": "address"
                },
                {
                    "internalType": "address",
                    "name": "_collateral",
                    "type": "address"
                },
                {
                    "internalType": "bool",
                    "name": "_isPut",
                    "type": "bool"
                },
                {
                    "internalType": "uint256",
                    "name": "_timeToExpiry",
                    "type": "uint256"
                },
                {
                    "internalType": "uint256",
                    "name": "_value",
                    "type": "uint256"
                }
            ],
            "name": "updateUpperBoundValue",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "bytecode": "0x60806040526200001d60006008620000ef60201b620013271760201c565b516002553480156200002e57600080fd5b506040516200431f3803806200431f8339810160408190526200005191620002f9565b6200005c3362000216565b6001600160a01b038116620000c95760405162461bcd60e51b815260206004820152602860248201527f4d617267696e43616c63756c61746f723a20696e76616c6964206f7261636c65604482015267206164647265737360c01b60648201526084015b60405180910390fd5b600780546001600160a01b0319166001600160a01b03929092169190911790556200049a565b604080516020810190915260008152604080516020810190915260008152601b8314156200014257604051806020016040528062000138866200026660201b620013fb1760201c565b905290506200020d565b601b831115620001bf57600062000169601b85620002cf60201b620014621790919060201c565b90506040518060200160405280620001b3620001a284600a6200018d91906200038c565b89620002dd60201b6200146e1790919060201c565b6200026660201b620013fb1760201c565b8152509150506200020d565b6000620001ce84601b6200046a565b9050604051806020016040528062000207620001a284600a620001f291906200038c565b89620002eb60201b6200147a1790919060201c565b90529150505b90505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600160ff1b8210620002cb5760405162461bcd60e51b815260206004820152602560248201527f4c69624669786564506f696e74496e743235363a206f7574206f6620696e742060448201526472616e676560d81b6064820152608401620000c0565b5090565b60006200020d82846200046a565b60006200020d828462000322565b60006200020d828462000448565b6000602082840312156200030b578081fd5b81516001600160a01b03811681146200020d578182fd5b6000826200033e57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156200038457816000190482111562000368576200036862000484565b808516156200037657918102915b93841c939080029062000348565b509250929050565b60006200020d8383600082620003a55750600162000210565b81620003b45750600062000210565b8160018114620003cd5760028114620003d857620003f8565b600191505062000210565b60ff841115620003ec57620003ec62000484565b50506001821b62000210565b5060208310610133831016604e8410600b84101617156200041d575081810a62000210565b62000429838362000343565b806000190482111562000440576200044062000484565b029392505050565b600081600019048311821515161562000465576200046562000484565b500290565b6000828210156200047f576200047f62000484565b500390565b634e487b7160e01b600052601160045260246000fd5b613e7580620004aa6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638aab8fa5116100ad578063cd43fbfb11610071578063cd43fbfb1461029b578063dc1b3f00146102c3578063e2947194146102d6578063e592301a14610306578063f2fde38b1461030f57600080fd5b80638aab8fa5146102495780638da5cb5b1461025c5780639a783d111461026d578063b29d5ee814610280578063c73547e31461028857600080fd5b80636ccb9506116100f45780636ccb9506146101c5578063715018a6146101ee5780637ad7f800146101f85780637dc0d1d01461020b5780637f519b721461023657600080fd5b8063053fe57c146101315780630b0509fb1461015e578063463459001461017f578063478409301461019257806347d438a5146101a5575b600080fd5b61014461013f366004613951565b610322565b604080519251835290516020830152015b60405180910390f35b61017161016c36600461387c565b610365565b604051908152602001610155565b61017161018d366004613627565b6103ce565b6101716101a03660046135ef565b6103f8565b6101b86101b3366004613627565b610598565b6040516101559190613a31565b6101716101d33660046135ef565b6001600160a01b031660009081526003602052604090205490565b6101f6610610565b005b6101f661020636600461379c565b610624565b60075461021e906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101f6610244366004613682565b61078c565b6101f6610257366004613739565b610c71565b6000546001600160a01b031661021e565b6101f661027b36600461390a565b610d42565b600154610171565b6101f66102963660046139e0565b610e19565b6102ae6102a9366004613951565b610e5c565b60408051928352901515602083015201610155565b6101716102d1366004613739565b610f58565b6102e96102e4366004613994565b610f8d565b604080519315158452602084019290925290820152606001610155565b610171610e1081565b6101f661031d3660046135ef565b6112ae565b604080516020810190915260008152604080516020810190915260008152600061034c8585611486565b90506103588582611895565b92509250505b9250929050565b6000806103748b8b8b86611dbd565b90506000610383896008611327565b90506000610392896008611327565b905060006103a1896008611327565b90506103bc6103b4858584868d8c611e0a565b886000611f4e565b9e9d5050505050505050505050505050565b6000806103dd86868686611dbd565b6000908152600660205260409020549150505b949350505050565b60006001600160a01b0382166104655760405162461bcd60e51b815260206004820152602760248201527f4d617267696e43616c63756c61746f723a20496e76616c696420746f6b656e206044820152666164647265737360c81b60648201526084015b60405180910390fd5b60008060008060008061047788612029565b955095509550955095509550814210156104e45760405162461bcd60e51b815260206004820152602860248201527f4d617267696e43616c63756c61746f723a2056546f6b656e206e6f74206578706044820152671a5c9959081e595d60c21b606482015260840161045c565b60006104f3868685878661237b565b9050600061050382878a876123d1565b90506000886001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561054057600080fd5b505afa158015610554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105789190613a10565b60ff16905061058982826001611f4e565b9b9a5050505050505050505050565b606060006105a886868686611dbd565b600081815260046020908152604091829020805483518184028101840190945280845293945091929083018282801561060057602002820191906000526020600020905b8154815260200190600101908083116105ec575b5050505050915050949350505050565b610618612540565b610622600061259a565b565b61062c612540565b600081116106975760405162461bcd60e51b815260206004820152603260248201527f4d617267696e43616c63756c61746f723a20696e76616c6964206f7074696f6e60448201527120757070657220626f756e642076616c756560701b606482015260840161045c565b60006106a587878787611dbd565b6000818152600560209081526040808320878452909152902054909150806107255760405162461bcd60e51b815260206004820152602d60248201527f4d617267696e43616c63756c61746f723a20757070657220626f756e6420766160448201526c1b1d59481b9bdd08199bdd5b99609a1b606482015260840161045c565b6000828152600560209081526040808320878452825291829020859055815186815290810183905290810184905282907f39bab32d3b88604bdfbf6e8c3b1aaaf9bb6013da4fd5206dee9e3b00ee6f2cf99060600160405180910390a25050505050505050565b610794612540565b826107f95760405162461bcd60e51b815260206004820152602f60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642074696d65732060448201526e746f2065787069727920617272617960881b606482015260840161045c565b8281146108575760405162461bcd60e51b815260206004820152602660248201527f4d617267696e43616c63756c61746f723a20696e76616c69642076616c75657360448201526520617272617960d01b606482015260840161045c565b600061086589898989611dbd565b600081815260046020526040902080549192509015806108e257508054819061088f906001611462565b815481106108ad57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154868660008181106108d957634e487b7160e01b600052603260045260246000fd5b90506020020135115b6109455760405162461bcd60e51b815260206004820152602e60248201527f4d617267696e43616c63756c61746f723a20657870697279206172726179206960448201526d39903737ba1034b71037b93232b960911b606482015260840161045c565b60005b85811015610c64578561095c8260016125ea565b1015610a1957868661096f8360016125ea565b81811061098c57634e487b7160e01b600052603260045260246000fd5b905060200201358787838181106109b357634e487b7160e01b600052603260045260246000fd5b9050602002013510610a195760405162461bcd60e51b815260206004820152602960248201527f4d617267696e43616c63756c61746f723a2074696d652073686f756c642062656044820152681034b71037b93232b960b91b606482015260840161045c565b6000858583818110610a3b57634e487b7160e01b600052603260045260246000fd5b9050602002013511610aab5760405162461bcd60e51b815260206004820152603360248201527f4d617267696e43616c63756c61746f723a206e6f2065787069727920757070656044820152721c88189bdd5b99081d985b1d5948199bdd5b99606a1b606482015260840161045c565b848482818110610acb57634e487b7160e01b600052603260045260246000fd5b90506020020135600560008581526020019081526020016000206000898985818110610b0757634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555081878783818110610b4157634e487b7160e01b600052603260045260246000fd5b83546001810185556000948552602094859020919094029290920135919092015550827fcaae9881bd3ac6f531c9e6021f1f873b93a83648e348624eef8f9ba9757fcb62888884818110610ba557634e487b7160e01b600052603260045260246000fd5b90506020020135604051610bbb91815260200190565b60405180910390a2827fcbb8d688de73727385afee9d53a2771ae5fe45293ff6de0ba46b201ab29df115888884818110610c0557634e487b7160e01b600052603260045260246000fd5b90506020020135878785818110610c2c57634e487b7160e01b600052603260045260246000fd5b90506020020135604051610c4a929190918252602082015260400190565b60405180910390a280610c5c81613d71565b915050610948565b5050505050505050505050565b610c79612540565b60008111610cdc5760405162461bcd60e51b815260206004820152602a60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642073706f742073604482015269686f636b2076616c756560b01b606482015260840161045c565b6000610cea86868686611dbd565b600081815260066020526040908190208490555190915081907f78d22b4a9e4e0e1db30e7762696456ca380dc80efc59f416a299b97213b6d31690610d329085815260200190565b60405180910390a2505050505050565b610d4a612540565b60008111610dc05760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a206475737420616d6f756e7420736860448201527f6f756c642062652067726561746572207468616e207a65726f00000000000000606482015260840161045c565b6001600160a01b03821660008181526003602052604090819020839055517f8ef429e6cec4339c5f0187fb930764fb967114bf09bc8bb06a552ba32923fd8690610e0d9084815260200190565b60405180910390a25050565b610e21612540565b60018190556040518181527fe44c6dd1fc3826ad24b81f17cf04849cedd368e002a52e89a845d14d3474e20a9060200160405180910390a150565b6000806000610e6b8585611486565b9050610e7785826125f6565b806102200151158015610e8d5750806102000151155b15610ee1576000816102400151610ea5576000610ed3565b8560a00151600081518110610eca57634e487b7160e01b600052603260045260246000fd5b60200260200101515b93506001925061035e915050565b600080610eee8784611895565b90925090506000610eff83836129b6565b6040805160208101909152600254908190528151610200870151929350121590600090610f3157856101000151610f38565b8561016001515b90506000610f47848385611f4e565b9b929a509198505050505050505050565b600080610f6787878787611dbd565b600090815260056020908152604080832086845290915290205491505095945050505050565b600080600084600114610ffc5760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a20696e76616c6964207661756c74206044820152707479706520746f206c697175696461746560781b606482015260840161045c565b60006110088787611486565b9050806102200151611025576000806000935093509350506112a5565b8060e0015142106110955760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a2063616e206e6f74206c697175696460448201527330ba329032bc3834b932b2103837b9b4ba34b7b760611b606482015260840161045c565b60075481516040516341976e0960e01b81526001600160a01b03918216600482015260009291909116906341976e099060240160206040518083038186803b1580156110e057600080fd5b505afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111891906139f8565b90506000604051806060016040528061115e8b6060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b60200260200101516008611327565b81526020016111728560c001516008611327565b8152602001611182846008611327565b815250905060006111a6846000015185602001518660400151876101c00151611dbd565b905060006111e58b60a001516000815181106111d257634e487b7160e01b600052603260045260246000fd5b6020026020010151866101800151611327565b9050600061120c838560000151866040015187602001518a60e001518b6101c00151611e0a565b905061121b8183519051131590565b156112365760008060009850985098505050505050506112a5565b600061125085602001518660400151896101c001516129e9565b90506000611275848760000151848960400151428d61018001518e6101c00151612a55565b6040988901516001600160a01b031660009081526003602052989098205460019b50979950969750505050505050505b93509350939050565b6112b6612540565b6001600160a01b03811661131b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b6113248161259a565b50565b604080516020810190915260008152604080516020810190915260008152601b83141561136b576040518060200160405280611362866113fb565b905290506113f2565b601b8311156113b857600061138184601b611462565b905060405180602001604052806113ad6113a884600a6113a19190613bd1565b899061146e565b6113fb565b8152509150506113f2565b60006113c584601b613d5a565b905060405180602001604052806113ec6113a884600a6113e59190613bd1565b899061147a565b90529150505b90505b92915050565b6000600160ff1b821061145e5760405162461bcd60e51b815260206004820152602560248201527f4c69624669786564506f696e74496e743235363a206f7574206f6620696e742060448201526472616e676560d81b606482015260840161045c565b5090565b60006113f28284613d5a565b60006113f28284613b7a565b60006113f28284613cfc565b6040805161026081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101829052610240810191909152604080516102608101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e0820181905261020082018190526102208201819052610240820152908401516115c390612b60565b151561020082015283516115d690612b60565b151561022082015260408401516115ec90612b60565b15156102408201526101a08101839052610200810151156116ee576000846020015160008151811061162e57634e487b7160e01b600052603260045260246000fd5b6020026020010151905061164181612029565b15156101e08801526101408701526101208601526001600160a01b03908116608086015290811660608501521660a083018190526040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156116ab57600080fd5b505afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190613a10565b60ff16610160830152505b806102200151156117dd576000846000015160008151811061172057634e487b7160e01b600052603260045260246000fd5b6020026020010151905061173381612029565b15156101c088015260e087015260c08601526001600160a01b039081166020808701919091529181168552919091166040808501829052805163313ce56760e01b81529051919263313ce56792600480840193829003018186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d29190613a10565b60ff16610100830152505b806102400151156113f257836040015160008151811061180d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190613a10565b60ff166101808201529392505050565b60408051602081019091526000815260408051602081019091526000815260008361022001516118d457604080516020810190915260025481526118fc565b6118fc856060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600084610200015161191f5760408051602081019091526002548152611947565b611947866080015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600085610240015161196a57604080516020810190915260025481526119a5565b6119a58760a0015160008151811061199257634e487b7160e01b600052603260045260246000fd5b6020026020010151876101800151611327565b905060008661022001516119c857604080516020810190915260025481526119d7565b6119d78760c001516008611327565b905060006040518060a001604052808961022001516119fa5789606001516119fd565b89515b6001600160a01b03168152602001896102200151611a1f578960a00151611a25565b89604001515b6001600160a01b03168152602001896102200151611a47578960800151611a4d565b89602001515b6001600160a01b03168152602001896102200151611a7057896101400151611a76565b8960e001515b8152602001896102200151611a9057896101e00151611a97565b896101c001515b151581525090508060600151421015611d0a57876101a0015160011415611c75576040808901516001600160a01b031660009081526003602052908120546101808a0151611ae59190611327565b60408051602081019091526002549081905285519192501215611b9f578051845113611b9f5760405162461bcd60e51b815260206004820152605b60248201527f4d617267696e43616c63756c61746f723a206e616b6564206d617267696e207660448201527f61756c742073686f756c64206861766520636f6c6c61746572616c20616d6f7560648201527f6e742067726561746572207468616e206475737420616d6f756e740000000000608482015260a40161045c565b60075489516040516341976e0960e01b81526001600160a01b039182166004820152600092611c2a9216906341976e099060240160206040518083038186803b158015611beb57600080fd5b505afa158015611bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2391906139f8565b6008611327565b90506000611c4b8b600001518c602001518d604001518e6101c00151611dbd565b905085611c64828a858989606001518a60800151611e0a565b99509950505050505050505061035e565b6000886102000151611c965760408051602081019091526002548152611ca6565b611ca68961012001516008611327565b9050816080015115611ce6576000611cc087878685612bb2565b905084611cd68285604001518660200151612bf4565b985098505050505050505061035e565b6000611cf487878685612d54565b905084611cd68285600001518660200151612bf4565b6000886102200151611d2b5760408051602081019091526002548152611d4c565b611d4c89600001518a602001518b60e001518c60c00151866080015161237b565b90506000896102000151611d6f5760408051602081019091526002548152611d92565b611d928a606001518b608001518c61014001518d6101200151876080015161237b565b90506000611da288888585612dc1565b905085611c64828660400151876020015188606001516123d1565b604080516001600160a01b039586166020808301919091529486168183015292909416606083015215156080808301919091528351808303909101815260a0909101909252815191012090565b6040805160208101909152600081526000611e258885612de7565b604080516020808201835260008c81526006825283812054835283519182019093529182529192506040805160208101909152600081526040805160208101909152600081528615611ed957611e8489611e7f868d61302d565b61306e565b9250611eb2611e9d611e96868d61302d565b8b906129b6565b60408051602081019091526002548152613093565b9150611ed28b611ecc84611ec6898861302d565b906130b1565b9061302d565b9050610589565b6000611ef26b033b2e3c9fd0803ce8000000601b611327565b9050611f0c81611e7f8d611f068e8a61302d565b906130db565b9350611f29611e9d611f228d611f068e8a61302d565b83906129b6565b9250611f3d8c611ecc85611ec68a8961302d565b9d9c50505050505050505050505050565b600080601b841415611f6c578451611f6590613112565b905061201f565b601b841115611fab576000611f82601b86613d5a565b9050611fa3611f9282600a613bd1565b8751611f9d90613112565b9061147a565b91505061201f565b6000611fb885601b613d5a565b9050600084611ff1576000611fe2611fd184600a613bd1565b8951611fdc90613112565b90613125565b90508015611fef57600191505b505b61201a8161201461200385600a613bd1565b8a5161200e90613112565b9061146e565b906125ea565b925050505b90505b9392505050565b6000806000806000806000879050806001600160a01b0316630812c4526040518163ffffffff1660e01b815260040160c06040518083038186803b15801561207057600080fd5b505afa9250505080156120a0575060408051601f3d908101601f1916820190925261209d91810190613809565b60015b61235c57806001600160a01b031663aabaecd66040518163ffffffff1660e01b815260040160206040518083038186803b1580156120dd57600080fd5b505afa1580156120f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612115919061360b565b816001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214e57600080fd5b505afa158015612162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612186919061360b565b826001600160a01b03166317d69bc86040518163ffffffff1660e01b815260040160206040518083038186803b1580156121bf57600080fd5b505afa1580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f7919061360b565b836001600160a01b031663c52987cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561223057600080fd5b505afa158015612244573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226891906139f8565b846001600160a01b031663ade6e2aa6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d991906139f8565b856001600160a01b031663f3c274a66040518163ffffffff1660e01b815260040160206040518083038186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234a9190613935565b96509650965096509650965050612372565b949b509299509097509550935091506123729050565b91939550919395565b6040805160208101909152600081526000612397846008611327565b905060006123a760016000611327565b905060006123b7828a8a8a6123d1565b90506123c48382876129e9565b9998505050505050505050565b604080516020810190915260008152826001600160a01b0316846001600160a01b031614156124015750836103f0565b6007546040516301957f8160e01b81526001600160a01b0386811660048301526024820185905260009216906301957f819060440160206040518083038186803b15801561244e57600080fd5b505afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248691906139f8565b6007546040516301957f8160e01b81526001600160a01b03878116600483015260248201879052929350600092909116906301957f819060440160206040518083038186803b1580156124d857600080fd5b505afa1580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251091906139f8565b9050612535612520826008611327565b611f0661252e856008611327565b8a9061302d565b979650505050505050565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113f28284613b34565b815151600110156126675760405162461bcd60e51b815260206004820152603560248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e792073686f7274604482015274081d951bdad95b9cc81a5b881d1a19481d985d5b1d605a1b606482015260840161045c565b600182602001515111156126da5760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e79206c6f6e67206044820152731d951bdad95b9cc81a5b881d1a19481d985d5b1d60621b606482015260840161045c565b600182604001515111156127565760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e7920636f6c6c6160448201527f746572616c2061737365747320696e20746865207661756c7400000000000000606482015260840161045c565b606082015151825151146127c65760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a2053686f727420617373657420616e6044820152700c840c2dadeeadce840dad2e6dac2e8c6d607b1b606482015260840161045c565b816080015151826020015151146128385760405162461bcd60e51b815260206004820152603060248201527f4d617267696e43616c63756c61746f723a204c6f6e6720617373657420616e6460448201526f040c2dadeeadce840dad2e6dac2e8c6d60831b606482015260840161045c565b8160a0015151826040015151146128b05760405162461bcd60e51b815260206004820152603660248201527f4d617267696e43616c63756c61746f723a20436f6c6c61746572616c206173736044820152750cae840c2dcc840c2dadeeadce840dad2e6dac2e8c6d60531b606482015260840161045c565b6128ba8282613131565b61292c5760405162461bcd60e51b815260206004820152603b60248201527f4d617267696e43616c63756c61746f723a206c6f6e67206173736574206e6f7460448201527f206d617267696e61626c6520666f722073686f72742061737365740000000000606482015260840161045c565b61293682826132e9565b6129b25760405162461bcd60e51b815260206004820152604160248201527f4d617267696e43616c63756c61746f723a20636f6c6c61746572616c2061737360448201527f6574206e6f74206d617267696e61626c6520666f722073686f727420617373656064820152601d60fa1b608482015260a40161045c565b5050565b60408051602081019091526000815260408051602081019091528251845182916129e091906133b1565b90529392505050565b6040805160208101909152600081528115612a2d578251845113612a1c5760408051602081019091526002548152612a26565b612a2684846129b6565b9050612022565b8351835113612a4b576040805160208101909152600254815261201f565b61201f83856129b6565b6000612a6d6040518060200160405280600081525090565b6000612a798a8a6130db565b90506000612a874288611462565b9050610e108110612a9a57819250612b54565b6040805160208101909152600081526000612ab8600154601b611327565b90508615612ade57612ad7611e9d612ad0838d61302d565b8d906129b6565b9150612afc565b612af98a611f06611e9d612af2858461302d565b8f906129b6565b91505b506000612b0a836012611327565b90506000612b1b610e106012611327565b9050612b39612b3282611f0685611ecc8a896129b6565b84906130b1565b9550612b4786865190511390565b15612b50578495505b5050505b61058983876001611f4e565b60008082511180156113f5575060006001600160a01b031682600081518110612b9957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141592915050565b604080516020810190915260008152612beb611e9d612bdb612bd4888861306e565b859061302d565b612be5888761302d565b906129b6565b95945050505050565b604080516020810190915260008152816001600160a01b0316836001600160a01b03161415612c24575082612022565b6007546040516341976e0960e01b81526001600160a01b03858116600483015260009216906341976e099060240160206040518083038186803b158015612c6a57600080fd5b505afa158015612c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca291906139f8565b6007546040516341976e0960e01b81526001600160a01b038681166004830152929350600092909116906341976e099060240160206040518083038186803b158015612ced57600080fd5b505afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2591906139f8565b9050612d4a612d35826008611327565b611f06612d43856008611327565b899061302d565b9695505050505050565b604080516020808201835260008252825190810190925260025491829052825190911415612d9057612d89611e9d86866129b6565b90506103f0565b6000612da483611f0688611ecc83896129b6565b90506000612db5611e9d88886129b6565b90506125358282613093565b604080516020810190915260008152612beb612ddd838661302d565b612be5858861302d565b604080516020810190915260008152600083815260046020908152604080832080548251818502810185019093528083529192909190830182828015612e4c57602002820191906000526020600020905b815481526020019060010190808311612e38575b50505050509050805160001415612ebd5760405162461bcd60e51b815260206004820152602f60248201527f4d617267696e43616c63756c61746f723a2070726f647563742068617665206e60448201526e6f206578706972792076616c75657360881b606482015260840161045c565b6000612ec98442611462565b90508082612ee26001855161146290919063ffffffff16565b81518110612f0057634e487b7160e01b600052603260045260246000fd5b60200260200101511015612f725760405162461bcd60e51b815260206004820152603360248201527f4d617267696e43616c63756c61746f723a2070726f647563742068617665206e6044820152726f20757070657220626f756e642076616c756560681b606482015260840161045c565b60005b82518160ff1610156130245781838260ff1681518110612fa557634e487b7160e01b600052603260045260246000fd5b60200260200101511061301257600086815260056020526040812084516130089290869060ff8616908110612fea57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054601b611327565b93505050506113f5565b8061301c81613d8c565b915050612f75565b50505092915050565b60408051602081019091526000815260408051602081019091528251845182916b033b2e3c9fd0803ce800000091613064916133bd565b6129e09190613b4c565b604080516020810190915260008152815183511261308c57816113f2565b5090919050565b604080516020810190915260008152815183511361308c57816113f2565b60408051602081019091526000815260408051602081019091528251845182916129e091906133c9565b604080516020810190915260008152604080516020810190915282518451829190613064906b033b2e3c9fd0803ce80000006133bd565b60008082121561145e576113f582613dc0565b60006113f28284613dac565b6000816101a00151600114156131ba57816102000151156131ba5760405162461bcd60e51b815260206004820152603c60248201527f4d617267696e43616c63756c61746f723a206e616b6564206d617267696e207660448201527f61756c742063616e6e6f742068617665206c6f6e672076546f6b656e00000000606482015260840161045c565b81610200015115806131cf5750816102200151155b156131dc575060016113f5565b825180516000906131fd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836020015160008151811061323357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415801561326b575081600001516001600160a01b031682606001516001600160a01b0316145b8015613290575081602001516001600160a01b031682608001516001600160a01b0316145b80156132b5575081604001516001600160a01b03168260a001516001600160a01b0316145b80156132c957508160e00151826101400151145b80156113f25750816101c001511515826101e00151151514905092915050565b6102408101516000906001906133005790506113f5565b8261022001511561335757836040015160008151811061333057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031683604001516001600160a01b03161490506113f2565b826102000151156113f257836040015160008151811061338757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168360a001516001600160a01b0316149050905092915050565b60006113f28284613d1b565b60006113f28284613c79565b60006113f28284613af3565b600082601f8301126133e5578081fd5b813560206133fa6133f583613acf565b613a9e565b80838252828201915082860187848660051b8901011115613419578586fd5b855b8581101561344057813561342e81613e1c565b8452928401929084019060010161341b565b5090979650505050505050565b60008083601f84011261345e578182fd5b50813567ffffffffffffffff811115613475578182fd5b6020830191508360208260051b850101111561035e57600080fd5b600082601f8301126134a0578081fd5b813560206134b06133f583613acf565b80838252828201915082860187848660051b89010111156134cf578586fd5b855b85811015613440578135845292840192908401906001016134d1565b600060c082840312156134fe578081fd5b613506613a75565b9050813567ffffffffffffffff8082111561352057600080fd5b61352c858386016133d5565b8352602084013591508082111561354257600080fd5b61354e858386016133d5565b6020840152604084013591508082111561356757600080fd5b613573858386016133d5565b6040840152606084013591508082111561358c57600080fd5b61359885838601613490565b606084015260808401359150808211156135b157600080fd5b6135bd85838601613490565b608084015260a08401359150808211156135d657600080fd5b506135e384828501613490565b60a08301525092915050565b600060208284031215613600578081fd5b81356113f281613e1c565b60006020828403121561361c578081fd5b81516113f281613e1c565b6000806000806080858703121561363c578283fd5b843561364781613e1c565b9350602085013561365781613e1c565b9250604085013561366781613e1c565b9150606085013561367781613e31565b939692955090935050565b60008060008060008060008060c0898b03121561369d578384fd5b88356136a881613e1c565b975060208901356136b881613e1c565b965060408901356136c881613e1c565b955060608901356136d881613e31565b9450608089013567ffffffffffffffff808211156136f4578586fd5b6137008c838d0161344d565b909650945060a08b0135915080821115613718578384fd5b506137258b828c0161344d565b999c989b5096995094979396929594505050565b600080600080600060a08688031215613750578081fd5b853561375b81613e1c565b9450602086013561376b81613e1c565b9350604086013561377b81613e1c565b9250606086013561378b81613e31565b949793965091946080013592915050565b60008060008060008060c087890312156137b4578182fd5b86356137bf81613e1c565b955060208701356137cf81613e1c565b945060408701356137df81613e1c565b935060608701356137ef81613e31565b9598949750929560808101359460a0909101359350915050565b60008060008060008060c08789031215613821578384fd5b865161382c81613e1c565b602088015190965061383d81613e1c565b604088015190955061384e81613e1c565b80945050606087015192506080870151915060a087015161386e81613e31565b809150509295509295509295565b60008060008060008060008060006101208a8c03121561389a578283fd5b89356138a581613e1c565b985060208a01356138b581613e1c565b975060408a01356138c581613e1c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013591506101008a01356138f981613e31565b809150509295985092959850929598565b6000806040838503121561391c578182fd5b823561392781613e1c565b946020939093013593505050565b600060208284031215613946578081fd5b81516113f281613e31565b60008060408385031215613963578182fd5b823567ffffffffffffffff811115613979578283fd5b613985858286016134ed565b95602094909401359450505050565b6000806000606084860312156139a8578081fd5b833567ffffffffffffffff8111156139be578182fd5b6139ca868287016134ed565b9660208601359650604090950135949350505050565b6000602082840312156139f1578081fd5b5035919050565b600060208284031215613a09578081fd5b5051919050565b600060208284031215613a21578081fd5b815160ff811681146113f2578182fd5b6020808252825182820181905260009190848201906040850190845b81811015613a6957835183529284019291840191600101613a4d565b50909695505050505050565b60405160c0810167ffffffffffffffff81118282101715613a9857613a98613e06565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ac757613ac7613e06565b604052919050565b600067ffffffffffffffff821115613ae957613ae9613e06565b5060051b60200190565b600080821280156001600160ff1b0384900385131615613b1557613b15613dda565b600160ff1b8390038412811615613b2e57613b2e613dda565b50500190565b60008219821115613b4757613b47613dda565b500190565b600082613b5b57613b5b613df0565b600160ff1b821460001984141615613b7557613b75613dda565b500590565b600082613b8957613b89613df0565b500490565b600181815b80851115613bc9578160001904821115613baf57613baf613dda565b80851615613bbc57918102915b93841c9390800290613b93565b509250929050565b60006113f28383600082613be7575060016113f5565b81613bf4575060006113f5565b8160018114613c0a5760028114613c1457613c30565b60019150506113f5565b60ff841115613c2557613c25613dda565b50506001821b6113f5565b5060208310610133831016604e8410600b8410161715613c53575081810a6113f5565b613c5d8383613b8e565b8060001904821115613c7157613c71613dda565b029392505050565b60006001600160ff1b0381841382841380821686840486111615613c9f57613c9f613dda565b600160ff1b84871282811687830589121615613cbd57613cbd613dda565b858712925087820587128484161615613cd857613cd8613dda565b87850587128184161615613cee57613cee613dda565b505050929093029392505050565b6000816000190483118215151615613d1657613d16613dda565b500290565b60008083128015600160ff1b850184121615613d3957613d39613dda565b6001600160ff1b0384018313811615613d5457613d54613dda565b50500390565b600082821015613d6c57613d6c613dda565b500390565b6000600019821415613d8557613d85613dda565b5060010190565b600060ff821660ff811415613da357613da3613dda565b60010192915050565b600082613dbb57613dbb613df0565b500690565b6000600160ff1b821415613dd657613dd6613dda565b0390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461132457600080fd5b801515811461132457600080fdfea2646970667358221220db3081fb48bdf26eac7463f770cd60f6521994b2f05874cb9ad5c6057a17ea6264736f6c63430008040033",
    "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638aab8fa5116100ad578063cd43fbfb11610071578063cd43fbfb1461029b578063dc1b3f00146102c3578063e2947194146102d6578063e592301a14610306578063f2fde38b1461030f57600080fd5b80638aab8fa5146102495780638da5cb5b1461025c5780639a783d111461026d578063b29d5ee814610280578063c73547e31461028857600080fd5b80636ccb9506116100f45780636ccb9506146101c5578063715018a6146101ee5780637ad7f800146101f85780637dc0d1d01461020b5780637f519b721461023657600080fd5b8063053fe57c146101315780630b0509fb1461015e578063463459001461017f578063478409301461019257806347d438a5146101a5575b600080fd5b61014461013f366004613951565b610322565b604080519251835290516020830152015b60405180910390f35b61017161016c36600461387c565b610365565b604051908152602001610155565b61017161018d366004613627565b6103ce565b6101716101a03660046135ef565b6103f8565b6101b86101b3366004613627565b610598565b6040516101559190613a31565b6101716101d33660046135ef565b6001600160a01b031660009081526003602052604090205490565b6101f6610610565b005b6101f661020636600461379c565b610624565b60075461021e906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101f6610244366004613682565b61078c565b6101f6610257366004613739565b610c71565b6000546001600160a01b031661021e565b6101f661027b36600461390a565b610d42565b600154610171565b6101f66102963660046139e0565b610e19565b6102ae6102a9366004613951565b610e5c565b60408051928352901515602083015201610155565b6101716102d1366004613739565b610f58565b6102e96102e4366004613994565b610f8d565b604080519315158452602084019290925290820152606001610155565b610171610e1081565b6101f661031d3660046135ef565b6112ae565b604080516020810190915260008152604080516020810190915260008152600061034c8585611486565b90506103588582611895565b92509250505b9250929050565b6000806103748b8b8b86611dbd565b90506000610383896008611327565b90506000610392896008611327565b905060006103a1896008611327565b90506103bc6103b4858584868d8c611e0a565b886000611f4e565b9e9d5050505050505050505050505050565b6000806103dd86868686611dbd565b6000908152600660205260409020549150505b949350505050565b60006001600160a01b0382166104655760405162461bcd60e51b815260206004820152602760248201527f4d617267696e43616c63756c61746f723a20496e76616c696420746f6b656e206044820152666164647265737360c81b60648201526084015b60405180910390fd5b60008060008060008061047788612029565b955095509550955095509550814210156104e45760405162461bcd60e51b815260206004820152602860248201527f4d617267696e43616c63756c61746f723a2056546f6b656e206e6f74206578706044820152671a5c9959081e595d60c21b606482015260840161045c565b60006104f3868685878661237b565b9050600061050382878a876123d1565b90506000886001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561054057600080fd5b505afa158015610554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105789190613a10565b60ff16905061058982826001611f4e565b9b9a5050505050505050505050565b606060006105a886868686611dbd565b600081815260046020908152604091829020805483518184028101840190945280845293945091929083018282801561060057602002820191906000526020600020905b8154815260200190600101908083116105ec575b5050505050915050949350505050565b610618612540565b610622600061259a565b565b61062c612540565b600081116106975760405162461bcd60e51b815260206004820152603260248201527f4d617267696e43616c63756c61746f723a20696e76616c6964206f7074696f6e60448201527120757070657220626f756e642076616c756560701b606482015260840161045c565b60006106a587878787611dbd565b6000818152600560209081526040808320878452909152902054909150806107255760405162461bcd60e51b815260206004820152602d60248201527f4d617267696e43616c63756c61746f723a20757070657220626f756e6420766160448201526c1b1d59481b9bdd08199bdd5b99609a1b606482015260840161045c565b6000828152600560209081526040808320878452825291829020859055815186815290810183905290810184905282907f39bab32d3b88604bdfbf6e8c3b1aaaf9bb6013da4fd5206dee9e3b00ee6f2cf99060600160405180910390a25050505050505050565b610794612540565b826107f95760405162461bcd60e51b815260206004820152602f60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642074696d65732060448201526e746f2065787069727920617272617960881b606482015260840161045c565b8281146108575760405162461bcd60e51b815260206004820152602660248201527f4d617267696e43616c63756c61746f723a20696e76616c69642076616c75657360448201526520617272617960d01b606482015260840161045c565b600061086589898989611dbd565b600081815260046020526040902080549192509015806108e257508054819061088f906001611462565b815481106108ad57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154868660008181106108d957634e487b7160e01b600052603260045260246000fd5b90506020020135115b6109455760405162461bcd60e51b815260206004820152602e60248201527f4d617267696e43616c63756c61746f723a20657870697279206172726179206960448201526d39903737ba1034b71037b93232b960911b606482015260840161045c565b60005b85811015610c64578561095c8260016125ea565b1015610a1957868661096f8360016125ea565b81811061098c57634e487b7160e01b600052603260045260246000fd5b905060200201358787838181106109b357634e487b7160e01b600052603260045260246000fd5b9050602002013510610a195760405162461bcd60e51b815260206004820152602960248201527f4d617267696e43616c63756c61746f723a2074696d652073686f756c642062656044820152681034b71037b93232b960b91b606482015260840161045c565b6000858583818110610a3b57634e487b7160e01b600052603260045260246000fd5b9050602002013511610aab5760405162461bcd60e51b815260206004820152603360248201527f4d617267696e43616c63756c61746f723a206e6f2065787069727920757070656044820152721c88189bdd5b99081d985b1d5948199bdd5b99606a1b606482015260840161045c565b848482818110610acb57634e487b7160e01b600052603260045260246000fd5b90506020020135600560008581526020019081526020016000206000898985818110610b0757634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555081878783818110610b4157634e487b7160e01b600052603260045260246000fd5b83546001810185556000948552602094859020919094029290920135919092015550827fcaae9881bd3ac6f531c9e6021f1f873b93a83648e348624eef8f9ba9757fcb62888884818110610ba557634e487b7160e01b600052603260045260246000fd5b90506020020135604051610bbb91815260200190565b60405180910390a2827fcbb8d688de73727385afee9d53a2771ae5fe45293ff6de0ba46b201ab29df115888884818110610c0557634e487b7160e01b600052603260045260246000fd5b90506020020135878785818110610c2c57634e487b7160e01b600052603260045260246000fd5b90506020020135604051610c4a929190918252602082015260400190565b60405180910390a280610c5c81613d71565b915050610948565b5050505050505050505050565b610c79612540565b60008111610cdc5760405162461bcd60e51b815260206004820152602a60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642073706f742073604482015269686f636b2076616c756560b01b606482015260840161045c565b6000610cea86868686611dbd565b600081815260066020526040908190208490555190915081907f78d22b4a9e4e0e1db30e7762696456ca380dc80efc59f416a299b97213b6d31690610d329085815260200190565b60405180910390a2505050505050565b610d4a612540565b60008111610dc05760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a206475737420616d6f756e7420736860448201527f6f756c642062652067726561746572207468616e207a65726f00000000000000606482015260840161045c565b6001600160a01b03821660008181526003602052604090819020839055517f8ef429e6cec4339c5f0187fb930764fb967114bf09bc8bb06a552ba32923fd8690610e0d9084815260200190565b60405180910390a25050565b610e21612540565b60018190556040518181527fe44c6dd1fc3826ad24b81f17cf04849cedd368e002a52e89a845d14d3474e20a9060200160405180910390a150565b6000806000610e6b8585611486565b9050610e7785826125f6565b806102200151158015610e8d5750806102000151155b15610ee1576000816102400151610ea5576000610ed3565b8560a00151600081518110610eca57634e487b7160e01b600052603260045260246000fd5b60200260200101515b93506001925061035e915050565b600080610eee8784611895565b90925090506000610eff83836129b6565b6040805160208101909152600254908190528151610200870151929350121590600090610f3157856101000151610f38565b8561016001515b90506000610f47848385611f4e565b9b929a509198505050505050505050565b600080610f6787878787611dbd565b600090815260056020908152604080832086845290915290205491505095945050505050565b600080600084600114610ffc5760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a20696e76616c6964207661756c74206044820152707479706520746f206c697175696461746560781b606482015260840161045c565b60006110088787611486565b9050806102200151611025576000806000935093509350506112a5565b8060e0015142106110955760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a2063616e206e6f74206c697175696460448201527330ba329032bc3834b932b2103837b9b4ba34b7b760611b606482015260840161045c565b60075481516040516341976e0960e01b81526001600160a01b03918216600482015260009291909116906341976e099060240160206040518083038186803b1580156110e057600080fd5b505afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111891906139f8565b90506000604051806060016040528061115e8b6060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b60200260200101516008611327565b81526020016111728560c001516008611327565b8152602001611182846008611327565b815250905060006111a6846000015185602001518660400151876101c00151611dbd565b905060006111e58b60a001516000815181106111d257634e487b7160e01b600052603260045260246000fd5b6020026020010151866101800151611327565b9050600061120c838560000151866040015187602001518a60e001518b6101c00151611e0a565b905061121b8183519051131590565b156112365760008060009850985098505050505050506112a5565b600061125085602001518660400151896101c001516129e9565b90506000611275848760000151848960400151428d61018001518e6101c00151612a55565b6040988901516001600160a01b031660009081526003602052989098205460019b50979950969750505050505050505b93509350939050565b6112b6612540565b6001600160a01b03811661131b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b6113248161259a565b50565b604080516020810190915260008152604080516020810190915260008152601b83141561136b576040518060200160405280611362866113fb565b905290506113f2565b601b8311156113b857600061138184601b611462565b905060405180602001604052806113ad6113a884600a6113a19190613bd1565b899061146e565b6113fb565b8152509150506113f2565b60006113c584601b613d5a565b905060405180602001604052806113ec6113a884600a6113e59190613bd1565b899061147a565b90529150505b90505b92915050565b6000600160ff1b821061145e5760405162461bcd60e51b815260206004820152602560248201527f4c69624669786564506f696e74496e743235363a206f7574206f6620696e742060448201526472616e676560d81b606482015260840161045c565b5090565b60006113f28284613d5a565b60006113f28284613b7a565b60006113f28284613cfc565b6040805161026081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101829052610240810191909152604080516102608101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e0820181905261020082018190526102208201819052610240820152908401516115c390612b60565b151561020082015283516115d690612b60565b151561022082015260408401516115ec90612b60565b15156102408201526101a08101839052610200810151156116ee576000846020015160008151811061162e57634e487b7160e01b600052603260045260246000fd5b6020026020010151905061164181612029565b15156101e08801526101408701526101208601526001600160a01b03908116608086015290811660608501521660a083018190526040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156116ab57600080fd5b505afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190613a10565b60ff16610160830152505b806102200151156117dd576000846000015160008151811061172057634e487b7160e01b600052603260045260246000fd5b6020026020010151905061173381612029565b15156101c088015260e087015260c08601526001600160a01b039081166020808701919091529181168552919091166040808501829052805163313ce56760e01b81529051919263313ce56792600480840193829003018186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d29190613a10565b60ff16610100830152505b806102400151156113f257836040015160008151811061180d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190613a10565b60ff166101808201529392505050565b60408051602081019091526000815260408051602081019091526000815260008361022001516118d457604080516020810190915260025481526118fc565b6118fc856060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600084610200015161191f5760408051602081019091526002548152611947565b611947866080015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600085610240015161196a57604080516020810190915260025481526119a5565b6119a58760a0015160008151811061199257634e487b7160e01b600052603260045260246000fd5b6020026020010151876101800151611327565b905060008661022001516119c857604080516020810190915260025481526119d7565b6119d78760c001516008611327565b905060006040518060a001604052808961022001516119fa5789606001516119fd565b89515b6001600160a01b03168152602001896102200151611a1f578960a00151611a25565b89604001515b6001600160a01b03168152602001896102200151611a47578960800151611a4d565b89602001515b6001600160a01b03168152602001896102200151611a7057896101400151611a76565b8960e001515b8152602001896102200151611a9057896101e00151611a97565b896101c001515b151581525090508060600151421015611d0a57876101a0015160011415611c75576040808901516001600160a01b031660009081526003602052908120546101808a0151611ae59190611327565b60408051602081019091526002549081905285519192501215611b9f578051845113611b9f5760405162461bcd60e51b815260206004820152605b60248201527f4d617267696e43616c63756c61746f723a206e616b6564206d617267696e207660448201527f61756c742073686f756c64206861766520636f6c6c61746572616c20616d6f7560648201527f6e742067726561746572207468616e206475737420616d6f756e740000000000608482015260a40161045c565b60075489516040516341976e0960e01b81526001600160a01b039182166004820152600092611c2a9216906341976e099060240160206040518083038186803b158015611beb57600080fd5b505afa158015611bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2391906139f8565b6008611327565b90506000611c4b8b600001518c602001518d604001518e6101c00151611dbd565b905085611c64828a858989606001518a60800151611e0a565b99509950505050505050505061035e565b6000886102000151611c965760408051602081019091526002548152611ca6565b611ca68961012001516008611327565b9050816080015115611ce6576000611cc087878685612bb2565b905084611cd68285604001518660200151612bf4565b985098505050505050505061035e565b6000611cf487878685612d54565b905084611cd68285600001518660200151612bf4565b6000886102200151611d2b5760408051602081019091526002548152611d4c565b611d4c89600001518a602001518b60e001518c60c00151866080015161237b565b90506000896102000151611d6f5760408051602081019091526002548152611d92565b611d928a606001518b608001518c61014001518d6101200151876080015161237b565b90506000611da288888585612dc1565b905085611c64828660400151876020015188606001516123d1565b604080516001600160a01b039586166020808301919091529486168183015292909416606083015215156080808301919091528351808303909101815260a0909101909252815191012090565b6040805160208101909152600081526000611e258885612de7565b604080516020808201835260008c81526006825283812054835283519182019093529182529192506040805160208101909152600081526040805160208101909152600081528615611ed957611e8489611e7f868d61302d565b61306e565b9250611eb2611e9d611e96868d61302d565b8b906129b6565b60408051602081019091526002548152613093565b9150611ed28b611ecc84611ec6898861302d565b906130b1565b9061302d565b9050610589565b6000611ef26b033b2e3c9fd0803ce8000000601b611327565b9050611f0c81611e7f8d611f068e8a61302d565b906130db565b9350611f29611e9d611f228d611f068e8a61302d565b83906129b6565b9250611f3d8c611ecc85611ec68a8961302d565b9d9c50505050505050505050505050565b600080601b841415611f6c578451611f6590613112565b905061201f565b601b841115611fab576000611f82601b86613d5a565b9050611fa3611f9282600a613bd1565b8751611f9d90613112565b9061147a565b91505061201f565b6000611fb885601b613d5a565b9050600084611ff1576000611fe2611fd184600a613bd1565b8951611fdc90613112565b90613125565b90508015611fef57600191505b505b61201a8161201461200385600a613bd1565b8a5161200e90613112565b9061146e565b906125ea565b925050505b90505b9392505050565b6000806000806000806000879050806001600160a01b0316630812c4526040518163ffffffff1660e01b815260040160c06040518083038186803b15801561207057600080fd5b505afa9250505080156120a0575060408051601f3d908101601f1916820190925261209d91810190613809565b60015b61235c57806001600160a01b031663aabaecd66040518163ffffffff1660e01b815260040160206040518083038186803b1580156120dd57600080fd5b505afa1580156120f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612115919061360b565b816001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214e57600080fd5b505afa158015612162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612186919061360b565b826001600160a01b03166317d69bc86040518163ffffffff1660e01b815260040160206040518083038186803b1580156121bf57600080fd5b505afa1580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f7919061360b565b836001600160a01b031663c52987cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561223057600080fd5b505afa158015612244573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226891906139f8565b846001600160a01b031663ade6e2aa6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d991906139f8565b856001600160a01b031663f3c274a66040518163ffffffff1660e01b815260040160206040518083038186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234a9190613935565b96509650965096509650965050612372565b949b509299509097509550935091506123729050565b91939550919395565b6040805160208101909152600081526000612397846008611327565b905060006123a760016000611327565b905060006123b7828a8a8a6123d1565b90506123c48382876129e9565b9998505050505050505050565b604080516020810190915260008152826001600160a01b0316846001600160a01b031614156124015750836103f0565b6007546040516301957f8160e01b81526001600160a01b0386811660048301526024820185905260009216906301957f819060440160206040518083038186803b15801561244e57600080fd5b505afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248691906139f8565b6007546040516301957f8160e01b81526001600160a01b03878116600483015260248201879052929350600092909116906301957f819060440160206040518083038186803b1580156124d857600080fd5b505afa1580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251091906139f8565b9050612535612520826008611327565b611f0661252e856008611327565b8a9061302d565b979650505050505050565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113f28284613b34565b815151600110156126675760405162461bcd60e51b815260206004820152603560248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e792073686f7274604482015274081d951bdad95b9cc81a5b881d1a19481d985d5b1d605a1b606482015260840161045c565b600182602001515111156126da5760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e79206c6f6e67206044820152731d951bdad95b9cc81a5b881d1a19481d985d5b1d60621b606482015260840161045c565b600182604001515111156127565760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e7920636f6c6c6160448201527f746572616c2061737365747320696e20746865207661756c7400000000000000606482015260840161045c565b606082015151825151146127c65760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a2053686f727420617373657420616e6044820152700c840c2dadeeadce840dad2e6dac2e8c6d607b1b606482015260840161045c565b816080015151826020015151146128385760405162461bcd60e51b815260206004820152603060248201527f4d617267696e43616c63756c61746f723a204c6f6e6720617373657420616e6460448201526f040c2dadeeadce840dad2e6dac2e8c6d60831b606482015260840161045c565b8160a0015151826040015151146128b05760405162461bcd60e51b815260206004820152603660248201527f4d617267696e43616c63756c61746f723a20436f6c6c61746572616c206173736044820152750cae840c2dcc840c2dadeeadce840dad2e6dac2e8c6d60531b606482015260840161045c565b6128ba8282613131565b61292c5760405162461bcd60e51b815260206004820152603b60248201527f4d617267696e43616c63756c61746f723a206c6f6e67206173736574206e6f7460448201527f206d617267696e61626c6520666f722073686f72742061737365740000000000606482015260840161045c565b61293682826132e9565b6129b25760405162461bcd60e51b815260206004820152604160248201527f4d617267696e43616c63756c61746f723a20636f6c6c61746572616c2061737360448201527f6574206e6f74206d617267696e61626c6520666f722073686f727420617373656064820152601d60fa1b608482015260a40161045c565b5050565b60408051602081019091526000815260408051602081019091528251845182916129e091906133b1565b90529392505050565b6040805160208101909152600081528115612a2d578251845113612a1c5760408051602081019091526002548152612a26565b612a2684846129b6565b9050612022565b8351835113612a4b576040805160208101909152600254815261201f565b61201f83856129b6565b6000612a6d6040518060200160405280600081525090565b6000612a798a8a6130db565b90506000612a874288611462565b9050610e108110612a9a57819250612b54565b6040805160208101909152600081526000612ab8600154601b611327565b90508615612ade57612ad7611e9d612ad0838d61302d565b8d906129b6565b9150612afc565b612af98a611f06611e9d612af2858461302d565b8f906129b6565b91505b506000612b0a836012611327565b90506000612b1b610e106012611327565b9050612b39612b3282611f0685611ecc8a896129b6565b84906130b1565b9550612b4786865190511390565b15612b50578495505b5050505b61058983876001611f4e565b60008082511180156113f5575060006001600160a01b031682600081518110612b9957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141592915050565b604080516020810190915260008152612beb611e9d612bdb612bd4888861306e565b859061302d565b612be5888761302d565b906129b6565b95945050505050565b604080516020810190915260008152816001600160a01b0316836001600160a01b03161415612c24575082612022565b6007546040516341976e0960e01b81526001600160a01b03858116600483015260009216906341976e099060240160206040518083038186803b158015612c6a57600080fd5b505afa158015612c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca291906139f8565b6007546040516341976e0960e01b81526001600160a01b038681166004830152929350600092909116906341976e099060240160206040518083038186803b158015612ced57600080fd5b505afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2591906139f8565b9050612d4a612d35826008611327565b611f06612d43856008611327565b899061302d565b9695505050505050565b604080516020808201835260008252825190810190925260025491829052825190911415612d9057612d89611e9d86866129b6565b90506103f0565b6000612da483611f0688611ecc83896129b6565b90506000612db5611e9d88886129b6565b90506125358282613093565b604080516020810190915260008152612beb612ddd838661302d565b612be5858861302d565b604080516020810190915260008152600083815260046020908152604080832080548251818502810185019093528083529192909190830182828015612e4c57602002820191906000526020600020905b815481526020019060010190808311612e38575b50505050509050805160001415612ebd5760405162461bcd60e51b815260206004820152602f60248201527f4d617267696e43616c63756c61746f723a2070726f647563742068617665206e60448201526e6f206578706972792076616c75657360881b606482015260840161045c565b6000612ec98442611462565b90508082612ee26001855161146290919063ffffffff16565b81518110612f0057634e487b7160e01b600052603260045260246000fd5b60200260200101511015612f725760405162461bcd60e51b815260206004820152603360248201527f4d617267696e43616c63756c61746f723a2070726f647563742068617665206e6044820152726f20757070657220626f756e642076616c756560681b606482015260840161045c565b60005b82518160ff1610156130245781838260ff1681518110612fa557634e487b7160e01b600052603260045260246000fd5b60200260200101511061301257600086815260056020526040812084516130089290869060ff8616908110612fea57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054601b611327565b93505050506113f5565b8061301c81613d8c565b915050612f75565b50505092915050565b60408051602081019091526000815260408051602081019091528251845182916b033b2e3c9fd0803ce800000091613064916133bd565b6129e09190613b4c565b604080516020810190915260008152815183511261308c57816113f2565b5090919050565b604080516020810190915260008152815183511361308c57816113f2565b60408051602081019091526000815260408051602081019091528251845182916129e091906133c9565b604080516020810190915260008152604080516020810190915282518451829190613064906b033b2e3c9fd0803ce80000006133bd565b60008082121561145e576113f582613dc0565b60006113f28284613dac565b6000816101a00151600114156131ba57816102000151156131ba5760405162461bcd60e51b815260206004820152603c60248201527f4d617267696e43616c63756c61746f723a206e616b6564206d617267696e207660448201527f61756c742063616e6e6f742068617665206c6f6e672076546f6b656e00000000606482015260840161045c565b81610200015115806131cf5750816102200151155b156131dc575060016113f5565b825180516000906131fd57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316836020015160008151811061323357634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415801561326b575081600001516001600160a01b031682606001516001600160a01b0316145b8015613290575081602001516001600160a01b031682608001516001600160a01b0316145b80156132b5575081604001516001600160a01b03168260a001516001600160a01b0316145b80156132c957508160e00151826101400151145b80156113f25750816101c001511515826101e00151151514905092915050565b6102408101516000906001906133005790506113f5565b8261022001511561335757836040015160008151811061333057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031683604001516001600160a01b03161490506113f2565b826102000151156113f257836040015160008151811061338757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168360a001516001600160a01b0316149050905092915050565b60006113f28284613d1b565b60006113f28284613c79565b60006113f28284613af3565b600082601f8301126133e5578081fd5b813560206133fa6133f583613acf565b613a9e565b80838252828201915082860187848660051b8901011115613419578586fd5b855b8581101561344057813561342e81613e1c565b8452928401929084019060010161341b565b5090979650505050505050565b60008083601f84011261345e578182fd5b50813567ffffffffffffffff811115613475578182fd5b6020830191508360208260051b850101111561035e57600080fd5b600082601f8301126134a0578081fd5b813560206134b06133f583613acf565b80838252828201915082860187848660051b89010111156134cf578586fd5b855b85811015613440578135845292840192908401906001016134d1565b600060c082840312156134fe578081fd5b613506613a75565b9050813567ffffffffffffffff8082111561352057600080fd5b61352c858386016133d5565b8352602084013591508082111561354257600080fd5b61354e858386016133d5565b6020840152604084013591508082111561356757600080fd5b613573858386016133d5565b6040840152606084013591508082111561358c57600080fd5b61359885838601613490565b606084015260808401359150808211156135b157600080fd5b6135bd85838601613490565b608084015260a08401359150808211156135d657600080fd5b506135e384828501613490565b60a08301525092915050565b600060208284031215613600578081fd5b81356113f281613e1c565b60006020828403121561361c578081fd5b81516113f281613e1c565b6000806000806080858703121561363c578283fd5b843561364781613e1c565b9350602085013561365781613e1c565b9250604085013561366781613e1c565b9150606085013561367781613e31565b939692955090935050565b60008060008060008060008060c0898b03121561369d578384fd5b88356136a881613e1c565b975060208901356136b881613e1c565b965060408901356136c881613e1c565b955060608901356136d881613e31565b9450608089013567ffffffffffffffff808211156136f4578586fd5b6137008c838d0161344d565b909650945060a08b0135915080821115613718578384fd5b506137258b828c0161344d565b999c989b5096995094979396929594505050565b600080600080600060a08688031215613750578081fd5b853561375b81613e1c565b9450602086013561376b81613e1c565b9350604086013561377b81613e1c565b9250606086013561378b81613e31565b949793965091946080013592915050565b60008060008060008060c087890312156137b4578182fd5b86356137bf81613e1c565b955060208701356137cf81613e1c565b945060408701356137df81613e1c565b935060608701356137ef81613e31565b9598949750929560808101359460a0909101359350915050565b60008060008060008060c08789031215613821578384fd5b865161382c81613e1c565b602088015190965061383d81613e1c565b604088015190955061384e81613e1c565b80945050606087015192506080870151915060a087015161386e81613e31565b809150509295509295509295565b60008060008060008060008060006101208a8c03121561389a578283fd5b89356138a581613e1c565b985060208a01356138b581613e1c565b975060408a01356138c581613e1c565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013591506101008a01356138f981613e31565b809150509295985092959850929598565b6000806040838503121561391c578182fd5b823561392781613e1c565b946020939093013593505050565b600060208284031215613946578081fd5b81516113f281613e31565b60008060408385031215613963578182fd5b823567ffffffffffffffff811115613979578283fd5b613985858286016134ed565b95602094909401359450505050565b6000806000606084860312156139a8578081fd5b833567ffffffffffffffff8111156139be578182fd5b6139ca868287016134ed565b9660208601359650604090950135949350505050565b6000602082840312156139f1578081fd5b5035919050565b600060208284031215613a09578081fd5b5051919050565b600060208284031215613a21578081fd5b815160ff811681146113f2578182fd5b6020808252825182820181905260009190848201906040850190845b81811015613a6957835183529284019291840191600101613a4d565b50909695505050505050565b60405160c0810167ffffffffffffffff81118282101715613a9857613a98613e06565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ac757613ac7613e06565b604052919050565b600067ffffffffffffffff821115613ae957613ae9613e06565b5060051b60200190565b600080821280156001600160ff1b0384900385131615613b1557613b15613dda565b600160ff1b8390038412811615613b2e57613b2e613dda565b50500190565b60008219821115613b4757613b47613dda565b500190565b600082613b5b57613b5b613df0565b600160ff1b821460001984141615613b7557613b75613dda565b500590565b600082613b8957613b89613df0565b500490565b600181815b80851115613bc9578160001904821115613baf57613baf613dda565b80851615613bbc57918102915b93841c9390800290613b93565b509250929050565b60006113f28383600082613be7575060016113f5565b81613bf4575060006113f5565b8160018114613c0a5760028114613c1457613c30565b60019150506113f5565b60ff841115613c2557613c25613dda565b50506001821b6113f5565b5060208310610133831016604e8410600b8410161715613c53575081810a6113f5565b613c5d8383613b8e565b8060001904821115613c7157613c71613dda565b029392505050565b60006001600160ff1b0381841382841380821686840486111615613c9f57613c9f613dda565b600160ff1b84871282811687830589121615613cbd57613cbd613dda565b858712925087820587128484161615613cd857613cd8613dda565b87850587128184161615613cee57613cee613dda565b505050929093029392505050565b6000816000190483118215151615613d1657613d16613dda565b500290565b60008083128015600160ff1b850184121615613d3957613d39613dda565b6001600160ff1b0384018313811615613d5457613d54613dda565b50500390565b600082821015613d6c57613d6c613dda565b500390565b6000600019821415613d8557613d85613dda565b5060010190565b600060ff821660ff811415613da357613da3613dda565b60010192915050565b600082613dbb57613dbb613df0565b500690565b6000600160ff1b821415613dd657613dd6613dda565b0390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461132457600080fd5b801515811461132457600080fdfea2646970667358221220db3081fb48bdf26eac7463f770cd60f6521994b2f05874cb9ad5c6057a17ea6264736f6c63430008040033",
    "linkReferences": {},
    "deployedLinkReferences": {}
}
