{
  "_format": "hh-sol-artifact-1",
  "contractName": "TransformerOracle",
  "sourceName": "solidity/contracts/TransformerOracle.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ITransformerRegistry",
          "name": "_registry",
          "type": "address"
        },
        {
          "internalType": "contract ITokenPriceOracle",
          "name": "_underlyingOracle",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_superAdmin",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "_initialAdmins",
          "type": "address[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "tokenB",
          "type": "address"
        }
      ],
      "name": "PairCannotBeSupported",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "tokenB",
          "type": "address"
        }
      ],
      "name": "PairNotSupportedYet",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "dependents",
          "type": "address[]"
        }
      ],
      "name": "DependentsWillAvoidMappingToUnderlying",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "dependents",
          "type": "address[]"
        }
      ],
      "name": "DependentsWillMapToUnderlying",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            }
          ],
          "indexed": false,
          "internalType": "struct ITransformerOracle.Pair[]",
          "name": "pairs",
          "type": "tuple[]"
        }
      ],
      "name": "PairSpecificConfigCleared",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "mapTokenAToUnderlying",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "mapTokenBToUnderlying",
              "type": "bool"
            }
          ],
          "indexed": false,
          "internalType": "struct ITransformerOracle.PairSpecificMappingConfigToSet[]",
          "name": "config",
          "type": "tuple[]"
        }
      ],
      "name": "PairSpecificConfigSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "REGISTRY",
      "outputs": [
        {
          "internalType": "contract ITransformerRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SUPER_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UNDERLYING_ORACLE",
      "outputs": [
        {
          "internalType": "contract ITokenPriceOracle",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "addOrModifySupportForPair",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "addSupportForPairIfNeeded",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_dependents",
          "type": "address[]"
        }
      ],
      "name": "avoidMappingToUnderlying",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        }
      ],
      "name": "canSupportPair",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            }
          ],
          "internalType": "struct ITransformerOracle.Pair[]",
          "name": "_pairs",
          "type": "tuple[]"
        }
      ],
      "name": "clearPairSpecificMappingConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        }
      ],
      "name": "getMappingForPair",
      "outputs": [
        {
          "internalType": "address",
          "name": "_mappedTokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_mappedTokenB",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        }
      ],
      "name": "getRecursiveMappingForPair",
      "outputs": [
        {
          "internalType": "address",
          "name": "_mappedTokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_mappedTokenB",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        }
      ],
      "name": "isPairAlreadySupported",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenA",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_tokenB",
          "type": "address"
        }
      ],
      "name": "pairSpecificMappingConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "mapTokenAToUnderlying",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "mapTokenBToUnderlying",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "isSet",
              "type": "bool"
            }
          ],
          "internalType": "struct ITransformerOracle.PairSpecificMappingConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenIn",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amountIn",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_tokenOut",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "quote",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_amountOut",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            },
            {
              "internalType": "bool",
              "name": "mapTokenAToUnderlying",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "mapTokenBToUnderlying",
              "type": "bool"
            }
          ],
          "internalType": "struct ITransformerOracle.PairSpecificMappingConfigToSet[]",
          "name": "_config",
          "type": "tuple[]"
        }
      ],
      "name": "setPairSpecificMappingConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "_dependents",
          "type": "address[]"
        }
      ],
      "name": "shouldMapToUnderlying",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "_interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "willAvoidMappingToUnderlying",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60c06040523480156200001157600080fd5b506040516200327a3803806200327a83398101604081905262000034916200029d565b6001600160a01b03841615806200005257506001600160a01b038316155b806200006557506001600160a01b038216155b15620000845760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516608052831660a052620000b26000805160206200323a8339815191528062000161565b620000dc6000805160206200325a8339815191526000805160206200323a83398151915262000161565b620000f76000805160206200323a83398151915283620001ac565b60005b81518110156200015657620001416000805160206200325a8339815191528383815181106200012d576200012d620003b1565b6020026020010151620001ac60201b60201c565b806200014d81620003c7565b915050620000fa565b5050505050620003ef565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b620001b88282620001bc565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001b8576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002183390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b03811681146200027257600080fd5b50565b805162000282816200025c565b919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215620002b457600080fd5b8451620002c1816200025c565b80945050602080860151620002d6816200025c565b6040870151909450620002e9816200025c565b60608701519093506001600160401b03808211156200030757600080fd5b818801915088601f8301126200031c57600080fd5b81518181111562000331576200033162000287565b8060051b604051601f19603f8301168101818110858211171562000359576200035962000287565b60405291825284820192508381018501918b8311156200037857600080fd5b938501935b82851015620003a157620003918562000275565b845293850193928501926200037d565b989b979a50959850505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620003e857634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a051612ded6200044d600039600081816103fd015281816109ef01528181610ba601528181610e8d01528181610f6901526114b20152600081816101d501528181611857015281816119910152611ab20152612ded6000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806375b238fc116100ee578063ac91249011610097578063d08a8a1911610071578063d08a8a1914610452578063d0a26eb314610465578063d547741f14610478578063dd7de37e1461048b57600080fd5b8063ac912490146103f8578063ac9650d81461041f578063bb17b30e1461043f57600080fd5b80639363edd6116100c85780639363edd6146103a2578063a217fddf146103b5578063aa1d6456146103bd57600080fd5b806375b238fc146103215780637fffb0f21461034857806391d148541461036b57600080fd5b80632f2ff15d11610150578063720d299a1161012a578063720d299a146102e8578063734273fd146102fb57806374e6f7771461030e57600080fd5b80632f2ff15d1461029b57806336568abe146102ae5780634460bdd6146102c157600080fd5b8063093ac3bf11610181578063093ac3bf14610242578063248a9ca31461025557806328f2d4811461028657600080fd5b806301ffc9a7146101a857806306433b1b146101d05780630891fbfe1461020f575b600080fd5b6101bb6101b636600461216a565b61049e565b60405190151581526020015b60405180910390f35b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c7565b61022261021d3660046121c1565b610509565b604080516001600160a01b039384168152929091166020830152016101c7565b6102226102503660046121c1565b610541565b6102786102633660046121fa565b60009081526020819052604090206001015490565b6040519081526020016101c7565b610299610294366004612213565b61055d565b005b6102996102a9366004612288565b61066d565b6102996102bc366004612288565b610697565b6102787f7613a25ecc738585a232ad50a301178f12b3ba8887d13e138b523c4269c4768981565b6102996102f63660046122ad565b610742565b6101bb6103093660046121c1565b61099a565b61029961031c366004612355565b610a66565b6102787fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6101bb610356366004612397565b60016020526000908152604090205460ff1681565b6101bb610379366004612288565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6101bb6103b03660046121c1565b610b51565b610278600081565b6103d06103cb3660046121c1565b610bd7565b60408051825115158152602080840151151590820152918101511515908201526060016101c7565b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b61043261042d366004612355565b610c4e565b6040516101c79190612404565b61029961044d366004612355565b610d43565b6102786104603660046124c6565b610e2f565b610299610473366004612539565b610e4b565b610299610486366004612288565b610f02565b610299610499366004612539565b610f27565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167feb954a0c0000000000000000000000000000000000000000000000000000000014806104f457506104f482610fa4565b80610503575061050382610ff6565b92915050565b60008060008061051c86866001806110d9565b9150915061052a868361110b565b9350610536858261110b565b925050509250929050565b60008061055184846001806111d3565b915091505b9250929050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561058781611248565b60005b8281101561062e57600260006105f08686858181106105ab576105ab61259e565b6105c19260206040909202019081019150612397565b8787868181106105d3576105d361259e565b90506040020160200160208101906105eb9190612397565b611255565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905560010161058a565b507fa2f971e0a8c59fff91d7cc35080f0195d9972253b7abb55c7c3c61b7c5043cda83836040516106609291906125cd565b60405180910390a1505050565b60008281526020819052604090206001015461068881611248565b61069283836112c5565b505050565b6001600160a01b0381163314610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61073e8282611381565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561076c81611248565b60005b8281101561096857600084848381811061078b5761078b61259e565b9050608002018036038101906107a191906126ca565b9050600080600083602001516001600160a01b031684600001516001600160a01b031610610832576020848101518551604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b8116828701529290931b90911660348301528051808303602801815260489092019052805191012084606001518560400151610897565b8351602080860151604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606095861b8116828601529290941b909116603484015280518084036028018152604890930190528151910120846040015185606001515b6040805160608101825292151583529015156020808401918252600184840181815260009687526002909252929094209251835491519451151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff951515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179390931692909217905594909401935061076f92505050565b507f61353c492a49b4012e526db1626e4ca9aba3df1407bf42ceb43a7925bd451e28838360405161066092919061274f565b60008060006109a98585610541565b6040517f734273fd0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015280831660248301529294509092507f00000000000000000000000000000000000000000000000000000000000000009091169063734273fd906044015b602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d91906127d3565b95945050505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610a9081611248565b60005b82811015610b1f576001806000868685818110610ab257610ab261259e565b9050602002016020810190610ac79190612397565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580610b178161281f565b915050610a93565b507f816a8065d2266672dfcb0546e9ba21080cfbd3435be9214beb5b0995b981c9128383604051610660929190612857565b6000806000610b608585610541565b6040517f9363edd60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015280831660248301529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690639363edd690604401610a1c565b604080516060810182526000808252602082018190529181019190915260026000610c028585611255565b815260208082019290925260409081016000208151606081018352905460ff80821615158352610100820481161515948301949094526201000090049092161515908201529392505050565b60608167ffffffffffffffff811115610c6957610c69612633565b604051908082528060200260200182016040528015610c9c57816020015b6060815260200190600190039081610c875790505b50905060005b82811015610d3c57610d0c30858584818110610cc057610cc061259e565b9050602002810190610cd291906128a5565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061141e92505050565b828281518110610d1e57610d1e61259e565b60200260200101819052508080610d349061281f565b915050610ca2565b5092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610d6d81611248565b60005b82811015610dfd57600060016000868685818110610d9057610d9061259e565b9050602002016020810190610da59190612397565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580610df58161281f565b915050610d70565b507fa877e7e16ff37af41d1236c6ab1b0cb74e88bfae5b2a476286a63be1ca5483c18383604051610660929190612857565b6000610e41868686868660018061144a565b9695505050505050565b600080610e588686610541565b6040517fd0a26eb300000000000000000000000000000000000000000000000000000000815291935091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d0a26eb390610ec8908590859089908990600401612935565b600060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b50505050505050505050565b600082815260208190526040902060010154610f1d81611248565b6106928383611381565b600080610f348686610541565b6040517fdd7de37e00000000000000000000000000000000000000000000000000000000815291935091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dd7de37e90610ec8908590859089908990600401612935565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806105035750610503825b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3d7499ff00000000000000000000000000000000000000000000000000000000148061108957507fffffffff0000000000000000000000000000000000000000000000000000000082167fac9650d800000000000000000000000000000000000000000000000000000000145b8061050357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610503565b6000806000806110eb8888888861179b565b915091506110fb88888484611b4e565b9350935050505b94509492505050565b60006001600160a01b038216611122575081610503565b6040517f4e89a7110000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009190841690634e89a71190602401600060405180830381865afa158015611185573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ad9190810190612986565b9050806000815181106111c2576111c261259e565b602002602001015191505092915050565b6000806000806111e5888888886110d9565b90925090506001600160a01b03821615801561120857506001600160a01b038116155b1561121a578787935093505050611102565b6110fb611227898461110b565b611231898461110b565b6001600160a01b03858116151590851615156111d3565b6112528133611c65565b50565b60008060006112648585611cfd565b60408051606084811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529185901b16603483015282516028818403018152604890920190925280519101209193509150610a5d565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661073e576000828152602081815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561133d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561073e576000828152602081815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606114438383604051806060016040528060278152602001612d9160279139611d2e565b9392505050565b600080600061145b8a8987876110d9565b90925090506001600160a01b038083161580159183161515908261147d575080155b1561153b576040517fd08a8a190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d08a8a19906114ef908f908f908f908f908f90600401612a1a565b602060405180830381865afa15801561150c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115309190612a4d565b945050505050611790565b8115611619576040517fa1e8b1d50000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018d90526000919086169063a1e8b1d590604401600060405180830381865afa1580156115ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115d39190810190612a66565b9050806000815181106115e8576115e861259e565b6020026020010151600001519c50806000815181106116095761160961259e565b6020026020010151602001519b50505b8015611779576040517f4e89a7110000000000000000000000000000000000000000000000000000000081526001600160a01b038b8116600483015260009190851690634e89a71190602401600060405180830381865afa158015611682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116aa9190810190612986565b905060006116d88e8e846000815181106116c6576116c661259e565b60200260200101518e8e89600161144a565b9050846001600160a01b0316632d5403008d61170e856000815181106117005761170061259e565b602002602001015185611e32565b6040518363ffffffff1660e01b815260040161172b929190612b1a565b602060405180830381865afa158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c9190612a4d565b9650505050505050611790565b6117898c8c8c8c8c87600061144a565b9450505050505b979650505050505050565b6000808380156117a85750825b156119145760408051600280825260608201835260009260208301908036833701905050905086816000815181106117e2576117e261259e565b60200260200101906001600160a01b031690816001600160a01b03168152505085816001815181106118165761181661259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b9061188c908590600401612b7f565b600060405180830381865afa1580156118a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118d19190810190612bcc565b9050806000815181106118e6576118e661259e565b6020026020010151816001815181106119015761190161259e565b6020026020010151935093505050611102565b8315611a35576040805160018082528183019092526000916020808301908036833701905050905086816000815181106119505761195061259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b906119c6908590600401612b7f565b600060405180830381865afa1580156119e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0b9190810190612bcc565b905080600081518110611a2057611a2061259e565b60200260200101516000935093505050611102565b8215611b4357604080516001808252818301909252600091602080830190803683370190505090508581600081518110611a7157611a7161259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b90611ae7908590600401612b7f565b600060405180830381865afa158015611b04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b2c9190810190612bcc565b90506000816000815181106119015761190161259e565b506000905080611102565b6000806001600160a01b03848116151590841615158180611b6c5750805b15611c5a576000806000611b808b8b610bd7565b9050806040015115611bf557848015611bbc5750896001600160a01b03168b6001600160a01b031610611bb857806020015115611bbc565b8051155b9250838015611bee5750896001600160a01b03168b6001600160a01b031610611be757805115611bee565b8060200151155b9150611c44565b848015611c1a57506001600160a01b038b1660009081526001602052604090205460ff165b9250838015611c4157506001600160a01b038a1660009081526001602052604090205460ff165b91505b82611c4d578896505b81611c56578795505b5050505b505094509492505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661073e57611ca1816001600160a01b03166014611ed4565b611cac836020611ed4565b604051602001611cbd929190612c5b565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261072b91600401612cdc565b600080826001600160a01b0316846001600160a01b031610611d20578284611d23565b83835b909590945092505050565b60606001600160a01b0384163b611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e74726163740000000000000000000000000000000000000000000000000000606482015260840161072b565b600080856001600160a01b031685604051611de29190612cef565b600060405180830381855af49150503d8060008114611e1d576040519150601f19603f3d011682016040523d82523d6000602084013e611e22565b606091505b5091509150610e41828286612117565b604080516001808252818301909252606091816020015b6040805180820190915260008082526020820152815260200190600190039081611e495790505090508281600081518110611e8657611e8661259e565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508181600081518110611ebe57611ebe61259e565b6020026020010151602001818152505092915050565b60606000611ee3836002612d0b565b611eee906002612d48565b67ffffffffffffffff811115611f0657611f06612633565b6040519080825280601f01601f191660200182016040528015611f30576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f6757611f6761259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fca57611fca61259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612006846002612d0b565b612011906001612d48565b90505b60018111156120ae577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106120525761205261259e565b1a60f81b8282815181106120685761206861259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936120a781612d5b565b9050612014565b508315611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161072b565b60608315612126575081611443565b8251156121365782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b9190612cdc565b60006020828403121561217c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461144357600080fd5b6001600160a01b038116811461125257600080fd5b600080604083850312156121d457600080fd5b82356121df816121ac565b915060208301356121ef816121ac565b809150509250929050565b60006020828403121561220c57600080fd5b5035919050565b6000806020838503121561222657600080fd5b823567ffffffffffffffff8082111561223e57600080fd5b818501915085601f83011261225257600080fd5b81358181111561226157600080fd5b8660208260061b850101111561227657600080fd5b60209290920196919550909350505050565b6000806040838503121561229b57600080fd5b8235915060208301356121ef816121ac565b600080602083850312156122c057600080fd5b823567ffffffffffffffff808211156122d857600080fd5b818501915085601f8301126122ec57600080fd5b8135818111156122fb57600080fd5b8660208260071b850101111561227657600080fd5b60008083601f84011261232257600080fd5b50813567ffffffffffffffff81111561233a57600080fd5b6020830191508360208260051b850101111561055657600080fd5b6000806020838503121561236857600080fd5b823567ffffffffffffffff81111561237f57600080fd5b61238b85828601612310565b90969095509350505050565b6000602082840312156123a957600080fd5b8135611443816121ac565b60005b838110156123cf5781810151838201526020016123b7565b50506000910152565b600081518084526123f08160208601602086016123b4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612477577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526124658583516123d8565b9450928501929085019060010161242b565b5092979650505050505050565b60008083601f84011261249657600080fd5b50813567ffffffffffffffff8111156124ae57600080fd5b60208301915083602082850101111561055657600080fd5b6000806000806000608086880312156124de57600080fd5b85356124e9816121ac565b9450602086013593506040860135612500816121ac565b9250606086013567ffffffffffffffff81111561251c57600080fd5b61252888828901612484565b969995985093965092949392505050565b6000806000806060858703121561254f57600080fd5b843561255a816121ac565b9350602085013561256a816121ac565b9250604085013567ffffffffffffffff81111561258657600080fd5b61259287828801612484565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252818101839052600090604080840186845b878110156126265781356125f6816121ac565b6001600160a01b0390811684528286013590612611826121ac565b168386015291830191908301906001016125e3565b5090979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561268557612685612633565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b4576126b4612633565b604052919050565b801515811461125257600080fd5b6000608082840312156126dc57600080fd5b6040516080810181811067ffffffffffffffff821117156126ff576126ff612633565b604052823561270d816121ac565b8152602083013561271d816121ac565b60208201526040830135612730816126bc565b60408201526060830135612743816126bc565b60608201529392505050565b6020808252818101839052600090604080840186845b87811015612626578135612778816121ac565b6001600160a01b0390811684528286013590612793826121ac565b1683860152818401356127a5816126bc565b1515838501526060828101356127ba816126bc565b1515908401526080928301929190910190600101612765565b6000602082840312156127e557600080fd5b8151611443816126bc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612850576128506127f0565b5060010190565b60208082528181018390526000908460408401835b8681101561289a57823561287f816121ac565b6001600160a01b03168252918301919083019060010161286c565b509695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128da57600080fd5b83018035915067ffffffffffffffff8211156128f557600080fd5b60200191503681900382131561055657600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60006001600160a01b03808716835280861660208401525060606040830152610e4160608301848661290a565b600067ffffffffffffffff82111561297c5761297c612633565b5060051b60200190565b6000602080838503121561299957600080fd5b825167ffffffffffffffff8111156129b057600080fd5b8301601f810185136129c157600080fd5b80516129d46129cf82612962565b61268b565b81815260059190911b820183019083810190878311156129f357600080fd5b928401925b82841015611790578351612a0b816121ac565b825292840192908401906129f8565b60006001600160a01b0380881683528660208401528086166040840152506080606083015261179060808301848661290a565b600060208284031215612a5f57600080fd5b5051919050565b60006020808385031215612a7957600080fd5b825167ffffffffffffffff811115612a9057600080fd5b8301601f81018513612aa157600080fd5b8051612aaf6129cf82612962565b81815260069190911b82018301908381019087831115612ace57600080fd5b928401925b828410156117905760408489031215612aec5760008081fd5b612af4612662565b8451612aff816121ac565b81528486015186820152825260409093019290840190612ad3565b600060408083016001600160a01b03808716855260208381870152828751808552606088019150828901945060005b81811015612b70578551805186168452840151848401529483019491860191600101612b49565b50909998505050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc05783516001600160a01b031683529284019291840191600101612b9b565b50909695505050505050565b60006020808385031215612bdf57600080fd5b825167ffffffffffffffff811115612bf657600080fd5b8301601f81018513612c0757600080fd5b8051612c156129cf82612962565b81815260059190911b82018301908381019087831115612c3457600080fd5b928401925b82841015611790578351612c4c816121ac565b82529284019290840190612c39565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612c938160178501602088016123b4565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612cd08160288401602088016123b4565b01602801949350505050565b60208152600061144360208301846123d8565b60008251612d018184602087016123b4565b9190910192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d4357612d436127f0565b500290565b80820180821115610503576105036127f0565b600081612d6a57612d6a6127f0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201115eaf484d97092865e09e5436005f424be7381ebd4f7ed9de2ad5f75014eb564736f6c634300081000337613a25ecc738585a232ad50a301178f12b3ba8887d13e138b523c4269c47689a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101a35760003560e01c806375b238fc116100ee578063ac91249011610097578063d08a8a1911610071578063d08a8a1914610452578063d0a26eb314610465578063d547741f14610478578063dd7de37e1461048b57600080fd5b8063ac912490146103f8578063ac9650d81461041f578063bb17b30e1461043f57600080fd5b80639363edd6116100c85780639363edd6146103a2578063a217fddf146103b5578063aa1d6456146103bd57600080fd5b806375b238fc146103215780637fffb0f21461034857806391d148541461036b57600080fd5b80632f2ff15d11610150578063720d299a1161012a578063720d299a146102e8578063734273fd146102fb57806374e6f7771461030e57600080fd5b80632f2ff15d1461029b57806336568abe146102ae5780634460bdd6146102c157600080fd5b8063093ac3bf11610181578063093ac3bf14610242578063248a9ca31461025557806328f2d4811461028657600080fd5b806301ffc9a7146101a857806306433b1b146101d05780630891fbfe1461020f575b600080fd5b6101bb6101b636600461216a565b61049e565b60405190151581526020015b60405180910390f35b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c7565b61022261021d3660046121c1565b610509565b604080516001600160a01b039384168152929091166020830152016101c7565b6102226102503660046121c1565b610541565b6102786102633660046121fa565b60009081526020819052604090206001015490565b6040519081526020016101c7565b610299610294366004612213565b61055d565b005b6102996102a9366004612288565b61066d565b6102996102bc366004612288565b610697565b6102787f7613a25ecc738585a232ad50a301178f12b3ba8887d13e138b523c4269c4768981565b6102996102f63660046122ad565b610742565b6101bb6103093660046121c1565b61099a565b61029961031c366004612355565b610a66565b6102787fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6101bb610356366004612397565b60016020526000908152604090205460ff1681565b6101bb610379366004612288565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6101bb6103b03660046121c1565b610b51565b610278600081565b6103d06103cb3660046121c1565b610bd7565b60408051825115158152602080840151151590820152918101511515908201526060016101c7565b6101f77f000000000000000000000000000000000000000000000000000000000000000081565b61043261042d366004612355565b610c4e565b6040516101c79190612404565b61029961044d366004612355565b610d43565b6102786104603660046124c6565b610e2f565b610299610473366004612539565b610e4b565b610299610486366004612288565b610f02565b610299610499366004612539565b610f27565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167feb954a0c0000000000000000000000000000000000000000000000000000000014806104f457506104f482610fa4565b80610503575061050382610ff6565b92915050565b60008060008061051c86866001806110d9565b9150915061052a868361110b565b9350610536858261110b565b925050509250929050565b60008061055184846001806111d3565b915091505b9250929050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561058781611248565b60005b8281101561062e57600260006105f08686858181106105ab576105ab61259e565b6105c19260206040909202019081019150612397565b8787868181106105d3576105d361259e565b90506040020160200160208101906105eb9190612397565b611255565b8152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905560010161058a565b507fa2f971e0a8c59fff91d7cc35080f0195d9972253b7abb55c7c3c61b7c5043cda83836040516106609291906125cd565b60405180910390a1505050565b60008281526020819052604090206001015461068881611248565b61069283836112c5565b505050565b6001600160a01b0381163314610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61073e8282611381565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561076c81611248565b60005b8281101561096857600084848381811061078b5761078b61259e565b9050608002018036038101906107a191906126ca565b9050600080600083602001516001600160a01b031684600001516001600160a01b031610610832576020848101518551604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b8116828701529290931b90911660348301528051808303602801815260489092019052805191012084606001518560400151610897565b8351602080860151604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606095861b8116828601529290941b909116603484015280518084036028018152604890930190528151910120846040015185606001515b6040805160608101825292151583529015156020808401918252600184840181815260009687526002909252929094209251835491519451151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff951515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179390931692909217905594909401935061076f92505050565b507f61353c492a49b4012e526db1626e4ca9aba3df1407bf42ceb43a7925bd451e28838360405161066092919061274f565b60008060006109a98585610541565b6040517f734273fd0000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015280831660248301529294509092507f00000000000000000000000000000000000000000000000000000000000000009091169063734273fd906044015b602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d91906127d3565b95945050505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610a9081611248565b60005b82811015610b1f576001806000868685818110610ab257610ab261259e565b9050602002016020810190610ac79190612397565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580610b178161281f565b915050610a93565b507f816a8065d2266672dfcb0546e9ba21080cfbd3435be9214beb5b0995b981c9128383604051610660929190612857565b6000806000610b608585610541565b6040517f9363edd60000000000000000000000000000000000000000000000000000000081526001600160a01b03808416600483015280831660248301529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690639363edd690604401610a1c565b604080516060810182526000808252602082018190529181019190915260026000610c028585611255565b815260208082019290925260409081016000208151606081018352905460ff80821615158352610100820481161515948301949094526201000090049092161515908201529392505050565b60608167ffffffffffffffff811115610c6957610c69612633565b604051908082528060200260200182016040528015610c9c57816020015b6060815260200190600190039081610c875790505b50905060005b82811015610d3c57610d0c30858584818110610cc057610cc061259e565b9050602002810190610cd291906128a5565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061141e92505050565b828281518110610d1e57610d1e61259e565b60200260200101819052508080610d349061281f565b915050610ca2565b5092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610d6d81611248565b60005b82811015610dfd57600060016000868685818110610d9057610d9061259e565b9050602002016020810190610da59190612397565b6001600160a01b03168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580610df58161281f565b915050610d70565b507fa877e7e16ff37af41d1236c6ab1b0cb74e88bfae5b2a476286a63be1ca5483c18383604051610660929190612857565b6000610e41868686868660018061144a565b9695505050505050565b600080610e588686610541565b6040517fd0a26eb300000000000000000000000000000000000000000000000000000000815291935091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d0a26eb390610ec8908590859089908990600401612935565b600060405180830381600087803b158015610ee257600080fd5b505af1158015610ef6573d6000803e3d6000fd5b50505050505050505050565b600082815260208190526040902060010154610f1d81611248565b6106928383611381565b600080610f348686610541565b6040517fdd7de37e00000000000000000000000000000000000000000000000000000000815291935091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dd7de37e90610ec8908590859089908990600401612935565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806105035750610503825b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3d7499ff00000000000000000000000000000000000000000000000000000000148061108957507fffffffff0000000000000000000000000000000000000000000000000000000082167fac9650d800000000000000000000000000000000000000000000000000000000145b8061050357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610503565b6000806000806110eb8888888861179b565b915091506110fb88888484611b4e565b9350935050505b94509492505050565b60006001600160a01b038216611122575081610503565b6040517f4e89a7110000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009190841690634e89a71190602401600060405180830381865afa158015611185573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111ad9190810190612986565b9050806000815181106111c2576111c261259e565b602002602001015191505092915050565b6000806000806111e5888888886110d9565b90925090506001600160a01b03821615801561120857506001600160a01b038116155b1561121a578787935093505050611102565b6110fb611227898461110b565b611231898461110b565b6001600160a01b03858116151590851615156111d3565b6112528133611c65565b50565b60008060006112648585611cfd565b60408051606084811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529185901b16603483015282516028818403018152604890920190925280519101209193509150610a5d565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661073e576000828152602081815260408083206001600160a01b0385168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561133d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561073e576000828152602081815260408083206001600160a01b038516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606114438383604051806060016040528060278152602001612d9160279139611d2e565b9392505050565b600080600061145b8a8987876110d9565b90925090506001600160a01b038083161580159183161515908261147d575080155b1561153b576040517fd08a8a190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d08a8a19906114ef908f908f908f908f908f90600401612a1a565b602060405180830381865afa15801561150c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115309190612a4d565b945050505050611790565b8115611619576040517fa1e8b1d50000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018d90526000919086169063a1e8b1d590604401600060405180830381865afa1580156115ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115d39190810190612a66565b9050806000815181106115e8576115e861259e565b6020026020010151600001519c50806000815181106116095761160961259e565b6020026020010151602001519b50505b8015611779576040517f4e89a7110000000000000000000000000000000000000000000000000000000081526001600160a01b038b8116600483015260009190851690634e89a71190602401600060405180830381865afa158015611682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116aa9190810190612986565b905060006116d88e8e846000815181106116c6576116c661259e565b60200260200101518e8e89600161144a565b9050846001600160a01b0316632d5403008d61170e856000815181106117005761170061259e565b602002602001015185611e32565b6040518363ffffffff1660e01b815260040161172b929190612b1a565b602060405180830381865afa158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c9190612a4d565b9650505050505050611790565b6117898c8c8c8c8c87600061144a565b9450505050505b979650505050505050565b6000808380156117a85750825b156119145760408051600280825260608201835260009260208301908036833701905050905086816000815181106117e2576117e261259e565b60200260200101906001600160a01b031690816001600160a01b03168152505085816001815181106118165761181661259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b9061188c908590600401612b7f565b600060405180830381865afa1580156118a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118d19190810190612bcc565b9050806000815181106118e6576118e661259e565b6020026020010151816001815181106119015761190161259e565b6020026020010151935093505050611102565b8315611a35576040805160018082528183019092526000916020808301908036833701905050905086816000815181106119505761195061259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b906119c6908590600401612b7f565b600060405180830381865afa1580156119e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0b9190810190612bcc565b905080600081518110611a2057611a2061259e565b60200260200101516000935093505050611102565b8215611b4357604080516001808252818301909252600091602080830190803683370190505090508581600081518110611a7157611a7161259e565b6001600160a01b0392831660209182029290920101526040517fedfb1b2b0000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000000000000000000000000000000000000000000000169063edfb1b2b90611ae7908590600401612b7f565b600060405180830381865afa158015611b04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b2c9190810190612bcc565b90506000816000815181106119015761190161259e565b506000905080611102565b6000806001600160a01b03848116151590841615158180611b6c5750805b15611c5a576000806000611b808b8b610bd7565b9050806040015115611bf557848015611bbc5750896001600160a01b03168b6001600160a01b031610611bb857806020015115611bbc565b8051155b9250838015611bee5750896001600160a01b03168b6001600160a01b031610611be757805115611bee565b8060200151155b9150611c44565b848015611c1a57506001600160a01b038b1660009081526001602052604090205460ff165b9250838015611c4157506001600160a01b038a1660009081526001602052604090205460ff165b91505b82611c4d578896505b81611c56578795505b5050505b505094509492505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661073e57611ca1816001600160a01b03166014611ed4565b611cac836020611ed4565b604051602001611cbd929190612c5b565b60408051601f19818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261072b91600401612cdc565b600080826001600160a01b0316846001600160a01b031610611d20578284611d23565b83835b909590945092505050565b60606001600160a01b0384163b611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e74726163740000000000000000000000000000000000000000000000000000606482015260840161072b565b600080856001600160a01b031685604051611de29190612cef565b600060405180830381855af49150503d8060008114611e1d576040519150601f19603f3d011682016040523d82523d6000602084013e611e22565b606091505b5091509150610e41828286612117565b604080516001808252818301909252606091816020015b6040805180820190915260008082526020820152815260200190600190039081611e495790505090508281600081518110611e8657611e8661259e565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508181600081518110611ebe57611ebe61259e565b6020026020010151602001818152505092915050565b60606000611ee3836002612d0b565b611eee906002612d48565b67ffffffffffffffff811115611f0657611f06612633565b6040519080825280601f01601f191660200182016040528015611f30576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611f6757611f6761259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611fca57611fca61259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000612006846002612d0b565b612011906001612d48565b90505b60018111156120ae577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106120525761205261259e565b1a60f81b8282815181106120685761206861259e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936120a781612d5b565b9050612014565b508315611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161072b565b60608315612126575081611443565b8251156121365782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b9190612cdc565b60006020828403121561217c57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461144357600080fd5b6001600160a01b038116811461125257600080fd5b600080604083850312156121d457600080fd5b82356121df816121ac565b915060208301356121ef816121ac565b809150509250929050565b60006020828403121561220c57600080fd5b5035919050565b6000806020838503121561222657600080fd5b823567ffffffffffffffff8082111561223e57600080fd5b818501915085601f83011261225257600080fd5b81358181111561226157600080fd5b8660208260061b850101111561227657600080fd5b60209290920196919550909350505050565b6000806040838503121561229b57600080fd5b8235915060208301356121ef816121ac565b600080602083850312156122c057600080fd5b823567ffffffffffffffff808211156122d857600080fd5b818501915085601f8301126122ec57600080fd5b8135818111156122fb57600080fd5b8660208260071b850101111561227657600080fd5b60008083601f84011261232257600080fd5b50813567ffffffffffffffff81111561233a57600080fd5b6020830191508360208260051b850101111561055657600080fd5b6000806020838503121561236857600080fd5b823567ffffffffffffffff81111561237f57600080fd5b61238b85828601612310565b90969095509350505050565b6000602082840312156123a957600080fd5b8135611443816121ac565b60005b838110156123cf5781810151838201526020016123b7565b50506000910152565b600081518084526123f08160208601602086016123b4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612477577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526124658583516123d8565b9450928501929085019060010161242b565b5092979650505050505050565b60008083601f84011261249657600080fd5b50813567ffffffffffffffff8111156124ae57600080fd5b60208301915083602082850101111561055657600080fd5b6000806000806000608086880312156124de57600080fd5b85356124e9816121ac565b9450602086013593506040860135612500816121ac565b9250606086013567ffffffffffffffff81111561251c57600080fd5b61252888828901612484565b969995985093965092949392505050565b6000806000806060858703121561254f57600080fd5b843561255a816121ac565b9350602085013561256a816121ac565b9250604085013567ffffffffffffffff81111561258657600080fd5b61259287828801612484565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252818101839052600090604080840186845b878110156126265781356125f6816121ac565b6001600160a01b0390811684528286013590612611826121ac565b168386015291830191908301906001016125e3565b5090979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561268557612685612633565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b4576126b4612633565b604052919050565b801515811461125257600080fd5b6000608082840312156126dc57600080fd5b6040516080810181811067ffffffffffffffff821117156126ff576126ff612633565b604052823561270d816121ac565b8152602083013561271d816121ac565b60208201526040830135612730816126bc565b60408201526060830135612743816126bc565b60608201529392505050565b6020808252818101839052600090604080840186845b87811015612626578135612778816121ac565b6001600160a01b0390811684528286013590612793826121ac565b1683860152818401356127a5816126bc565b1515838501526060828101356127ba816126bc565b1515908401526080928301929190910190600101612765565b6000602082840312156127e557600080fd5b8151611443816126bc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612850576128506127f0565b5060010190565b60208082528181018390526000908460408401835b8681101561289a57823561287f816121ac565b6001600160a01b03168252918301919083019060010161286c565b509695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128da57600080fd5b83018035915067ffffffffffffffff8211156128f557600080fd5b60200191503681900382131561055657600080fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b60006001600160a01b03808716835280861660208401525060606040830152610e4160608301848661290a565b600067ffffffffffffffff82111561297c5761297c612633565b5060051b60200190565b6000602080838503121561299957600080fd5b825167ffffffffffffffff8111156129b057600080fd5b8301601f810185136129c157600080fd5b80516129d46129cf82612962565b61268b565b81815260059190911b820183019083810190878311156129f357600080fd5b928401925b82841015611790578351612a0b816121ac565b825292840192908401906129f8565b60006001600160a01b0380881683528660208401528086166040840152506080606083015261179060808301848661290a565b600060208284031215612a5f57600080fd5b5051919050565b60006020808385031215612a7957600080fd5b825167ffffffffffffffff811115612a9057600080fd5b8301601f81018513612aa157600080fd5b8051612aaf6129cf82612962565b81815260069190911b82018301908381019087831115612ace57600080fd5b928401925b828410156117905760408489031215612aec5760008081fd5b612af4612662565b8451612aff816121ac565b81528486015186820152825260409093019290840190612ad3565b600060408083016001600160a01b03808716855260208381870152828751808552606088019150828901945060005b81811015612b70578551805186168452840151848401529483019491860191600101612b49565b50909998505050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc05783516001600160a01b031683529284019291840191600101612b9b565b50909695505050505050565b60006020808385031215612bdf57600080fd5b825167ffffffffffffffff811115612bf657600080fd5b8301601f81018513612c0757600080fd5b8051612c156129cf82612962565b81815260059190911b82018301908381019087831115612c3457600080fd5b928401925b82841015611790578351612c4c816121ac565b82529284019290840190612c39565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612c938160178501602088016123b4565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612cd08160288401602088016123b4565b01602801949350505050565b60208152600061144360208301846123d8565b60008251612d018184602087016123b4565b9190910192915050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d4357612d436127f0565b500290565b80820180821115610503576105036127f0565b600081612d6a57612d6a6127f0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201115eaf484d97092865e09e5436005f424be7381ebd4f7ed9de2ad5f75014eb564736f6c63430008100033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
