{
  "_format": "hh-sol-artifact-1",
  "contractName": "TokenUtils",
  "sourceName": "contracts/core/TokenUtils.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "InvalidTokenType",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "TokenNotFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnauthorizedAccess",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "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"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "tvmAddress",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "evmAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "tokenType",
          "type": "uint8"
        }
      ],
      "name": "TokenCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ADMIN",
      "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": "ERC20_TYPE",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ERC721_TYPE",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "tvmAddress",
          "type": "string"
        }
      ],
      "name": "computeAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "tvmAddress",
          "type": "string"
        }
      ],
      "name": "computeAddressERC721",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "symbol",
              "type": "string"
            },
            {
              "internalType": "uint8",
              "name": "decimals",
              "type": "uint8"
            },
            {
              "internalType": "string",
              "name": "tvmAddress",
              "type": "string"
            }
          ],
          "internalType": "struct TokenInfo",
          "name": "info",
          "type": "tuple"
        }
      ],
      "name": "create",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "symbol",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "baseURI",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "tvmAddress",
              "type": "string"
            }
          ],
          "internalType": "struct NFTInfo",
          "name": "info",
          "type": "tuple"
        }
      ],
      "name": "createERC721",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableInitializers",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "tvmAddress",
          "type": "string"
        }
      ],
      "name": "exists",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "evmAddress",
          "type": "address"
        }
      ],
      "name": "exists",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "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": "address",
          "name": "evmAddress",
          "type": "address"
        }
      ],
      "name": "getTokenDeployTime",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "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": "adminAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "crossChainLayer",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "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": [
        {
          "internalType": "address",
          "name": "erc721Token",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "baseURI",
          "type": "string"
        }
      ],
      "name": "setBaseURI",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenType",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "factory",
          "type": "address"
        }
      ],
      "name": "setTokenFactory",
      "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": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405230608052348015601357600080fd5b50608051611a1a61003d60003960008181610fd201528181610ffb015261114c0152611a1a6000f3fe60806040526004361061014b5760003560e01c806352d1902d116100b657806391d148541161006f57806391d14854146103e457806396c8e82014610404578063a217fddf14610424578063ad3cb1cc14610439578063d547741f14610477578063f6a3d24e1461049757600080fd5b806352d1902d146102f75780636f3769c01461030c57806372798a89146103335780637f26b45c14610348578063851bdf111461036857806388433651146103c457600080fd5b80632a0acc6a116101085780632a0acc6a1461024d5780632f2ff15d1461026f57806331f449001461028f57806336568abe146102a4578063485cc955146102c45780634f1ef286146102e457600080fd5b806301ffc9a7146101505780631963202b146101855780631adc56db146101a75780631f596f89146101c7578063248a9ca3146101ff578063261a323e1461022d575b600080fd5b34801561015c57600080fd5b5061017061016b3660046113cf565b6104d2565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b506101a56101a0366004611411565b610509565b005b3480156101b357600080fd5b506101a56101c2366004611411565b6105ba565b3480156101d357600080fd5b506101e76101e2366004611495565b61065d565b6040516001600160a01b03909116815260200161017c565b34801561020b57600080fd5b5061021f61021a3660046114d6565b610672565b60405190815260200161017c565b34801561023957600080fd5b50610170610248366004611495565b610694565b34801561025957600080fd5b5061021f60008051602061198583398151915281565b34801561027b57600080fd5b506101a561028a366004611504565b6106d5565b34801561029b57600080fd5b506101a56106f7565b3480156102b057600080fd5b506101a56102bf366004611504565b610737565b3480156102d057600080fd5b506101a56102df366004611534565b61076a565b6101a56102f2366004611578565b6108ba565b34801561030357600080fd5b5061021f6108d9565b34801561031857600080fd5b50610321600181565b60405160ff909116815260200161017c565b34801561033f57600080fd5b50610321600281565b34801561035457600080fd5b506101a5610363366004611504565b6108f6565b34801561037457600080fd5b506103ac610383366004611641565b6001600160a01b031660009081526020819052604090205461010090046001600160401b031690565b6040516001600160401b03909116815260200161017c565b3480156103d057600080fd5b506101a56103df36600461165e565b610975565b3480156103f057600080fd5b506101706103ff366004611504565b610a3a565b34801561041057600080fd5b506101e761041f366004611495565b610a72565b34801561043057600080fd5b5061021f600081565b34801561044557600080fd5b5061046a604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161017c9190611702565b34801561048357600080fd5b506101a5610492366004611504565b610a80565b3480156104a357600080fd5b506101706104b2366004611641565b6001600160a01b031660009081526020819052604090205460ff16151590565b60006001600160e01b03198216637965db0b60e01b148061050357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610511610a9c565b600354604080516001600160a01b0390921660208301526000910160408051601f198184030181529190529050600061054a8380611715565b6105576020860186611715565b610567606088016040890161175b565b6105746060890189611715565b60405160200161058a97969594939291906117a7565b60408051601f1981840301815291905290506105b560016105ae6060860186611715565b8585610ac7565b505050565b6105c2610a9c565b600354604080516001600160a01b0390921660208301526000910160408051601f19818403018152919052905060006105fb8380611715565b6106086020860186611715565b6106156040880188611715565b61062260608a018a611715565b6040516020016106399897969594939291906117fa565b60408051601f1981840301815291905290506105b560026105ae6060860186611715565b600061066b83836001610cb3565b9392505050565b60009081526000805160206119a5833981519152602052604090206001015490565b6000806001600160a01b0316600184846040516106b292919061185a565b908152604051908190036020019020546001600160a01b03161415905092915050565b6106de82610672565b6106e781610d93565b6106f18383610da0565b50505050565b6000805160206119c5833981519152546001600160401b03161561072d5760405162dc149f60e41b815260040160405180910390fd5b610735610e45565b565b6001600160a01b03811633146107605760405163334bd91960e11b815260040160405180910390fd5b6105b58282610ee0565b6000805160206119c58339815191528054600160401b810460ff1615906001600160401b031660008115801561079d5750825b90506000826001600160401b031660011480156107b95750303b155b9050811580156107c7575080155b156107e55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561080f57845460ff60401b1916600160401b1785555b610817610f5c565b61081f610f5c565b61083760008051602061198583398151915280610f64565b61084f60008051602061198583398151915288610da0565b50600380546001600160a01b0319166001600160a01b03881617905583156108b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6108c2610fc7565b6108cb8261106c565b6108d58282611084565b5050565b60006108e3611141565b5060008051602061196583398151915290565b60008051602061198583398151915261090e81610d93565b60018314801590610920575060028314155b15610946576040516332c5af1f60e11b8152600481018490526024015b60405180910390fd5b5060009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60008051602061198583398151915261098d81610d93565b6001600160a01b03841660009081526020819052604090205460ff166002146109d45760405163de6137d160e01b81526001600160a01b038516600482015260240161093d565b6040516355f804b360e01b81526001600160a01b038516906355f804b390610a02908690869060040161186a565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b5050505050505050565b60009182526000805160206119a5833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061066b83836002610cb3565b610a8982610672565b610a9281610d93565b6106f18383610ee0565b6003546001600160a01b0316331461073557604051631a27eac360e11b815260040160405180910390fd5b60008484604051602001610adc92919061185a565b60408051601f19818403018152828252805160209182012060ff8a1660009081526002909252918120549193509182916001600160a01b0316906319cdeff160e01b90610b319086908990899060240161187e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610b6f91906118a9565b600060405180830381855af49150503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b509150915081610bc25780518082602001fd5b600081806020019051810190610bd891906118c5565b90508060018989604051610bed92919061185a565b90815260408051918290036020908101832080546001600160a01b039586166001600160a01b0319909116179055828201825260ff808e1684526001600160401b03428116858401908152958716600090815292839052918390209351845495519092166101000268ffffffffffffffffff19909516911617929092179055517f8987aafc647b2712c770282704dba882de96544516cfc1e40cb00a9bf467e88e90610ca0908a908a9085908e906118e2565b60405180910390a1505050505050505050565b6000808484604051602001610cc992919061185a565b60408051808303601f1901815282825280516020918201206003546001600160a01b03169184019190915292506000910160408051601f19818403018152828252600087815260026020529190912054631463012f60e31b83529092506001600160a01b03169063a318097890610d489085908590309060040161191a565b602060405180830381865afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8991906118c5565b9695505050505050565b610d9d813361118a565b50565b60006000805160206119a5833981519152610dbb8484610a3a565b610e3b576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610df13390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610503565b6000915050610503565b6000805160206119c58339815191528054600160401b900460ff1615610e7e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614610d9d57805467ffffffffffffffff19166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150565b60006000805160206119a5833981519152610efb8484610a3a565b15610e3b576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610503565b6107356111c3565b6000805160206119a58339815191526000610f7e84610672565b600085815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061104e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611042600080516020611965833981519152546001600160a01b031690565b6001600160a01b031614155b156107355760405163703e46dd60e11b815260040160405180910390fd5b6000805160206119858339815191526108d581610d93565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110de575060408051601f3d908101601f191682019092526110db9181019061194b565b60015b61110657604051634c9c8ce360e01b81526001600160a01b038316600482015260240161093d565b600080516020611965833981519152811461113757604051632a87526960e21b81526004810182905260240161093d565b6105b583836111fa565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107355760405163703e46dd60e11b815260040160405180910390fd5b6111948282610a3a565b6108d55760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093d565b6000805160206119c583398151915254600160401b900460ff1661073557604051631afcd79f60e31b815260040160405180910390fd5b61120382611250565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611248576105b582826112b5565b6108d561132b565b806001600160a01b03163b60000361128657604051634c9c8ce360e01b81526001600160a01b038216600482015260240161093d565b60008051602061196583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112d291906118a9565b600060405180830381855af49150503d806000811461130d576040519150601f19603f3d011682016040523d82523d6000602084013e611312565b606091505b509150915061132285838361134a565b95945050505050565b34156107355760405163b398979f60e01b815260040160405180910390fd5b60608261135f5761135a826113a6565b61066b565b815115801561137657506001600160a01b0384163b155b1561139f57604051639996b31560e01b81526001600160a01b038516600482015260240161093d565b508061066b565b8051156113b65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000602082840312156113e157600080fd5b81356001600160e01b03198116811461066b57600080fd5b60006080828403121561140b57600080fd5b50919050565b60006020828403121561142357600080fd5b81356001600160401b0381111561143957600080fd5b611445848285016113f9565b949350505050565b60008083601f84011261145f57600080fd5b5081356001600160401b0381111561147657600080fd5b60208301915083602082850101111561148e57600080fd5b9250929050565b600080602083850312156114a857600080fd5b82356001600160401b038111156114be57600080fd5b6114ca8582860161144d565b90969095509350505050565b6000602082840312156114e857600080fd5b5035919050565b6001600160a01b0381168114610d9d57600080fd5b6000806040838503121561151757600080fd5b823591506020830135611529816114ef565b809150509250929050565b6000806040838503121561154757600080fd5b8235611552816114ef565b91506020830135611529816114ef565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561158b57600080fd5b8235611596816114ef565b915060208301356001600160401b038111156115b157600080fd5b8301601f810185136115c257600080fd5b80356001600160401b038111156115db576115db611562565b604051601f8201601f19908116603f011681016001600160401b038111828210171561160957611609611562565b60405281815282820160200187101561162157600080fd5b816020840160208301376000602083830101528093505050509250929050565b60006020828403121561165357600080fd5b813561066b816114ef565b60008060006040848603121561167357600080fd5b833561167e816114ef565b925060208401356001600160401b0381111561169957600080fd5b6116a58682870161144d565b9497909650939450505050565b60005b838110156116cd5781810151838201526020016116b5565b50506000910152565b600081518084526116ee8160208601602086016116b2565b601f01601f19169290920160200192915050565b60208152600061066b60208301846116d6565b6000808335601e1984360301811261172c57600080fd5b8301803591506001600160401b0382111561174657600080fd5b60200191503681900382131561148e57600080fd5b60006020828403121561176d57600080fd5b813560ff8116811461066b57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6080815260006117bb60808301898b61177e565b82810360208401526117ce81888a61177e565b905060ff8616604084015282810360608401526117ec81858761177e565b9a9950505050505050505050565b60808152600061180e608083018a8c61177e565b828103602084015261182181898b61177e565b9050828103604084015261183681878961177e565b9050828103606084015261184b81858761177e565b9b9a5050505050505050505050565b8183823760009101908152919050565b60208152600061144560208301848661177e565b83815260606020820152600061189760608301856116d6565b8281036040840152610d8981856116d6565b600082516118bb8184602087016116b2565b9190910192915050565b6000602082840312156118d757600080fd5b815161066b816114ef565b6060815260006118f660608301868861177e565b6001600160a01b039490941660208301525060ff9190911660409091015292915050565b83815260606020820152600061193360608301856116d6565b905060018060a01b0383166040830152949350505050565b60006020828403121561195d57600080fd5b505191905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220fb7a538a64b7ff8cd5968b9f62da801e8c2c9e694e1ae6950c31012e1aea865664736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061014b5760003560e01c806352d1902d116100b657806391d148541161006f57806391d14854146103e457806396c8e82014610404578063a217fddf14610424578063ad3cb1cc14610439578063d547741f14610477578063f6a3d24e1461049757600080fd5b806352d1902d146102f75780636f3769c01461030c57806372798a89146103335780637f26b45c14610348578063851bdf111461036857806388433651146103c457600080fd5b80632a0acc6a116101085780632a0acc6a1461024d5780632f2ff15d1461026f57806331f449001461028f57806336568abe146102a4578063485cc955146102c45780634f1ef286146102e457600080fd5b806301ffc9a7146101505780631963202b146101855780631adc56db146101a75780631f596f89146101c7578063248a9ca3146101ff578063261a323e1461022d575b600080fd5b34801561015c57600080fd5b5061017061016b3660046113cf565b6104d2565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b506101a56101a0366004611411565b610509565b005b3480156101b357600080fd5b506101a56101c2366004611411565b6105ba565b3480156101d357600080fd5b506101e76101e2366004611495565b61065d565b6040516001600160a01b03909116815260200161017c565b34801561020b57600080fd5b5061021f61021a3660046114d6565b610672565b60405190815260200161017c565b34801561023957600080fd5b50610170610248366004611495565b610694565b34801561025957600080fd5b5061021f60008051602061198583398151915281565b34801561027b57600080fd5b506101a561028a366004611504565b6106d5565b34801561029b57600080fd5b506101a56106f7565b3480156102b057600080fd5b506101a56102bf366004611504565b610737565b3480156102d057600080fd5b506101a56102df366004611534565b61076a565b6101a56102f2366004611578565b6108ba565b34801561030357600080fd5b5061021f6108d9565b34801561031857600080fd5b50610321600181565b60405160ff909116815260200161017c565b34801561033f57600080fd5b50610321600281565b34801561035457600080fd5b506101a5610363366004611504565b6108f6565b34801561037457600080fd5b506103ac610383366004611641565b6001600160a01b031660009081526020819052604090205461010090046001600160401b031690565b6040516001600160401b03909116815260200161017c565b3480156103d057600080fd5b506101a56103df36600461165e565b610975565b3480156103f057600080fd5b506101706103ff366004611504565b610a3a565b34801561041057600080fd5b506101e761041f366004611495565b610a72565b34801561043057600080fd5b5061021f600081565b34801561044557600080fd5b5061046a604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161017c9190611702565b34801561048357600080fd5b506101a5610492366004611504565b610a80565b3480156104a357600080fd5b506101706104b2366004611641565b6001600160a01b031660009081526020819052604090205460ff16151590565b60006001600160e01b03198216637965db0b60e01b148061050357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610511610a9c565b600354604080516001600160a01b0390921660208301526000910160408051601f198184030181529190529050600061054a8380611715565b6105576020860186611715565b610567606088016040890161175b565b6105746060890189611715565b60405160200161058a97969594939291906117a7565b60408051601f1981840301815291905290506105b560016105ae6060860186611715565b8585610ac7565b505050565b6105c2610a9c565b600354604080516001600160a01b0390921660208301526000910160408051601f19818403018152919052905060006105fb8380611715565b6106086020860186611715565b6106156040880188611715565b61062260608a018a611715565b6040516020016106399897969594939291906117fa565b60408051601f1981840301815291905290506105b560026105ae6060860186611715565b600061066b83836001610cb3565b9392505050565b60009081526000805160206119a5833981519152602052604090206001015490565b6000806001600160a01b0316600184846040516106b292919061185a565b908152604051908190036020019020546001600160a01b03161415905092915050565b6106de82610672565b6106e781610d93565b6106f18383610da0565b50505050565b6000805160206119c5833981519152546001600160401b03161561072d5760405162dc149f60e41b815260040160405180910390fd5b610735610e45565b565b6001600160a01b03811633146107605760405163334bd91960e11b815260040160405180910390fd5b6105b58282610ee0565b6000805160206119c58339815191528054600160401b810460ff1615906001600160401b031660008115801561079d5750825b90506000826001600160401b031660011480156107b95750303b155b9050811580156107c7575080155b156107e55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561080f57845460ff60401b1916600160401b1785555b610817610f5c565b61081f610f5c565b61083760008051602061198583398151915280610f64565b61084f60008051602061198583398151915288610da0565b50600380546001600160a01b0319166001600160a01b03881617905583156108b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6108c2610fc7565b6108cb8261106c565b6108d58282611084565b5050565b60006108e3611141565b5060008051602061196583398151915290565b60008051602061198583398151915261090e81610d93565b60018314801590610920575060028314155b15610946576040516332c5af1f60e11b8152600481018490526024015b60405180910390fd5b5060009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60008051602061198583398151915261098d81610d93565b6001600160a01b03841660009081526020819052604090205460ff166002146109d45760405163de6137d160e01b81526001600160a01b038516600482015260240161093d565b6040516355f804b360e01b81526001600160a01b038516906355f804b390610a02908690869060040161186a565b600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b5050505050505050565b60009182526000805160206119a5833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061066b83836002610cb3565b610a8982610672565b610a9281610d93565b6106f18383610ee0565b6003546001600160a01b0316331461073557604051631a27eac360e11b815260040160405180910390fd5b60008484604051602001610adc92919061185a565b60408051601f19818403018152828252805160209182012060ff8a1660009081526002909252918120549193509182916001600160a01b0316906319cdeff160e01b90610b319086908990899060240161187e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610b6f91906118a9565b600060405180830381855af49150503d8060008114610baa576040519150601f19603f3d011682016040523d82523d6000602084013e610baf565b606091505b509150915081610bc25780518082602001fd5b600081806020019051810190610bd891906118c5565b90508060018989604051610bed92919061185a565b90815260408051918290036020908101832080546001600160a01b039586166001600160a01b0319909116179055828201825260ff808e1684526001600160401b03428116858401908152958716600090815292839052918390209351845495519092166101000268ffffffffffffffffff19909516911617929092179055517f8987aafc647b2712c770282704dba882de96544516cfc1e40cb00a9bf467e88e90610ca0908a908a9085908e906118e2565b60405180910390a1505050505050505050565b6000808484604051602001610cc992919061185a565b60408051808303601f1901815282825280516020918201206003546001600160a01b03169184019190915292506000910160408051601f19818403018152828252600087815260026020529190912054631463012f60e31b83529092506001600160a01b03169063a318097890610d489085908590309060040161191a565b602060405180830381865afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8991906118c5565b9695505050505050565b610d9d813361118a565b50565b60006000805160206119a5833981519152610dbb8484610a3a565b610e3b576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055610df13390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610503565b6000915050610503565b6000805160206119c58339815191528054600160401b900460ff1615610e7e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614610d9d57805467ffffffffffffffff19166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150565b60006000805160206119a5833981519152610efb8484610a3a565b15610e3b576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610503565b6107356111c3565b6000805160206119a58339815191526000610f7e84610672565b600085815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061104e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611042600080516020611965833981519152546001600160a01b031690565b6001600160a01b031614155b156107355760405163703e46dd60e11b815260040160405180910390fd5b6000805160206119858339815191526108d581610d93565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110de575060408051601f3d908101601f191682019092526110db9181019061194b565b60015b61110657604051634c9c8ce360e01b81526001600160a01b038316600482015260240161093d565b600080516020611965833981519152811461113757604051632a87526960e21b81526004810182905260240161093d565b6105b583836111fa565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107355760405163703e46dd60e11b815260040160405180910390fd5b6111948282610a3a565b6108d55760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161093d565b6000805160206119c583398151915254600160401b900460ff1661073557604051631afcd79f60e31b815260040160405180910390fd5b61120382611250565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611248576105b582826112b5565b6108d561132b565b806001600160a01b03163b60000361128657604051634c9c8ce360e01b81526001600160a01b038216600482015260240161093d565b60008051602061196583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516112d291906118a9565b600060405180830381855af49150503d806000811461130d576040519150601f19603f3d011682016040523d82523d6000602084013e611312565b606091505b509150915061132285838361134a565b95945050505050565b34156107355760405163b398979f60e01b815260040160405180910390fd5b60608261135f5761135a826113a6565b61066b565b815115801561137657506001600160a01b0384163b155b1561139f57604051639996b31560e01b81526001600160a01b038516600482015260240161093d565b508061066b565b8051156113b65780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6000602082840312156113e157600080fd5b81356001600160e01b03198116811461066b57600080fd5b60006080828403121561140b57600080fd5b50919050565b60006020828403121561142357600080fd5b81356001600160401b0381111561143957600080fd5b611445848285016113f9565b949350505050565b60008083601f84011261145f57600080fd5b5081356001600160401b0381111561147657600080fd5b60208301915083602082850101111561148e57600080fd5b9250929050565b600080602083850312156114a857600080fd5b82356001600160401b038111156114be57600080fd5b6114ca8582860161144d565b90969095509350505050565b6000602082840312156114e857600080fd5b5035919050565b6001600160a01b0381168114610d9d57600080fd5b6000806040838503121561151757600080fd5b823591506020830135611529816114ef565b809150509250929050565b6000806040838503121561154757600080fd5b8235611552816114ef565b91506020830135611529816114ef565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561158b57600080fd5b8235611596816114ef565b915060208301356001600160401b038111156115b157600080fd5b8301601f810185136115c257600080fd5b80356001600160401b038111156115db576115db611562565b604051601f8201601f19908116603f011681016001600160401b038111828210171561160957611609611562565b60405281815282820160200187101561162157600080fd5b816020840160208301376000602083830101528093505050509250929050565b60006020828403121561165357600080fd5b813561066b816114ef565b60008060006040848603121561167357600080fd5b833561167e816114ef565b925060208401356001600160401b0381111561169957600080fd5b6116a58682870161144d565b9497909650939450505050565b60005b838110156116cd5781810151838201526020016116b5565b50506000910152565b600081518084526116ee8160208601602086016116b2565b601f01601f19169290920160200192915050565b60208152600061066b60208301846116d6565b6000808335601e1984360301811261172c57600080fd5b8301803591506001600160401b0382111561174657600080fd5b60200191503681900382131561148e57600080fd5b60006020828403121561176d57600080fd5b813560ff8116811461066b57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6080815260006117bb60808301898b61177e565b82810360208401526117ce81888a61177e565b905060ff8616604084015282810360608401526117ec81858761177e565b9a9950505050505050505050565b60808152600061180e608083018a8c61177e565b828103602084015261182181898b61177e565b9050828103604084015261183681878961177e565b9050828103606084015261184b81858761177e565b9b9a5050505050505050505050565b8183823760009101908152919050565b60208152600061144560208301848661177e565b83815260606020820152600061189760608301856116d6565b8281036040840152610d8981856116d6565b600082516118bb8184602087016116b2565b9190910192915050565b6000602082840312156118d757600080fd5b815161066b816114ef565b6060815260006118f660608301868861177e565b6001600160a01b039490941660208301525060ff9190911660409091015292915050565b83815260606020820152600061193360608301856116d6565b905060018060a01b0383166040830152949350505050565b60006020828403121561195d57600080fd5b505191905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220fb7a538a64b7ff8cd5968b9f62da801e8c2c9e694e1ae6950c31012e1aea865664736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
