{
  "_format": "hh-sol-artifact-1",
  "contractName": "DNSSECImpl",
  "sourceName": "contracts/@ens/dnssec/DNSSECImpl.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_anchors",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "AlgorithmUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "DigestUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [],
      "name": "Marker",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "NSEC3DigestUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "rrset",
          "type": "bytes"
        }
      ],
      "name": "RRSetUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "t",
          "type": "uint256"
        }
      ],
      "name": "Test",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "algorithms",
      "outputs": [
        {
          "internalType": "contract Algorithm",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "anchors",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "deleteType",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "deleteName",
          "type": "bytes"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature",
          "name": "nsec",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "proof",
          "type": "bytes"
        }
      ],
      "name": "deleteRRSet",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "deleteType",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "deleteName",
          "type": "bytes"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature",
          "name": "closestEncloser",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature",
          "name": "nextClosest",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "dnskey",
          "type": "bytes"
        }
      ],
      "name": "deleteRRSetNSEC3",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "digests",
      "outputs": [
        {
          "internalType": "contract Digest",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "name": "nsec3Digests",
      "outputs": [
        {
          "internalType": "contract NSEC3Digest",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "dnstype",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        }
      ],
      "name": "rrdata",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "bytes20",
          "name": "",
          "type": "bytes20"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "internalType": "contract Algorithm",
          "name": "algo",
          "type": "address"
        }
      ],
      "name": "setAlgorithm",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "internalType": "contract Digest",
          "name": "digest",
          "type": "address"
        }
      ],
      "name": "setDigest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "id",
          "type": "uint8"
        },
        {
          "internalType": "contract NSEC3Digest",
          "name": "digest",
          "type": "address"
        }
      ],
      "name": "setNSEC3Digest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "setOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature",
          "name": "input",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "proof",
          "type": "bytes"
        }
      ],
      "name": "submitRRSet",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature[]",
          "name": "input",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes",
          "name": "_proof",
          "type": "bytes"
        }
      ],
      "name": "submitRRSets",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801562000010575f80fd5b506040516200308b3803806200308b833981016040819052620000339162000189565b600180546001600160a01b031916331790555f620000528282620002e1565b50604080516060810182525f80825263e090bba06020830152825191928301916200007e9190620003ad565b60408051918290039091206001600160601b031916909152602b5f9081527fc92a43746f20f69898978a3075767b860ba247ac0639d1831bf8c942c5db2389602090815283517f95c6356c1b7a542b884d2484ef785c9c7224e77e1016c20007bddc15c23b452f8054928601519585015160601c6801000000000000000002600160401b600160e01b031963ffffffff978816640100000000026001600160401b03199095169790931696909617929092171693909317909255517f55ced933cdd5a34dd03eb5d4bef19ec6ebb251dcd7a988eee0c1b9a13baaa88b91620001669162000427565b60405180910390a150620004ce565b634e487b7160e01b5f52604160045260245ffd5b5f60208083850312156200019b575f80fd5b82516001600160401b0380821115620001b2575f80fd5b818501915085601f830112620001c6575f80fd5b815181811115620001db57620001db62000175565b604051601f8201601f19908116603f0116810190838211818310171562000206576200020662000175565b8160405282815288868487010111156200021e575f80fd5b5f93505b8284101562000241578484018601518185018701529285019262000222565b5f86848301015280965050505050505092915050565b600181811c908216806200026c57607f821691505b6020821081036200028b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002dc57805f5260205f20601f840160051c81016020851015620002b85750805b601f840160051c820191505b81811015620002d9575f8155600101620002c4565b50505b505050565b81516001600160401b03811115620002fd57620002fd62000175565b62000315816200030e845462000257565b8462000291565b602080601f8311600181146200034b575f8415620003335750858301515b5f19600386901b1c1916600185901b178555620003a5565b5f85815260208120601f198616915b828110156200037b578886015182559484019460019091019084016200035a565b50858210156200039957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f808354620003bc8162000257565b60018281168015620003d75760018114620003ed576200041b565b60ff19841687528215158302870194506200041b565b875f526020805f205f5b85811015620004125781548a820152908401908201620003f7565b50505082870194505b50929695505050505050565b604081525f60018060408401525f60608401526020608060208501525f8554620004518162000257565b80608088015260a0600183165f81146200047457600181146200049157620004c0565b60ff19841660a08a015260a083151560051b8a01019450620004c0565b895f5260205f205f5b84811015620004b75781548b82018501529088019087016200049a565b8a0160a0019550505b509298975050505050505050565b612baf80620004dc5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806373cc48a61161008857806398d35f201161006357806398d35f2014610215578063bd7ed31a1461021d578063c327deef14610245578063d7b82ebe1461026d575f80fd5b806373cc48a6146101af5780638438dc04146101ef5780638da5cb5b14610202575f80fd5b806313af4035116100c357806313af40351461015657806328e7677d146101695780632c095cbb1461017c578063435cc1621461018f575f80fd5b8063020ed8d3146100e9578063087991bc146100fe5780630b1a249514610143575b5f80fd5b6100fc6100f73660046122ff565b610280565b005b61011161010c36600461238a565b610300565b6040805163ffffffff94851681529390921660208401526001600160601b031916908201526060015b60405180910390f35b6100fc610151366004612510565b61036c565b6100fc6101643660046125c6565b6104da565b6100fc6101773660046122ff565b610512565b6100fc61018a3660046125e1565b61058a565b6101a261019d366004612674565b610656565b60405161013a919061278c565b6101d76101bd36600461279e565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161013a565b6100fc6101fd3660046122ff565b6106d2565b6001546101d7906001600160a01b031681565b6101a261074a565b6101d761022b36600461279e565b60056020525f90815260409020546001600160a01b031681565b6101d761025336600461279e565b60036020525f90815260409020546001600160a01b031681565b6101a261027b3660046127b7565b6107d5565b6001546001600160a01b03163314610296575f80fd5b60ff82165f8181526003602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527ff73c3c226af96b7f1ba666a21b3ceaf2be3ee6a365e3178fd9cd1eaae0075aa891015b60405180910390a15050565b5f805f8060025f8787604051610317929190612817565b604080519182900390912082526020808301939093529081015f90812061ffff8b16825290925290205463ffffffff80821695506401000000008204169350600160401b900460601b91505093509350939050565b83516020808601919091205f90815260028252604080822061ffff891683529092529081205463ffffffff16906103a385846107ea565b90506103b0818784610889565b6103b8612239565b845151156103d7576103ca85856107ea565b90506103d7818885610889565b5f6103e1836108cc565b602081015190915060fe16156103f5575f80fd5b61040081602761092a565b158015610425575061041381600261092a565b1580610425575061042581600661092a565b61042d575f80fd5b61043e89898561012001518461093a565b156104795787516020808a01919091205f90815260028252604080822061ffff8d1683529092522080546001600160e01b03191690556104cf565b6104988884610120015183856101200151610493876108cc565b610968565b156100e55787516020808a01919091205f90815260028252604080822061ffff8d1683529092522080546001600160e01b03191690555b505050505050505050565b6001546001600160a01b031633146104f0575f80fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610528575f80fd5b60ff82165f8181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f2fcc274c3b72dd483ab201bfa87295e3817e8b9b10693219873b722ca1af00c791016102f4565b610592612239565b61059c83836107ea565b805190915061ffff16602f146105b0575f80fd5b60a081015184516020808701919091205f90815260028252604080822061ffff8a16835290925220546105e9919063ffffffff16610a7c565b6105f1575f80fd5b5f6105fb82610a94565b9050805151602082015110156100e55761061c818361012001518789610aab565b505082516020808501919091205f90815260028252604080822061ffff881683529092522080546001600160e01b03191690555b50505050565b60605f83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509394505050505b85518110156106c7576106bd8682815181106106af576106af612826565b602002602001015183610c4a565b9150600101610691565b5090505b9392505050565b6001546001600160a01b031633146106e8575f80fd5b60ff82165f8181526005602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fc7eec866a7a1386188cc3ca20ffea75b71bd3e90a60b6791b1d3f0971145118d91016102f4565b5f80546107569061283a565b80601f01602080910402602001604051908101604052809291908181526020018280546107829061283a565b80156107cd5780601f106107a4576101008083540402835291602001916107cd565b820191905f5260205f20905b8154815290600101906020018083116107b057829003601f168201915b505050505081565b60606107e18383610c4a565b90505b92915050565b6107f2612239565b82516107fd90610dc6565b905061080d8160e0015183610ebf565b610815575f80fd5b5f61082382835f0151610f25565b604083015190915060ff16610838825f610fcc565b14610841575f80fd5b610120820181905260808201516108589042610a7c565b610860575f80fd5b61086e428360a00151610a7c565b610876575f80fd5b61088281838686611026565b5092915050565b6108978360a0015182610a7c565b61089f575f80fd5b825161ffff166032146108b0575f80fd5b6108bf83610120015183611106565b6108c7575f80fd5b505050565b6040805160c0810182525f8082526020820181905291810182905260608082018190526080820183905260a08201529061090583610a94565b60a081015160c08201519192506106cb91610921908290612880565b83519190611172565b5f6107e18360a001515f846112b4565b5f6109468284866113c1565b1561095d57610955828661092a565b159050610960565b505f5b949350505050565b60208101515f9060fe161561097b575f80fd5b5f610985866113e6565b90505f610991856113e6565b90505f8061099f8a82611401565b6109aa906001612893565b60ff1690505b8951811015610a6b57836109dc896109d784858f516109cf9190612880565b8f9190611424565b6114a4565b03610a3f575f6109f7876109d785868f516109cf9190612880565b90508660800151841015610a23578381118015610a175750866080015181105b95505050505050610a73565b83811180610a1757508660800151811095505050505050610a73565b905080610a4c8a82611401565b610a57906001612893565b610a649060ff16826128ac565b90506109b0565b505f93505050505b95945050505050565b5f80610a8883856128bf565b60030b12159392505050565b610a9c61228e565b6107e48261010001515f61152d565b60a084015184515f90610abe9083611548565b90505f8660a001518760c00151610ad59190612880565b9050818111610ae2575f80fd5b5f610aed868861159f565b9050805f03610b1a57610b0c610b0384866128ac565b895190876112b4565b15610b15575f80fd5b610b5b565b87515f90610b29908686611424565b90505f8213610b36575f80fd5b5f610b41898361159f565b12156104cf575f610b52888361159f565b126104cf575f80fd5b5050505050505050565b60c08101516020820181905281515111610b7c5750565b5f610b8e825f01518360200151611548565b8260200151610b9d91906128ac565b8251909150610bac90826116ec565b61ffff166040830152610bc06002826128ac565b8251909150610bcf90826116ec565b61ffff166060830152610be36002826128ac565b8251909150610bf29082611712565b63ffffffff166080830152610c086004826128ac565b82519091505f90610c1990836116ec565b61ffff169050610c2a6002836128ac565b60a084018190529150610c3d81836128ac565b60c0909301929092525050565b6060610c54612239565b610c5e84846107ea565b61012081015180516020918201205f908152600282526040808220845161ffff16835290925220805491925090600160401b900460601b6001600160601b03191615610cc35760a08201518154610cbb919063ffffffff16610a7c565b610cc3575f80fd5b604080516060808201835260a085015163ffffffff9081168352608086015181166020808501918252610100880180518051908301206001600160601b0319168688019081526101208a0180518051908501205f908152600285528981208c5161ffff16825290945292889020965187549451915190961c600160401b0268010000000000000000600160e01b03199186166401000000000267ffffffffffffffff19909516969095169590951792909217939093169190911790925551905191517f55ced933cdd5a34dd03eb5d4bef19ec6ebb251dcd7a988eee0c1b9a13baaa88b92610db192916128e6565b60405180910390a15061010001519392505050565b610dce612239565b610dd8825f6116ec565b61ffff168152610de9826002611401565b60ff166020820152610dfc826003611401565b60ff166040820152610e0f826004611712565b63ffffffff9081166060830152610e2b90839060089061171216565b63ffffffff9081166080830152610e47908390600c9061171216565b63ffffffff90811660a0830152610e639083906010906116ec16565b61ffff1660c0820152610e7782601261173a565b60e0820181905251610eb490610e8e9060126128ac565b8260e001515160128551610ea29190612880565b610eac9190612880565b849190611424565b610100820152919050565b5f80610ed5610ece8483611548565b84906116ec565b83516020808601919091208651878301205f90815260028352604080822061ffff90951682529390925291902054600160401b900460601b6001600160601b031990811691161491505092915050565b60605f610f3184610a94565b90505b8051516020820151101561088257606081015161ffff16600114610f56575f80fd5b81515f03610f6e57610f6781611754565b9150610fa7565b60208101518151610f7e91611548565b825114610f89575f80fd5b805160208201518351610f9f9285925f92611775565b610fa7575f80fd5b8261ffff16816040015161ffff1614610fbe575f80fd5b610fc781610b65565b610f34565b5f805b83518310610fdf57610fdf61290a565b5f610fea8585611401565b60ff169050610ffa8160016128ac565b61100490856128ac565b9350805f0361101357506107e1565b61101e6001836128ac565b915050610fcf565b83518360e00151511115611038575f80fd5b61105c5f858560e0015151875161104f9190612880565b60e0870151929190611797565b611064575f80fd5b5f61106f828261152d565b9050602b61ffff16816040015161ffff160361109d576110908484836117cb565b611098575f80fd5b6110ff565b603061ffff16816040015161ffff16036110bc5761109084848361185f565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d985b1a59081c1c9bdbd988199bdd5b9960621b604482015260640160405180910390fd5b5050505050565b5f806111128482611401565b61111d906001612893565b60ff1690505f5b835181101561095d5761113984828785611797565b15611149576001925050506107e4565b6111538482611401565b61115e906001612893565b61116b9060ff16826128ac565b9050611124565b6040805160c0810182525f8082526020820181905291810182905260608082018190526080820183905260a0820152906111ac83856128ac565b90506111c26111bb5f866128ac565b8690611401565b60ff1682526111d56111bb6001866128ac565b60ff1660208301526111f26111eb6002866128ac565b86906116ec565b61ffff1660408301525f61121161120a6004876128ac565b8790611401565b905061121e6005866128ac565b945061122e868660ff8416611424565b606084015261124060ff8216866128ac565b94505f61124d8787611401565b905060208160ff16111561125f575f80fd5b61126a6001876128ac565b955061127a878760ff8416611900565b608085015261128c60ff8216876128ac565b95506112a48661129c8186612880565b899190611424565b60a0850152509195945050505050565b5f60ff600883811c82169183916112cc918616612932565b90505f6112dd600780871690612952565b600160ff919091161b9050855b87518110156113b4575f6112fe8983611401565b90505f61131661130f8460016128ac565b8b90611401565b90508160ff168660ff161015611334575f96505050505050506106cb565b8160ff168660ff1603611393578460ff168160ff161161135c575f96505050505050506106cb565b8361137f61136d60ff8816866128ac565b6113789060026128ac565b8c90611401565b1660ff165f141596505050505050506106cb565b61139e816002612893565b6113ab9060ff16846128ac565b925050506112ea565b505f979650505050505050565b5f806113cd85846114a4565b90505f6113d9856113e6565b9190911495945050505050565b5f6107e460016113f68484611401565b84919060ff1661193d565b5f82828151811061141457611414612826565b016020015160f81c905092915050565b825160609061143383856128ac565b111561143d575f80fd5b5f8267ffffffffffffffff811115611457576114576123d9565b6040519080825280601f01601f191660200182016040528015611481576020820181803683370190505b50905060208082019086860101611499828287611b43565b509095945050505050565b815160ff165f9081526005602052604080822054606085015182860151925163347ced5960e11b81526001600160a01b03909216926368f9dab2926114ee9291879160040161296b565b602060405180830381865afa158015611509573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e191906129a4565b61153561228e565b82815260c081018290526107e481610b65565b5f815b8351811061155b5761155b61290a565b5f6115668583611401565b60ff1690506115768160016128ac565b61158090836128ac565b9150805f0361158f5750611595565b5061154b565b6109608382612880565b5f6115aa8383611b98565b156115b657505f6107e4565b5f805f805f6115c5885f610fcc565b90505f6115d2885f610fcc565b90505b808211156115fe578593506115ea8987611bb3565b9550816115f6816129bb565b9250506115d5565b81811115611627578492506116138886611bb3565b94508061161f816129bb565b9150506115fe565b5f8211801561163f575061163d89878a88611797565b155b15611674578593506116518987611bb3565b95508492506116608886611bb3565b945061166d600183612880565b9150611627565b855f0361168a575f1996505050505050506107e4565b845f036116a057600196505050505050506107e4565b6116df6116ae8560016128ac565b6116b88b87611401565b60ff168a6116c78760016128ac565b6116d18d89611401565b8e949392919060ff16611bd6565b9998505050505050505050565b81515f906116fb8360026128ac565b1115611705575f80fd5b50016002015161ffff1690565b81515f906117218360046128ac565b111561172b575f80fd5b50016004015163ffffffff1690565b60605f6117478484611548565b9050610960848483611424565b602081015181516060916107e49161176c9082611548565b84519190611424565b5f611781848484611cc6565b61178c878785611cc6565b149695505050505050565b5f6117af83838486516117aa9190612880565b611cc6565b6117c186868789516117aa9190612880565b1495945050505050565b5f806117d685610a94565b90505b8051516020820151101561095d57604081015161ffff166030146117fb575f80fd5b5f61180582611ce8565b90505f61181e5f835184611d049092919063ffffffff16565b905061182c81838989611da0565b1561184f5761184561183d84611754565b868385611e9b565b93505050506106cb565b505061185a81610b65565b6117d9565b5f6118778460e0015161187184611754565b90611b98565b61187f575f80fd5b815151602083015110156118f75761189e8460e0015161187184611754565b6118a6575f80fd5b5f6118b083611ce8565b90505f6118c95f835184611d049092919063ffffffff16565b90506118d781838888611da0565b156118e7576001925050506106cb565b50506118f282610b65565b61187f565b505f9392505050565b5f602082111561190e575f80fd5b835161191a83856128ac565b1115611924575f80fd5b506020919092018101519190036101000a5f1901191690565b5f603482111561194b575f80fd5b5f80805b84811015611a29575f8761196383896128ac565b8151811061197357611973612826565b01602001516001600160f81b0319169050600360fc1b81108015906119a65750603d60f91b6001600160f81b0319821611155b6119ae575f80fd5b604051806080016040528060478152602001612b5c604791396119d6603060f884901c612880565b815181106119e6576119e6612826565b0160209081015160f81c93508311156119fd575f80fd5b611a08600187612880565b8203611a145750611a29565b5060059290921b60ff8216179160010161194f565b505f611a368560056129d0565b9050611a436008866129e7565b5f03611a5a578160ff16600584901b179250611b29565b611a656008866129e7565b600203611a935760028260ff16901c60ff16600384901b179250600281611a8c9190612880565b9050611b29565b611a9e6008866129e7565b600403611ac55760048260ff16901c60ff16600184901b179250600481611a8c9190612880565b611ad06008866129e7565b600503611af75760018260ff16901c60ff16600484901b179250600181611a8c9190612880565b611b026008866129e7565b6007036100e55760038260ff16901c60ff16600284901b179250600381611a8c9190612880565b611b3581610100612880565b9290921b9695505050505050565b60208110611b7b5781518352611b5a6020846128ac565b9250611b676020836128ac565b9150611b74602082612880565b9050611b43565b905182516020929092036101000a5f190180199091169116179052565b5f815183511480156107e157506107e1835f845f8751611775565b5f611bbe8383611401565b60ff16611bcc8360016128ac565b6107e191906128ac565b5f8480831015611be35750815b6020878901810190858701015f5b83811015611cab5782518251808214611c7b575f6020871115611c1657505f19611c52565b600184611c24896020612880565b611c2e91906128ac565b611c399060086129d0565b611c44906002612ada565b611c4e9190612880565b1990505b5f611c61838316858416612ae5565b90508015611c78579750611cbc9650505050505050565b50505b611c866020866128ac565b9450611c936020856128ac565b93505050602081611ca491906128ac565b9050611bf1565b50611cb68589612ae5565b93505050505b9695505050505050565b82515f90611cd483856128ac565b1115611cde575f80fd5b5091016020012090565b60a081015160c08201516060916107e49161176c908290612880565b604080516080810182525f8082526020820181905291810191909152606080820152611d3a611d335f856128ac565b85906116ec565b61ffff168152611d55611d4e6002856128ac565b8590611401565b60ff166020820152611d6b611d4e6003856128ac565b60ff166040820152611d94611d816004856128ac565b611d8c600485612880565b869190611424565b60608201529392505050565b5f846020015160ff16600314611db757505f610960565b826020015160ff16856040015160ff1614611dd357505f610960565b5f611ddd85611f96565b90508360c0015161ffff168161ffff1614611dfb575f915050610960565b8551610100165f03611e10575f915050610960565b60408087015160ff165f908152600360209081529082902054855191860151925163de8f50a160e01b81526001600160a01b039091169263de8f50a192611e5c928a9290600401612b04565b602060405180830381865afa158015611e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cbc9190612b3c565b5f80611ea683611f96565b90505b84515160208601511015611f8b5760a085015160c08601515f91611edb91611ed2908290612880565b88519190611d04565b90508161ffff16815f015161ffff1614611ef55750611f7d565b846040015160ff16816020015160ff1614611f105750611f7d565b60408051808201909152606081525f6020820152611f3c85518951611f3591906128ac565b8290611ff7565b50611f47818961205a565b50611f52818661205a565b50611f698260400151825f0151846060015161207f565b15611f7a5760019350505050610960565b50505b611f8685610b65565b611ea9565b505f95945050505050565b5f805f5b8351811015611fe8576001811615611fbe57611fb68482611401565b60ff16611fd0565b6008611fca8583611401565b60ff16901b5b611fde9061ffff16836128ac565b9150600101611f9a565b506106cb601082901c826128ac565b60408051808201909152606081525f60208201526120166020836129e7565b1561203e576120266020836129e7565b612031906020612880565b61203b90836128ac565b91505b506020828101829052604080518085525f815290920101905290565b60408051808201909152606081525f60208201526107e183845f015151848551612126565b60ff83165f908152600460205260408120546001600160a01b03166120a557505f6106cb565b60ff84165f90815260046020819052604091829020549151637bf41d7760e11b81526001600160a01b039092169163f7e83aee916120e79187918791016128e6565b602060405180830381865afa158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109609190612b3c565b60408051808201909152606081525f60208201528251821115612147575f80fd5b602085015161215683866128ac565b111561218957612189856121798760200151878661217491906128ac565b61220c565b6121849060026129d0565b612222565b5f808651805187602083010193508088870111156121a75787860182525b505050602084015b602084106121e757805182526121c66020836128ac565b91506121d36020826128ac565b90506121e0602085612880565b93506121af565b5181515f1960208690036101000a019081169019919091161790525083949350505050565b5f8183111561221c5750816107e4565b50919050565b815161222e8383611ff7565b50610650838261205a565b60408051610140810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c082019290925260e08101829052610100810182905261012081019190915290565b6040518060e00160405280606081526020015f81526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f81526020015f81525090565b803560ff811681146122e3575f80fd5b919050565b6001600160a01b03811681146122fc575f80fd5b50565b5f8060408385031215612310575f80fd5b612319836122d3565b91506020830135612329816122e8565b809150509250929050565b803561ffff811681146122e3575f80fd5b5f8083601f840112612355575f80fd5b50813567ffffffffffffffff81111561236c575f80fd5b602083019150836020828501011115612383575f80fd5b9250929050565b5f805f6040848603121561239c575f80fd5b6123a584612334565b9250602084013567ffffffffffffffff8111156123c0575f80fd5b6123cc86828701612345565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612416576124166123d9565b604052919050565b5f82601f83011261242d575f80fd5b813567ffffffffffffffff811115612447576124476123d9565b61245a601f8201601f19166020016123ed565b81815284602083860101111561246e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6040828403121561249a575f80fd5b6040516040810167ffffffffffffffff82821081831117156124be576124be6123d9565b8160405282935084359150808211156124d5575f80fd5b6124e18683870161241e565b835260208501359150808211156124f6575f80fd5b506125038582860161241e565b6020830152505092915050565b5f805f805f60a08688031215612524575f80fd5b61252d86612334565b9450602086013567ffffffffffffffff80821115612549575f80fd5b61255589838a0161241e565b9550604088013591508082111561256a575f80fd5b61257689838a0161248a565b9450606088013591508082111561258b575f80fd5b61259789838a0161248a565b935060808801359150808211156125ac575f80fd5b506125b98882890161241e565b9150509295509295909350565b5f602082840312156125d6575f80fd5b81356107e1816122e8565b5f805f80608085870312156125f4575f80fd5b6125fd85612334565b9350602085013567ffffffffffffffff80821115612619575f80fd5b6126258883890161241e565b9450604087013591508082111561263a575f80fd5b6126468883890161248a565b9350606087013591508082111561265b575f80fd5b506126688782880161241e565b91505092959194509250565b5f805f60408486031215612686575f80fd5b833567ffffffffffffffff8082111561269d575f80fd5b818601915086601f8301126126b0575f80fd5b81356020828211156126c4576126c46123d9565b8160051b6126d38282016123ed565b928352848101820192828101908b8511156126ec575f80fd5b83870192505b8483101561272657823586811115612708575f80fd5b6127168d86838b010161248a565b83525091830191908301906126f2565b985050508701359250508082111561273c575f80fd5b506123cc86828701612345565b5f81518084525f5b8181101561276d57602081850181015186830182015201612751565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6107e16020830184612749565b5f602082840312156127ae575f80fd5b6107e1826122d3565b5f80604083850312156127c8575f80fd5b823567ffffffffffffffff808211156127df575f80fd5b6127eb8683870161248a565b93506020850135915080821115612800575f80fd5b5061280d8582860161241e565b9150509250929050565b818382375f9101908152919050565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061284e57607f821691505b60208210810361221c57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156107e4576107e461286c565b60ff81811683821601908111156107e4576107e461286c565b808201808211156107e4576107e461286c565b600382810b9082900b03637fffffff198112637fffffff821317156107e4576107e461286c565b604081525f6128f86040830185612749565b8281036020840152610a738185612749565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f61ffff808416806129465761294661291e565b92169190910492915050565b60ff82811682821603908111156107e4576107e461286c565b606081525f61297d6060830186612749565b828103602084015261298f8186612749565b91505061ffff83166040830152949350505050565b5f602082840312156129b4575f80fd5b5051919050565b5f816129c9576129c961286c565b505f190190565b80820281158282048414176107e4576107e461286c565b5f826129f5576129f561291e565b500690565b600181815b80851115612a3457815f1904821115612a1a57612a1a61286c565b80851615612a2757918102915b93841c93908002906129ff565b509250929050565b5f82612a4a575060016107e4565b81612a5657505f6107e4565b8160018114612a6c5760028114612a7657612a92565b60019150506107e4565b60ff841115612a8757612a8761286c565b50506001821b6107e4565b5060208310610133831016604e8410600b8410161715612ab5575081810a6107e4565b612abf83836129fa565b805f1904821115612ad257612ad261286c565b029392505050565b5f6107e18383612a3c565b8181035f8312801583831316838312821617156108825761088261286c565b606081525f612b166060830186612749565b8281036020840152612b288186612749565b90508281036040840152611cbc8185612749565b5f60208284031215612b4c575f80fd5b815180151581146107e1575f80fdfe00010203040506070809ffffffffffffff0a0b0c0d0e0f101112131415161718191a1b1c1d1e1fffffffffffffffffffff0a0b0c0d0e0f101112131415161718191a1b1c1d1e1fa164736f6c6343000818000a",
  "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806373cc48a61161008857806398d35f201161006357806398d35f2014610215578063bd7ed31a1461021d578063c327deef14610245578063d7b82ebe1461026d575f80fd5b806373cc48a6146101af5780638438dc04146101ef5780638da5cb5b14610202575f80fd5b806313af4035116100c357806313af40351461015657806328e7677d146101695780632c095cbb1461017c578063435cc1621461018f575f80fd5b8063020ed8d3146100e9578063087991bc146100fe5780630b1a249514610143575b5f80fd5b6100fc6100f73660046122ff565b610280565b005b61011161010c36600461238a565b610300565b6040805163ffffffff94851681529390921660208401526001600160601b031916908201526060015b60405180910390f35b6100fc610151366004612510565b61036c565b6100fc6101643660046125c6565b6104da565b6100fc6101773660046122ff565b610512565b6100fc61018a3660046125e1565b61058a565b6101a261019d366004612674565b610656565b60405161013a919061278c565b6101d76101bd36600461279e565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161013a565b6100fc6101fd3660046122ff565b6106d2565b6001546101d7906001600160a01b031681565b6101a261074a565b6101d761022b36600461279e565b60056020525f90815260409020546001600160a01b031681565b6101d761025336600461279e565b60036020525f90815260409020546001600160a01b031681565b6101a261027b3660046127b7565b6107d5565b6001546001600160a01b03163314610296575f80fd5b60ff82165f8181526003602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527ff73c3c226af96b7f1ba666a21b3ceaf2be3ee6a365e3178fd9cd1eaae0075aa891015b60405180910390a15050565b5f805f8060025f8787604051610317929190612817565b604080519182900390912082526020808301939093529081015f90812061ffff8b16825290925290205463ffffffff80821695506401000000008204169350600160401b900460601b91505093509350939050565b83516020808601919091205f90815260028252604080822061ffff891683529092529081205463ffffffff16906103a385846107ea565b90506103b0818784610889565b6103b8612239565b845151156103d7576103ca85856107ea565b90506103d7818885610889565b5f6103e1836108cc565b602081015190915060fe16156103f5575f80fd5b61040081602761092a565b158015610425575061041381600261092a565b1580610425575061042581600661092a565b61042d575f80fd5b61043e89898561012001518461093a565b156104795787516020808a01919091205f90815260028252604080822061ffff8d1683529092522080546001600160e01b03191690556104cf565b6104988884610120015183856101200151610493876108cc565b610968565b156100e55787516020808a01919091205f90815260028252604080822061ffff8d1683529092522080546001600160e01b03191690555b505050505050505050565b6001546001600160a01b031633146104f0575f80fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610528575f80fd5b60ff82165f8181526004602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527f2fcc274c3b72dd483ab201bfa87295e3817e8b9b10693219873b722ca1af00c791016102f4565b610592612239565b61059c83836107ea565b805190915061ffff16602f146105b0575f80fd5b60a081015184516020808701919091205f90815260028252604080822061ffff8a16835290925220546105e9919063ffffffff16610a7c565b6105f1575f80fd5b5f6105fb82610a94565b9050805151602082015110156100e55761061c818361012001518789610aab565b505082516020808501919091205f90815260028252604080822061ffff881683529092522080546001600160e01b03191690555b50505050565b60605f83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509394505050505b85518110156106c7576106bd8682815181106106af576106af612826565b602002602001015183610c4a565b9150600101610691565b5090505b9392505050565b6001546001600160a01b031633146106e8575f80fd5b60ff82165f8181526005602090815260409182902080546001600160a01b0319166001600160a01b0386169081179091558251938452908301527fc7eec866a7a1386188cc3ca20ffea75b71bd3e90a60b6791b1d3f0971145118d91016102f4565b5f80546107569061283a565b80601f01602080910402602001604051908101604052809291908181526020018280546107829061283a565b80156107cd5780601f106107a4576101008083540402835291602001916107cd565b820191905f5260205f20905b8154815290600101906020018083116107b057829003601f168201915b505050505081565b60606107e18383610c4a565b90505b92915050565b6107f2612239565b82516107fd90610dc6565b905061080d8160e0015183610ebf565b610815575f80fd5b5f61082382835f0151610f25565b604083015190915060ff16610838825f610fcc565b14610841575f80fd5b610120820181905260808201516108589042610a7c565b610860575f80fd5b61086e428360a00151610a7c565b610876575f80fd5b61088281838686611026565b5092915050565b6108978360a0015182610a7c565b61089f575f80fd5b825161ffff166032146108b0575f80fd5b6108bf83610120015183611106565b6108c7575f80fd5b505050565b6040805160c0810182525f8082526020820181905291810182905260608082018190526080820183905260a08201529061090583610a94565b60a081015160c08201519192506106cb91610921908290612880565b83519190611172565b5f6107e18360a001515f846112b4565b5f6109468284866113c1565b1561095d57610955828661092a565b159050610960565b505f5b949350505050565b60208101515f9060fe161561097b575f80fd5b5f610985866113e6565b90505f610991856113e6565b90505f8061099f8a82611401565b6109aa906001612893565b60ff1690505b8951811015610a6b57836109dc896109d784858f516109cf9190612880565b8f9190611424565b6114a4565b03610a3f575f6109f7876109d785868f516109cf9190612880565b90508660800151841015610a23578381118015610a175750866080015181105b95505050505050610a73565b83811180610a1757508660800151811095505050505050610a73565b905080610a4c8a82611401565b610a57906001612893565b610a649060ff16826128ac565b90506109b0565b505f93505050505b95945050505050565b5f80610a8883856128bf565b60030b12159392505050565b610a9c61228e565b6107e48261010001515f61152d565b60a084015184515f90610abe9083611548565b90505f8660a001518760c00151610ad59190612880565b9050818111610ae2575f80fd5b5f610aed868861159f565b9050805f03610b1a57610b0c610b0384866128ac565b895190876112b4565b15610b15575f80fd5b610b5b565b87515f90610b29908686611424565b90505f8213610b36575f80fd5b5f610b41898361159f565b12156104cf575f610b52888361159f565b126104cf575f80fd5b5050505050505050565b60c08101516020820181905281515111610b7c5750565b5f610b8e825f01518360200151611548565b8260200151610b9d91906128ac565b8251909150610bac90826116ec565b61ffff166040830152610bc06002826128ac565b8251909150610bcf90826116ec565b61ffff166060830152610be36002826128ac565b8251909150610bf29082611712565b63ffffffff166080830152610c086004826128ac565b82519091505f90610c1990836116ec565b61ffff169050610c2a6002836128ac565b60a084018190529150610c3d81836128ac565b60c0909301929092525050565b6060610c54612239565b610c5e84846107ea565b61012081015180516020918201205f908152600282526040808220845161ffff16835290925220805491925090600160401b900460601b6001600160601b03191615610cc35760a08201518154610cbb919063ffffffff16610a7c565b610cc3575f80fd5b604080516060808201835260a085015163ffffffff9081168352608086015181166020808501918252610100880180518051908301206001600160601b0319168688019081526101208a0180518051908501205f908152600285528981208c5161ffff16825290945292889020965187549451915190961c600160401b0268010000000000000000600160e01b03199186166401000000000267ffffffffffffffff19909516969095169590951792909217939093169190911790925551905191517f55ced933cdd5a34dd03eb5d4bef19ec6ebb251dcd7a988eee0c1b9a13baaa88b92610db192916128e6565b60405180910390a15061010001519392505050565b610dce612239565b610dd8825f6116ec565b61ffff168152610de9826002611401565b60ff166020820152610dfc826003611401565b60ff166040820152610e0f826004611712565b63ffffffff9081166060830152610e2b90839060089061171216565b63ffffffff9081166080830152610e47908390600c9061171216565b63ffffffff90811660a0830152610e639083906010906116ec16565b61ffff1660c0820152610e7782601261173a565b60e0820181905251610eb490610e8e9060126128ac565b8260e001515160128551610ea29190612880565b610eac9190612880565b849190611424565b610100820152919050565b5f80610ed5610ece8483611548565b84906116ec565b83516020808601919091208651878301205f90815260028352604080822061ffff90951682529390925291902054600160401b900460601b6001600160601b031990811691161491505092915050565b60605f610f3184610a94565b90505b8051516020820151101561088257606081015161ffff16600114610f56575f80fd5b81515f03610f6e57610f6781611754565b9150610fa7565b60208101518151610f7e91611548565b825114610f89575f80fd5b805160208201518351610f9f9285925f92611775565b610fa7575f80fd5b8261ffff16816040015161ffff1614610fbe575f80fd5b610fc781610b65565b610f34565b5f805b83518310610fdf57610fdf61290a565b5f610fea8585611401565b60ff169050610ffa8160016128ac565b61100490856128ac565b9350805f0361101357506107e1565b61101e6001836128ac565b915050610fcf565b83518360e00151511115611038575f80fd5b61105c5f858560e0015151875161104f9190612880565b60e0870151929190611797565b611064575f80fd5b5f61106f828261152d565b9050602b61ffff16816040015161ffff160361109d576110908484836117cb565b611098575f80fd5b6110ff565b603061ffff16816040015161ffff16036110bc5761109084848361185f565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d985b1a59081c1c9bdbd988199bdd5b9960621b604482015260640160405180910390fd5b5050505050565b5f806111128482611401565b61111d906001612893565b60ff1690505f5b835181101561095d5761113984828785611797565b15611149576001925050506107e4565b6111538482611401565b61115e906001612893565b61116b9060ff16826128ac565b9050611124565b6040805160c0810182525f8082526020820181905291810182905260608082018190526080820183905260a0820152906111ac83856128ac565b90506111c26111bb5f866128ac565b8690611401565b60ff1682526111d56111bb6001866128ac565b60ff1660208301526111f26111eb6002866128ac565b86906116ec565b61ffff1660408301525f61121161120a6004876128ac565b8790611401565b905061121e6005866128ac565b945061122e868660ff8416611424565b606084015261124060ff8216866128ac565b94505f61124d8787611401565b905060208160ff16111561125f575f80fd5b61126a6001876128ac565b955061127a878760ff8416611900565b608085015261128c60ff8216876128ac565b95506112a48661129c8186612880565b899190611424565b60a0850152509195945050505050565b5f60ff600883811c82169183916112cc918616612932565b90505f6112dd600780871690612952565b600160ff919091161b9050855b87518110156113b4575f6112fe8983611401565b90505f61131661130f8460016128ac565b8b90611401565b90508160ff168660ff161015611334575f96505050505050506106cb565b8160ff168660ff1603611393578460ff168160ff161161135c575f96505050505050506106cb565b8361137f61136d60ff8816866128ac565b6113789060026128ac565b8c90611401565b1660ff165f141596505050505050506106cb565b61139e816002612893565b6113ab9060ff16846128ac565b925050506112ea565b505f979650505050505050565b5f806113cd85846114a4565b90505f6113d9856113e6565b9190911495945050505050565b5f6107e460016113f68484611401565b84919060ff1661193d565b5f82828151811061141457611414612826565b016020015160f81c905092915050565b825160609061143383856128ac565b111561143d575f80fd5b5f8267ffffffffffffffff811115611457576114576123d9565b6040519080825280601f01601f191660200182016040528015611481576020820181803683370190505b50905060208082019086860101611499828287611b43565b509095945050505050565b815160ff165f9081526005602052604080822054606085015182860151925163347ced5960e11b81526001600160a01b03909216926368f9dab2926114ee9291879160040161296b565b602060405180830381865afa158015611509573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e191906129a4565b61153561228e565b82815260c081018290526107e481610b65565b5f815b8351811061155b5761155b61290a565b5f6115668583611401565b60ff1690506115768160016128ac565b61158090836128ac565b9150805f0361158f5750611595565b5061154b565b6109608382612880565b5f6115aa8383611b98565b156115b657505f6107e4565b5f805f805f6115c5885f610fcc565b90505f6115d2885f610fcc565b90505b808211156115fe578593506115ea8987611bb3565b9550816115f6816129bb565b9250506115d5565b81811115611627578492506116138886611bb3565b94508061161f816129bb565b9150506115fe565b5f8211801561163f575061163d89878a88611797565b155b15611674578593506116518987611bb3565b95508492506116608886611bb3565b945061166d600183612880565b9150611627565b855f0361168a575f1996505050505050506107e4565b845f036116a057600196505050505050506107e4565b6116df6116ae8560016128ac565b6116b88b87611401565b60ff168a6116c78760016128ac565b6116d18d89611401565b8e949392919060ff16611bd6565b9998505050505050505050565b81515f906116fb8360026128ac565b1115611705575f80fd5b50016002015161ffff1690565b81515f906117218360046128ac565b111561172b575f80fd5b50016004015163ffffffff1690565b60605f6117478484611548565b9050610960848483611424565b602081015181516060916107e49161176c9082611548565b84519190611424565b5f611781848484611cc6565b61178c878785611cc6565b149695505050505050565b5f6117af83838486516117aa9190612880565b611cc6565b6117c186868789516117aa9190612880565b1495945050505050565b5f806117d685610a94565b90505b8051516020820151101561095d57604081015161ffff166030146117fb575f80fd5b5f61180582611ce8565b90505f61181e5f835184611d049092919063ffffffff16565b905061182c81838989611da0565b1561184f5761184561183d84611754565b868385611e9b565b93505050506106cb565b505061185a81610b65565b6117d9565b5f6118778460e0015161187184611754565b90611b98565b61187f575f80fd5b815151602083015110156118f75761189e8460e0015161187184611754565b6118a6575f80fd5b5f6118b083611ce8565b90505f6118c95f835184611d049092919063ffffffff16565b90506118d781838888611da0565b156118e7576001925050506106cb565b50506118f282610b65565b61187f565b505f9392505050565b5f602082111561190e575f80fd5b835161191a83856128ac565b1115611924575f80fd5b506020919092018101519190036101000a5f1901191690565b5f603482111561194b575f80fd5b5f80805b84811015611a29575f8761196383896128ac565b8151811061197357611973612826565b01602001516001600160f81b0319169050600360fc1b81108015906119a65750603d60f91b6001600160f81b0319821611155b6119ae575f80fd5b604051806080016040528060478152602001612b5c604791396119d6603060f884901c612880565b815181106119e6576119e6612826565b0160209081015160f81c93508311156119fd575f80fd5b611a08600187612880565b8203611a145750611a29565b5060059290921b60ff8216179160010161194f565b505f611a368560056129d0565b9050611a436008866129e7565b5f03611a5a578160ff16600584901b179250611b29565b611a656008866129e7565b600203611a935760028260ff16901c60ff16600384901b179250600281611a8c9190612880565b9050611b29565b611a9e6008866129e7565b600403611ac55760048260ff16901c60ff16600184901b179250600481611a8c9190612880565b611ad06008866129e7565b600503611af75760018260ff16901c60ff16600484901b179250600181611a8c9190612880565b611b026008866129e7565b6007036100e55760038260ff16901c60ff16600284901b179250600381611a8c9190612880565b611b3581610100612880565b9290921b9695505050505050565b60208110611b7b5781518352611b5a6020846128ac565b9250611b676020836128ac565b9150611b74602082612880565b9050611b43565b905182516020929092036101000a5f190180199091169116179052565b5f815183511480156107e157506107e1835f845f8751611775565b5f611bbe8383611401565b60ff16611bcc8360016128ac565b6107e191906128ac565b5f8480831015611be35750815b6020878901810190858701015f5b83811015611cab5782518251808214611c7b575f6020871115611c1657505f19611c52565b600184611c24896020612880565b611c2e91906128ac565b611c399060086129d0565b611c44906002612ada565b611c4e9190612880565b1990505b5f611c61838316858416612ae5565b90508015611c78579750611cbc9650505050505050565b50505b611c866020866128ac565b9450611c936020856128ac565b93505050602081611ca491906128ac565b9050611bf1565b50611cb68589612ae5565b93505050505b9695505050505050565b82515f90611cd483856128ac565b1115611cde575f80fd5b5091016020012090565b60a081015160c08201516060916107e49161176c908290612880565b604080516080810182525f8082526020820181905291810191909152606080820152611d3a611d335f856128ac565b85906116ec565b61ffff168152611d55611d4e6002856128ac565b8590611401565b60ff166020820152611d6b611d4e6003856128ac565b60ff166040820152611d94611d816004856128ac565b611d8c600485612880565b869190611424565b60608201529392505050565b5f846020015160ff16600314611db757505f610960565b826020015160ff16856040015160ff1614611dd357505f610960565b5f611ddd85611f96565b90508360c0015161ffff168161ffff1614611dfb575f915050610960565b8551610100165f03611e10575f915050610960565b60408087015160ff165f908152600360209081529082902054855191860151925163de8f50a160e01b81526001600160a01b039091169263de8f50a192611e5c928a9290600401612b04565b602060405180830381865afa158015611e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cbc9190612b3c565b5f80611ea683611f96565b90505b84515160208601511015611f8b5760a085015160c08601515f91611edb91611ed2908290612880565b88519190611d04565b90508161ffff16815f015161ffff1614611ef55750611f7d565b846040015160ff16816020015160ff1614611f105750611f7d565b60408051808201909152606081525f6020820152611f3c85518951611f3591906128ac565b8290611ff7565b50611f47818961205a565b50611f52818661205a565b50611f698260400151825f0151846060015161207f565b15611f7a5760019350505050610960565b50505b611f8685610b65565b611ea9565b505f95945050505050565b5f805f5b8351811015611fe8576001811615611fbe57611fb68482611401565b60ff16611fd0565b6008611fca8583611401565b60ff16901b5b611fde9061ffff16836128ac565b9150600101611f9a565b506106cb601082901c826128ac565b60408051808201909152606081525f60208201526120166020836129e7565b1561203e576120266020836129e7565b612031906020612880565b61203b90836128ac565b91505b506020828101829052604080518085525f815290920101905290565b60408051808201909152606081525f60208201526107e183845f015151848551612126565b60ff83165f908152600460205260408120546001600160a01b03166120a557505f6106cb565b60ff84165f90815260046020819052604091829020549151637bf41d7760e11b81526001600160a01b039092169163f7e83aee916120e79187918791016128e6565b602060405180830381865afa158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109609190612b3c565b60408051808201909152606081525f60208201528251821115612147575f80fd5b602085015161215683866128ac565b111561218957612189856121798760200151878661217491906128ac565b61220c565b6121849060026129d0565b612222565b5f808651805187602083010193508088870111156121a75787860182525b505050602084015b602084106121e757805182526121c66020836128ac565b91506121d36020826128ac565b90506121e0602085612880565b93506121af565b5181515f1960208690036101000a019081169019919091161790525083949350505050565b5f8183111561221c5750816107e4565b50919050565b815161222e8383611ff7565b50610650838261205a565b60408051610140810182525f8082526020820181905291810182905260608082018390526080820183905260a0820183905260c082019290925260e08101829052610100810182905261012081019190915290565b6040518060e00160405280606081526020015f81526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f81526020015f81525090565b803560ff811681146122e3575f80fd5b919050565b6001600160a01b03811681146122fc575f80fd5b50565b5f8060408385031215612310575f80fd5b612319836122d3565b91506020830135612329816122e8565b809150509250929050565b803561ffff811681146122e3575f80fd5b5f8083601f840112612355575f80fd5b50813567ffffffffffffffff81111561236c575f80fd5b602083019150836020828501011115612383575f80fd5b9250929050565b5f805f6040848603121561239c575f80fd5b6123a584612334565b9250602084013567ffffffffffffffff8111156123c0575f80fd5b6123cc86828701612345565b9497909650939450505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612416576124166123d9565b604052919050565b5f82601f83011261242d575f80fd5b813567ffffffffffffffff811115612447576124476123d9565b61245a601f8201601f19166020016123ed565b81815284602083860101111561246e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6040828403121561249a575f80fd5b6040516040810167ffffffffffffffff82821081831117156124be576124be6123d9565b8160405282935084359150808211156124d5575f80fd5b6124e18683870161241e565b835260208501359150808211156124f6575f80fd5b506125038582860161241e565b6020830152505092915050565b5f805f805f60a08688031215612524575f80fd5b61252d86612334565b9450602086013567ffffffffffffffff80821115612549575f80fd5b61255589838a0161241e565b9550604088013591508082111561256a575f80fd5b61257689838a0161248a565b9450606088013591508082111561258b575f80fd5b61259789838a0161248a565b935060808801359150808211156125ac575f80fd5b506125b98882890161241e565b9150509295509295909350565b5f602082840312156125d6575f80fd5b81356107e1816122e8565b5f805f80608085870312156125f4575f80fd5b6125fd85612334565b9350602085013567ffffffffffffffff80821115612619575f80fd5b6126258883890161241e565b9450604087013591508082111561263a575f80fd5b6126468883890161248a565b9350606087013591508082111561265b575f80fd5b506126688782880161241e565b91505092959194509250565b5f805f60408486031215612686575f80fd5b833567ffffffffffffffff8082111561269d575f80fd5b818601915086601f8301126126b0575f80fd5b81356020828211156126c4576126c46123d9565b8160051b6126d38282016123ed565b928352848101820192828101908b8511156126ec575f80fd5b83870192505b8483101561272657823586811115612708575f80fd5b6127168d86838b010161248a565b83525091830191908301906126f2565b985050508701359250508082111561273c575f80fd5b506123cc86828701612345565b5f81518084525f5b8181101561276d57602081850181015186830182015201612751565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6107e16020830184612749565b5f602082840312156127ae575f80fd5b6107e1826122d3565b5f80604083850312156127c8575f80fd5b823567ffffffffffffffff808211156127df575f80fd5b6127eb8683870161248a565b93506020850135915080821115612800575f80fd5b5061280d8582860161241e565b9150509250929050565b818382375f9101908152919050565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061284e57607f821691505b60208210810361221c57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156107e4576107e461286c565b60ff81811683821601908111156107e4576107e461286c565b808201808211156107e4576107e461286c565b600382810b9082900b03637fffffff198112637fffffff821317156107e4576107e461286c565b604081525f6128f86040830185612749565b8281036020840152610a738185612749565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f61ffff808416806129465761294661291e565b92169190910492915050565b60ff82811682821603908111156107e4576107e461286c565b606081525f61297d6060830186612749565b828103602084015261298f8186612749565b91505061ffff83166040830152949350505050565b5f602082840312156129b4575f80fd5b5051919050565b5f816129c9576129c961286c565b505f190190565b80820281158282048414176107e4576107e461286c565b5f826129f5576129f561291e565b500690565b600181815b80851115612a3457815f1904821115612a1a57612a1a61286c565b80851615612a2757918102915b93841c93908002906129ff565b509250929050565b5f82612a4a575060016107e4565b81612a5657505f6107e4565b8160018114612a6c5760028114612a7657612a92565b60019150506107e4565b60ff841115612a8757612a8761286c565b50506001821b6107e4565b5060208310610133831016604e8410600b8410161715612ab5575081810a6107e4565b612abf83836129fa565b805f1904821115612ad257612ad261286c565b029392505050565b5f6107e18383612a3c565b8181035f8312801583831316838312821617156108825761088261286c565b606081525f612b166060830186612749565b8281036020840152612b288186612749565b90508281036040840152611cbc8185612749565b5f60208284031215612b4c575f80fd5b815180151581146107e1575f80fdfe00010203040506070809ffffffffffffff0a0b0c0d0e0f101112131415161718191a1b1c1d1e1fffffffffffffffffffff0a0b0c0d0e0f101112131415161718191a1b1c1d1e1fa164736f6c6343000818000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
