{
  "_format": "hh-sol-artifact-1",
  "contractName": "GatewayContract",
  "sourceName": "gateway/GatewayContract.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "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": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "OwnableInvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "OwnableUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "relayer",
          "type": "address"
        }
      ],
      "name": "AddedRelayer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "requestID",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "cts",
          "type": "uint256[]"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "contractCaller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes4",
          "name": "callbackSelector",
          "type": "bytes4"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "maxTimestamp",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "passSignaturesToCaller",
          "type": "bool"
        }
      ],
      "name": "EventDecryption",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferStarted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "relayer",
          "type": "address"
        }
      ],
      "name": "RemovedRelayer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "requestID",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "name": "ResultCallback",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "relayerAddress",
          "type": "address"
        }
      ],
      "name": "addRelayer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "requestID",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "decryptedCts",
          "type": "bytes"
        },
        {
          "internalType": "bytes[]",
          "name": "signatures",
          "type": "bytes[]"
        }
      ],
      "name": "fulfillRequest",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getCounter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getKmsVerifierAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getMAX_DELAY",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_gatewayOwner",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "requestID",
          "type": "uint256"
        }
      ],
      "name": "isExpiredOrFulfilled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "isRelayer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "relayerAddress",
          "type": "address"
        }
      ],
      "name": "removeRelayer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "ctsHandles",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes4",
          "name": "callbackSelector",
          "type": "bytes4"
        },
        {
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxTimestamp",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "passSignaturesToCaller",
          "type": "bool"
        }
      ],
      "name": "requestDecryption",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "initialCounter",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b604051611ebe90816100d1823960805181818161052d01526106860152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c80630d8e6e2c146101445780632538d86d1461013f57806335a30d971461013a5780634c0d9277146101355780634f1ef2861461013057806352d1902d1461012b578063541d55481461012657806360f0a5ac14610121578063651161e51461011c578063715018a61461011757806379ba5097146101125780638ada066e1461010d5780638da5cb5b14610108578063ad3cb1cc14610103578063b9244e1d146100fe578063c4d66de8146100f9578063dd39f00d146100f4578063e30c3978146100ef5763f2fde38b146100ea575f80fd5b610e08565b610dc3565b610ca1565b610b1d565b610a61565b610a04565b6109bf565b610983565b610921565b610881565b610853565b610738565b6106d6565b61066c565b6104ec565b610399565b6102b0565b610293565b6101a3565b5f5b83811061015a5750505f910152565b818101518382015260200161014b565b9060209161018381518092818552858086019101610149565b601f01601f1916010190565b9060206101a092818152019061016a565b90565b3461028f575f36600319011261028f5761028b61022b61027f6040516101c881610447565b600f8152610271602082017f47617465776179436f6e74726163740000000000000000000000000000000000815261026b61025e61020461190a565b602361020e611946565b91610217611946565b956040519a8b9951809260208c0190610149565b880161103b60f11b602082015261024c825180936020602285019101610149565b01601760f91b60228201520190610eaf565b601760f91b815260010190565b90610eaf565b03601f198101835282610468565b6040519182918261018f565b0390f35b5f80fd5b3461028f575f36600319011261028f576020604051620151808152f35b3461028f57602036600319011261028f576004355f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260ff60405f2054168015610306575b6020906040519015158152f35b507f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa026020526020600360405f2001548042119081610347575b5090506102f9565b905015155f61033f565b602435907fffffffff000000000000000000000000000000000000000000000000000000008216820361028f57565b8015150361028f57565b6084359061039782610380565b565b3461028f5760a036600319011261028f5760043567ffffffffffffffff80821161028f573660238301121561028f57816004013590811161028f573660248260051b8401011161028f5761028b9161040d916103f3610351565b916103fc61038a565b9260643592602460443593016110c6565b6040519081529081906020820190565b600435906001600160a01b038216820361028f57565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761046357604052565b610433565b90601f8019910116810190811067ffffffffffffffff82111761046357604052565b67ffffffffffffffff811161046357601f01601f191660200190565b81601f8201121561028f578035906104bd8261048a565b926104cb6040519485610468565b8284526020838301011161028f57815f926020809301838601378301015290565b604036600319011261028f5761050061041d565b60243567ffffffffffffffff811161028f576105209036906004016104a6565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561063e575b5061062c57602060049361056a6119a8565b6040516352d1902d60e01b8152948591829086165afa5f93816105fb575b506105ae57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc83036105e2576105e09250611c6c565b005b604051632a87526960e21b815260048101849052602490fd5b61061e91945060203d602011610625575b6106168183610468565b810190611999565b925f610588565b503d61060c565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f610558565b3461028f575f36600319011261028f576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062c5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b3461028f57602036600319011261028f57602060ff61072c6106f661041d565b6001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166040519015158152f35b3461028f57602036600319011261028f5761075161041d565b6107596119a8565b60ff610795826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561080e57806107df6001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19169055167ff29639ce9f9f4d0a646c7c99291b0b1d3ca3a017b8f543d03d79d9f6fc4c58245f80a2005b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f7420612072656c6179657200000000000000006044820152606490fd5b3461028f575f36600319011261028f576020604051739d6891a6240d6130c54ae243d8005063d05fe14b8152f35b3461028f575f36600319011261028f576108996119a8565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461028f575f36600319011261028f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361096b576105e0336119db565b60405163118cdaa760e01b8152336004820152602490fd5b3461028f575f36600319011261028f5760207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054604051908152f35b3461028f575f36600319011261028f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461028f575f36600319011261028f5761028b604051610a2381610447565b600581527f352e302e30000000000000000000000000000000000000000000000000000000602082015260405191829160208352602083019061016a565b606036600319011261028f5767ffffffffffffffff6024803582811161028f57610a8f9036906004016104a6565b60443583811161028f573660238201121561028f57806004013592848411610463578360051b60209560405195610ac96020840188610468565b8652602460208701928501019336851161028f5760248101925b858410610af7576105e0888860043561126e565b833583811161028f578991610b1283928836918701016104a6565b815201930192610ae3565b3461028f57602036600319011261028f57610b3661041d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610c99575b6001149081610c8f575b159081610c86575b50610c74577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff19166001179055610bcd9082610c3357611c2c565b610bd357005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff0000000000000000191668010000000000000000179055611c2c565b60405163f92ee8a960e01b8152600490fd5b9050155f610b87565b303b159150610b7f565b839150610b75565b3461028f57602036600319011261028f57610cba61041d565b610cc26119a8565b60ff610cfe826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b5416610d7e5780610d57610d4a6001600160a01b03936001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19166001179055565b167fd68caa126e02d8ca92285deaa53a0d5d4f692e587b00422ce504661cc74361bc5f80a2005b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c72656164792072656c617965720000000000006044820152606490fd5b3461028f575f36600319011261028f5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461028f57602036600319011261028f57610e2161041d565b610e296119a8565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b90610ec260209282815194859201610149565b0190565b15610ecd57565b60405162461bcd60e51b815260206004820152602260248201527f6d617854696d657374616d70206d757374206265206120667574757265206461604482015261746560f01b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b90620151808201809211610f4157565b610f1d565b9060208201809211610f4157565b9060018201809211610f4157565b9060048201809211610f4157565b906101408201809211610f4157565b9060c08201809211610f4157565b9060808201809211610f4157565b6004019081600411610f4157565b91908201809211610f4157565b15610fbd57565b60405162461bcd60e51b815260206004820152601f60248201527f6d617854696d657374616d70206578636565646564204d41585f44454c4159006044820152606490fd5b634e487b7160e01b5f52603260045260245ffd5b91908110156110265760051b0190565b611002565b805490680100000000000000008210156104635760018201808255821015611026575f5260205f200155565b95929796939094919460c087528560c08801526001600160fb1b03861161028f5760e06001600160a01b039160a09760051b8091838b01378801019816602087015263ffffffff60e01b166040860152606085015260808401521515910152565b5f198114610f415760010190565b9593949091946110d7428211610ec6565b6110eb6110e342610f31565b821115610fb6565b7f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0093845496611141885f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b5f5b8681106112505750847f2dc9f5cb271a872eb89f488a1d216ded8a5b96226ca01f8d3128e028ae5459f8948a9b94846112156103979c9d996004876111f761122c9f9e9a60016112239b016111ae3382906001600160a01b03166001600160a01b0319825416179055565b907fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff000000000000000000000000000000000000000083549260401c169116179055565b856002820155866003820155019060ff801983541691151516179055565b604051968796339188611057565b0390a2546110b8565b7f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0055565b806112686112616001938a8f611016565b358461102b565b01611143565b919060ff6112ac336001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561157f576112fd6112f86112f46112ed865f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260405f2090565b5460ff1690565b1590565b6115c4565b611331610d4a845f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260405f2090565b61136a611365845f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b61164b565b9061137b60808301514211156116f6565b6040916113e76113948483015163ffffffff60e01b1690565b92845160209485820152806113b189602483019190602083019252565b03916113c5601f1993848101845283610468565b6113f96113d560a0870151151590565b926113ed89519687928a840190610eaf565b84610eaf565b03848101865285610468565b83911561149a5750509161145d5f949261145461144361144f88977fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd9b8b519384918a8301611865565b03908101835282610468565b611a7a565b90835190611b1d565b915b6060611474828401516001600160a01b031690565b9201519083519301915af161149561148a611876565b9251928392836118a5565b0390a2565b90925084969491506114d3885f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b6114f08751968793849363dd66628760e01b8552600485016117b3565b03815f739d6891a6240d6130c54ae243d8005063d05fe14b5af191821561157a577fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd956115485f95948695869161154d575b5061180f565b61145f565b61156d9150833d8511611573575b6115658183610468565b810190611742565b5f611542565b503d61155b565b611804565b60405162461bcd60e51b815260206004820152600b60248201527f4e6f742072656c617965720000000000000000000000000000000000000000006044820152606490fd5b156115cb57565b60405162461bcd60e51b815260206004820152601c60248201527f5265717565737420697320616c72656164792066756c66696c6c6564000000006044820152606490fd5b9081548082526020809201925f5260205f20915f905b828210611634575050505090565b835485529384019360019384019390910190611626565b906040519160c083019280841067ffffffffffffffff8511176104635760a06116ef60046103979487604052849761169260bf198761168a8486611610565b030182610468565b855260018101546001600160a01b0381166020870152604090811b7fffffffff0000000000000000000000000000000000000000000000000000000016908601526002810154606086015260038101546080860152015460ff1690565b1515910152565b156116fd57565b60405162461bcd60e51b815260206004820152600860248201527f546f6f206c6174650000000000000000000000000000000000000000000000006044820152606490fd5b9081602091031261028f57516101a081610380565b90808251908181526020809101926020808460051b8301019501935f915b8483106117855750505050505090565b90919293949584806117a3600193601f198682030187528a5161016a565b9801930193019194939290611775565b916117f6906117e86101a0959373fee8407e2f5e3ee68ad77cae98c434e637f516e58652608060208701526080860190611610565b90848203604086015261016a565b916060818403910152611757565b6040513d5f823e3d90fd5b1561181657565b60405162461bcd60e51b815260206004820152602160248201527f4b4d53207369676e617475726520766572696669636174696f6e206661696c656044820152601960fa1b6064820152608490fd5b9060206101a0928181520190611757565b3d156118a0573d906118878261048a565b916118956040519384610468565b82523d5f602084013e565b606090565b6040906101a0939215158152816020820152019061016a565b604051906118cb82610447565b6001825260203681840137565b906118e28261048a565b6118ef6040519182610468565b8281528092611900601f199161048a565b0190602036910137565b5f6119136118be565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908161191957505090565b6001806119516118be565b9160218301825b611963575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530491821561199457919082611958565b61195d565b9081602091031261028f575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361096b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b908151811015611026570160200190565b8051601f19810191908211610f4157611a92826118d8565b915f5b818110611aa25750505090565b6020810190818111610f41576001917fff0000000000000000000000000000000000000000000000000000000000000090611add9086611a69565b51165f1a611aeb8287611a69565b5301611a95565b80518210156110265760209160051b010190565b908160051b916001600160fb1b03811603610f4157565b81516040925f905b828210611b6d575050611b5c6101a09361026b9593611b56611b51611b4c61027196610f54565b611b06565b610f9b565b90611d22565b916040519485936020850190610eaf565b9093611b8f611b89611b89611b828886611af2565b5160081c90565b60ff1690565b600994858210611c1e57611bc190611bb1611bac611b4c8a610f54565b610f62565b6020908201016020815101905290565b948103611bdd5750611bd4600191610f8d565b945b0190611b25565b600a8103611bf75750611bf1600191610f7f565b94611bd6565b909490600b14611c0a575b600190611bd6565b93611c16600191610f70565b949050611c02565b945050611bf1600191610f46565b611c34611df5565b611c3c611df5565b6001600160a01b03811615611c5457610397906119db565b604051631e4fbdf760e01b81525f6004820152602490fd5b90813b15611d01576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115611ce657611ce391611e36565b50565b505034611cef57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b929190835190611d39611d3483610f46565b6118d8565b925f5b828110611dd257505f5b60208110611db25750505b818110611d5f575090925050565b80611d95611d6f60019388611a69565b517fff000000000000000000000000000000000000000000000000000000000000001690565b611dab611da183610f46565b915f1a9186611a69565b5301611d51565b80826001921a611dcb611dc58387610fa9565b88611a69565b5301611d46565b80611de2611d6f6001938a611a69565b5f1a611dee8288611a69565b5301611d3c565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611e2457565b604051631afcd79f60e31b8152600490fd5b5f806101a093602081519101845af4611e4d611876565b9190611e755750805115611e6357805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580611ea8575b611e86575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611e7e56fea164736f6c6343000818000a",
  "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c80630d8e6e2c146101445780632538d86d1461013f57806335a30d971461013a5780634c0d9277146101355780634f1ef2861461013057806352d1902d1461012b578063541d55481461012657806360f0a5ac14610121578063651161e51461011c578063715018a61461011757806379ba5097146101125780638ada066e1461010d5780638da5cb5b14610108578063ad3cb1cc14610103578063b9244e1d146100fe578063c4d66de8146100f9578063dd39f00d146100f4578063e30c3978146100ef5763f2fde38b146100ea575f80fd5b610e08565b610dc3565b610ca1565b610b1d565b610a61565b610a04565b6109bf565b610983565b610921565b610881565b610853565b610738565b6106d6565b61066c565b6104ec565b610399565b6102b0565b610293565b6101a3565b5f5b83811061015a5750505f910152565b818101518382015260200161014b565b9060209161018381518092818552858086019101610149565b601f01601f1916010190565b9060206101a092818152019061016a565b90565b3461028f575f36600319011261028f5761028b61022b61027f6040516101c881610447565b600f8152610271602082017f47617465776179436f6e74726163740000000000000000000000000000000000815261026b61025e61020461190a565b602361020e611946565b91610217611946565b956040519a8b9951809260208c0190610149565b880161103b60f11b602082015261024c825180936020602285019101610149565b01601760f91b60228201520190610eaf565b601760f91b815260010190565b90610eaf565b03601f198101835282610468565b6040519182918261018f565b0390f35b5f80fd5b3461028f575f36600319011261028f576020604051620151808152f35b3461028f57602036600319011261028f576004355f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260ff60405f2054168015610306575b6020906040519015158152f35b507f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa026020526020600360405f2001548042119081610347575b5090506102f9565b905015155f61033f565b602435907fffffffff000000000000000000000000000000000000000000000000000000008216820361028f57565b8015150361028f57565b6084359061039782610380565b565b3461028f5760a036600319011261028f5760043567ffffffffffffffff80821161028f573660238301121561028f57816004013590811161028f573660248260051b8401011161028f5761028b9161040d916103f3610351565b916103fc61038a565b9260643592602460443593016110c6565b6040519081529081906020820190565b600435906001600160a01b038216820361028f57565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761046357604052565b610433565b90601f8019910116810190811067ffffffffffffffff82111761046357604052565b67ffffffffffffffff811161046357601f01601f191660200190565b81601f8201121561028f578035906104bd8261048a565b926104cb6040519485610468565b8284526020838301011161028f57815f926020809301838601378301015290565b604036600319011261028f5761050061041d565b60243567ffffffffffffffff811161028f576105209036906004016104a6565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561063e575b5061062c57602060049361056a6119a8565b6040516352d1902d60e01b8152948591829086165afa5f93816105fb575b506105ae57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc83036105e2576105e09250611c6c565b005b604051632a87526960e21b815260048101849052602490fd5b61061e91945060203d602011610625575b6106168183610468565b810190611999565b925f610588565b503d61060c565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f610558565b3461028f575f36600319011261028f576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062c5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b3461028f57602036600319011261028f57602060ff61072c6106f661041d565b6001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166040519015158152f35b3461028f57602036600319011261028f5761075161041d565b6107596119a8565b60ff610795826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561080e57806107df6001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19169055167ff29639ce9f9f4d0a646c7c99291b0b1d3ca3a017b8f543d03d79d9f6fc4c58245f80a2005b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f7420612072656c6179657200000000000000006044820152606490fd5b3461028f575f36600319011261028f576020604051739d6891a6240d6130c54ae243d8005063d05fe14b8152f35b3461028f575f36600319011261028f576108996119a8565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461028f575f36600319011261028f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361096b576105e0336119db565b60405163118cdaa760e01b8152336004820152602490fd5b3461028f575f36600319011261028f5760207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054604051908152f35b3461028f575f36600319011261028f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461028f575f36600319011261028f5761028b604051610a2381610447565b600581527f352e302e30000000000000000000000000000000000000000000000000000000602082015260405191829160208352602083019061016a565b606036600319011261028f5767ffffffffffffffff6024803582811161028f57610a8f9036906004016104a6565b60443583811161028f573660238201121561028f57806004013592848411610463578360051b60209560405195610ac96020840188610468565b8652602460208701928501019336851161028f5760248101925b858410610af7576105e0888860043561126e565b833583811161028f578991610b1283928836918701016104a6565b815201930192610ae3565b3461028f57602036600319011261028f57610b3661041d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610c99575b6001149081610c8f575b159081610c86575b50610c74577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff19166001179055610bcd9082610c3357611c2c565b610bd357005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff0000000000000000191668010000000000000000179055611c2c565b60405163f92ee8a960e01b8152600490fd5b9050155f610b87565b303b159150610b7f565b839150610b75565b3461028f57602036600319011261028f57610cba61041d565b610cc26119a8565b60ff610cfe826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b5416610d7e5780610d57610d4a6001600160a01b03936001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19166001179055565b167fd68caa126e02d8ca92285deaa53a0d5d4f692e587b00422ce504661cc74361bc5f80a2005b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c72656164792072656c617965720000000000006044820152606490fd5b3461028f575f36600319011261028f5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461028f57602036600319011261028f57610e2161041d565b610e296119a8565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b90610ec260209282815194859201610149565b0190565b15610ecd57565b60405162461bcd60e51b815260206004820152602260248201527f6d617854696d657374616d70206d757374206265206120667574757265206461604482015261746560f01b6064820152608490fd5b634e487b7160e01b5f52601160045260245ffd5b90620151808201809211610f4157565b610f1d565b9060208201809211610f4157565b9060018201809211610f4157565b9060048201809211610f4157565b906101408201809211610f4157565b9060c08201809211610f4157565b9060808201809211610f4157565b6004019081600411610f4157565b91908201809211610f4157565b15610fbd57565b60405162461bcd60e51b815260206004820152601f60248201527f6d617854696d657374616d70206578636565646564204d41585f44454c4159006044820152606490fd5b634e487b7160e01b5f52603260045260245ffd5b91908110156110265760051b0190565b611002565b805490680100000000000000008210156104635760018201808255821015611026575f5260205f200155565b95929796939094919460c087528560c08801526001600160fb1b03861161028f5760e06001600160a01b039160a09760051b8091838b01378801019816602087015263ffffffff60e01b166040860152606085015260808401521515910152565b5f198114610f415760010190565b9593949091946110d7428211610ec6565b6110eb6110e342610f31565b821115610fb6565b7f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0093845496611141885f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b5f5b8681106112505750847f2dc9f5cb271a872eb89f488a1d216ded8a5b96226ca01f8d3128e028ae5459f8948a9b94846112156103979c9d996004876111f761122c9f9e9a60016112239b016111ae3382906001600160a01b03166001600160a01b0319825416179055565b907fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff000000000000000000000000000000000000000083549260401c169116179055565b856002820155866003820155019060ff801983541691151516179055565b604051968796339188611057565b0390a2546110b8565b7f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0055565b806112686112616001938a8f611016565b358461102b565b01611143565b919060ff6112ac336001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561157f576112fd6112f86112f46112ed865f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260405f2090565b5460ff1690565b1590565b6115c4565b611331610d4a845f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260405f2090565b61136a611365845f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b61164b565b9061137b60808301514211156116f6565b6040916113e76113948483015163ffffffff60e01b1690565b92845160209485820152806113b189602483019190602083019252565b03916113c5601f1993848101845283610468565b6113f96113d560a0870151151590565b926113ed89519687928a840190610eaf565b84610eaf565b03848101865285610468565b83911561149a5750509161145d5f949261145461144361144f88977fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd9b8b519384918a8301611865565b03908101835282610468565b611a7a565b90835190611b1d565b915b6060611474828401516001600160a01b031690565b9201519083519301915af161149561148a611876565b9251928392836118a5565b0390a2565b90925084969491506114d3885f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f2090565b6114f08751968793849363dd66628760e01b8552600485016117b3565b03815f739d6891a6240d6130c54ae243d8005063d05fe14b5af191821561157a577fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd956115485f95948695869161154d575b5061180f565b61145f565b61156d9150833d8511611573575b6115658183610468565b810190611742565b5f611542565b503d61155b565b611804565b60405162461bcd60e51b815260206004820152600b60248201527f4e6f742072656c617965720000000000000000000000000000000000000000006044820152606490fd5b156115cb57565b60405162461bcd60e51b815260206004820152601c60248201527f5265717565737420697320616c72656164792066756c66696c6c6564000000006044820152606490fd5b9081548082526020809201925f5260205f20915f905b828210611634575050505090565b835485529384019360019384019390910190611626565b906040519160c083019280841067ffffffffffffffff8511176104635760a06116ef60046103979487604052849761169260bf198761168a8486611610565b030182610468565b855260018101546001600160a01b0381166020870152604090811b7fffffffff0000000000000000000000000000000000000000000000000000000016908601526002810154606086015260038101546080860152015460ff1690565b1515910152565b156116fd57565b60405162461bcd60e51b815260206004820152600860248201527f546f6f206c6174650000000000000000000000000000000000000000000000006044820152606490fd5b9081602091031261028f57516101a081610380565b90808251908181526020809101926020808460051b8301019501935f915b8483106117855750505050505090565b90919293949584806117a3600193601f198682030187528a5161016a565b9801930193019194939290611775565b916117f6906117e86101a0959373fee8407e2f5e3ee68ad77cae98c434e637f516e58652608060208701526080860190611610565b90848203604086015261016a565b916060818403910152611757565b6040513d5f823e3d90fd5b1561181657565b60405162461bcd60e51b815260206004820152602160248201527f4b4d53207369676e617475726520766572696669636174696f6e206661696c656044820152601960fa1b6064820152608490fd5b9060206101a0928181520190611757565b3d156118a0573d906118878261048a565b916118956040519384610468565b82523d5f602084013e565b606090565b6040906101a0939215158152816020820152019061016a565b604051906118cb82610447565b6001825260203681840137565b906118e28261048a565b6118ef6040519182610468565b8281528092611900601f199161048a565b0190602036910137565b5f6119136118be565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908161191957505090565b6001806119516118be565b9160218301825b611963575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530491821561199457919082611958565b61195d565b9081602091031261028f575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361096b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b908151811015611026570160200190565b8051601f19810191908211610f4157611a92826118d8565b915f5b818110611aa25750505090565b6020810190818111610f41576001917fff0000000000000000000000000000000000000000000000000000000000000090611add9086611a69565b51165f1a611aeb8287611a69565b5301611a95565b80518210156110265760209160051b010190565b908160051b916001600160fb1b03811603610f4157565b81516040925f905b828210611b6d575050611b5c6101a09361026b9593611b56611b51611b4c61027196610f54565b611b06565b610f9b565b90611d22565b916040519485936020850190610eaf565b9093611b8f611b89611b89611b828886611af2565b5160081c90565b60ff1690565b600994858210611c1e57611bc190611bb1611bac611b4c8a610f54565b610f62565b6020908201016020815101905290565b948103611bdd5750611bd4600191610f8d565b945b0190611b25565b600a8103611bf75750611bf1600191610f7f565b94611bd6565b909490600b14611c0a575b600190611bd6565b93611c16600191610f70565b949050611c02565b945050611bf1600191610f46565b611c34611df5565b611c3c611df5565b6001600160a01b03811615611c5457610397906119db565b604051631e4fbdf760e01b81525f6004820152602490fd5b90813b15611d01576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115611ce657611ce391611e36565b50565b505034611cef57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b929190835190611d39611d3483610f46565b6118d8565b925f5b828110611dd257505f5b60208110611db25750505b818110611d5f575090925050565b80611d95611d6f60019388611a69565b517fff000000000000000000000000000000000000000000000000000000000000001690565b611dab611da183610f46565b915f1a9186611a69565b5301611d51565b80826001921a611dcb611dc58387610fa9565b88611a69565b5301611d46565b80611de2611d6f6001938a611a69565b5f1a611dee8288611a69565b5301611d3c565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611e2457565b604051631afcd79f60e31b8152600490fd5b5f806101a093602081519101845af4611e4d611876565b9190611e755750805115611e6357805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580611ea8575b611e86575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611e7e56fea164736f6c6343000818000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
