From ae047276879f80bf5614583764410666103687eb Mon Sep 17 00:00:00 2001 From: jatZama Date: Sat, 30 Nov 2024 02:51:48 +0100 Subject: [PATCH] feat: include artefacts precompiled with viaIR --- contracts/.gitignore | 4 +- contracts/.npmignore | 4 +- .../artifacts/contracts/ACL.sol/ACL.dbg.json | 4 + .../artifacts/contracts/ACL.sol/ACL.json | 533 +++++ .../FHEPayment.sol/FHEPayment.dbg.json | 4 + .../contracts/FHEPayment.sol/FHEPayment.json | 1110 +++++++++ .../InputVerifier.dbg.json | 4 + .../InputVerifier.json | 483 ++++ .../InputVerifier.dbg.json | 4 + .../InputVerifier.json | 368 +++ .../KMSVerifier.sol/KMSVerifier.dbg.json | 4 + .../KMSVerifier.sol/KMSVerifier.json | 575 +++++ .../TFHEExecutor.sol/IInputVerifier.dbg.json | 4 + .../TFHEExecutor.sol/IInputVerifier.json | 57 + .../TFHEExecutor.sol/TFHEExecutor.dbg.json | 4 + .../TFHEExecutor.sol/TFHEExecutor.json | 1189 ++++++++++ .../TFHEExecutorWithEvents.dbg.json | 4 + .../TFHEExecutorWithEvents.json | 2096 +++++++++++++++++ .../GatewayCaller.sol/GatewayCaller.dbg.json | 4 + .../GatewayCaller.sol/GatewayCaller.json | 10 + .../GatewayContract.dbg.json | 4 + .../GatewayContract.sol/GatewayContract.json | 567 +++++ .../IKMSVerifier.sol/IKMSVerifier.dbg.json | 4 + .../IKMSVerifier.sol/IKMSVerifier.json | 45 + .../gateway/lib/Gateway.sol/Gateway.dbg.json | 4 + .../gateway/lib/Gateway.sol/Gateway.json | 10 + .../lib/Gateway.sol/IGatewayContract.dbg.json | 4 + .../lib/Gateway.sol/IGatewayContract.json | 50 + 28 files changed, 7151 insertions(+), 2 deletions(-) create mode 100644 contracts/artifacts/contracts/ACL.sol/ACL.dbg.json create mode 100644 contracts/artifacts/contracts/ACL.sol/ACL.json create mode 100644 contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.dbg.json create mode 100644 contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.json create mode 100644 contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.dbg.json create mode 100644 contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.json create mode 100644 contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.dbg.json create mode 100644 contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.json create mode 100644 contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.dbg.json create mode 100644 contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.json create mode 100644 contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.dbg.json create mode 100644 contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.json create mode 100644 contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.dbg.json create mode 100644 contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.json create mode 100644 contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.dbg.json create mode 100644 contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.json create mode 100644 contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.dbg.json create mode 100644 contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.json create mode 100644 contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.dbg.json create mode 100644 contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.json create mode 100644 contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.dbg.json create mode 100644 contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.json create mode 100644 contracts/artifacts/gateway/lib/Gateway.sol/Gateway.dbg.json create mode 100644 contracts/artifacts/gateway/lib/Gateway.sol/Gateway.json create mode 100644 contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.dbg.json create mode 100644 contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.json diff --git a/contracts/.gitignore b/contracts/.gitignore index a5e4c0ee..f974e4c3 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -3,7 +3,9 @@ node_modules # Hardhat files /cache -/artifacts +/artifacts/* +!/artifacts/contracts/ +!/artifacts/gateway/ /types # TypeChain files diff --git a/contracts/.npmignore b/contracts/.npmignore index 5fc3156b..e450c9fa 100644 --- a/contracts/.npmignore +++ b/contracts/.npmignore @@ -3,4 +3,6 @@ !contracts/** !gateway/** !package.json -!LICENSE \ No newline at end of file +!LICENSE +!artifacts/contracts/** +!artifacts/gateway/** \ No newline at end of file diff --git a/contracts/artifacts/contracts/ACL.sol/ACL.dbg.json b/contracts/artifacts/contracts/ACL.sol/ACL.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/ACL.sol/ACL.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/ACL.sol/ACL.json b/contracts/artifacts/contracts/ACL.sol/ACL.json new file mode 100644 index 00000000..f563ffa3 --- /dev/null +++ b/contracts/artifacts/contracts/ACL.sol/ACL.json @@ -0,0 +1,533 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ACL", + "sourceName": "contracts/ACL.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": false, + "internalType": "uint256[]", + "name": "handlesList", + "type": "uint256[]" + } + ], + "name": "AllowedForDecryption", + "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": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "NewDelegation", + "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": "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": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "allow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "handlesList", + "type": "uint256[]" + } + ], + "name": "allowForDecryption", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "allowTransient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "allowedOnBehalf", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "allowedTransient", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "cleanTransientStorage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "name": "delegateAccountForContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getTFHEExecutorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + } + ], + "name": "isAllowedForDecryption", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "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": [ + { + "internalType": "uint256", + "name": "handle", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "persistAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "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": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161138090816100d18239608051818181610b090152610bde0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040818152600480361015610014575f80fd5b5f3560e01c9283630d8e6e2c14610e525750826335334c2314610e1d57826337e6b44f14610db95782634f1ef28614610b6557826352d1902d14610aee578263557e10041461097c5782635faa299a146109565782636330a7091461090b57826365d0509c1461089b578263715018a6146107fb57826379ba5097146107995782637a9a598e1461076a5782638d9c9c92146106c85782638da5cb5b14610682578263a90cd91d14610654578263ad3cb1cc146105fc578263b198d65714610460578263c4d66de81461030b57508163ccd9a7cd146101f7578163e30c3978146101b2575063f2fde38b14610107575f80fd5b346101ae5760203660031901126101ae5761012061108f565b6101286111f6565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b346101ae575f3660031901126101ae576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b346101ae5760803660031901126101ae5761021061108f565b90602435906044356001600160a01b03938482168092036101ae5760643594808616958681036101ae57855f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602097818952865f20905f52885260ff865f20541696876102ec575b50508561028e575b50505050519015158152f35b6102cd9192939495506001600160a01b03165f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260405f2090565b91165f528352815f20905f52825260ff815f2054169083808080610282565b909196505f528652835f20835f52865260ff845f20541694878061027a565b346101ae5760203660031901126101ae5761032461108f565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081610458575b600114908161044e575b159081610445575b506104365767ffffffffffffffff198116600117855583610417575b5061039d6112cf565b6103a56112cf565b6001600160a01b0382161561040157506103be90611241565b6103c457005b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6024905f865191631e4fbdf760e01b8352820152fd5b68ffffffffffffffffff19166801000000000000000117845585610394565b50845163f92ee8a960e01b8152fd5b90501587610378565b303b159150610370565b859150610366565b90346101ae57806003193601126101ae5761047961108f565b90610482611079565b926001600160a01b038094169333851461059357335f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260409020931692835f52602052815f20845f5260205260ff825f2054166105515750335f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260409020825f52602052805f20835f526020525f20600160ff19825416179055337ff03b7c0d4879b0bcbbf440794871f139c96fd13a145a8172b33b9cab5fa2830a5f80a4005b6020606492519162461bcd60e51b8352820152601160248201527f616c72656164792064656c6567617465640000000000000000000000000000006044820152fd5b506020608492519162461bcd60e51b8352820152603360248201527f636f6e7472616374416464726573732073686f756c642062652064696666657260448201527f656e742066726f6d206d73672e73656e646572000000000000000000000000006064820152fd5b50346101ae575f3660031901126101ae5780516106509161061c826110a5565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152519182918261104d565b0390f35b50346101ae575f3660031901126101ae5760209051737b22221e4c113e27aa8c07db973465390871f2838152f35b50346101ae575f3660031901126101ae576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b346101ae57816003193601126101ae576107406107329135926106e9611079565b90737b22221e4c113e27aa8c07db973465390871f2833303610753575b516020810194855260609190911b6bffffffffffffffffffffffff191660408201529182906054820190565b03601f1981018352826110d5565b5190206001815d60015f5c0190815d5f5d005b610765610760338761115f565b611113565b610706565b90346101ae57806003193601126101ae57610790602092610789611079565b90356111bd565b90519015158152f35b346101ae575f3660031901126101ae57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036107e5576107e333611241565b005b602491519063118cdaa760e01b82523390820152fd5b346101ae575f3660031901126101ae576108136111f6565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101ae57816003193601126101ae57356108b4611079565b906108c2610760338361115f565b5f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc006020526001600160a01b03825f2091165f526020525f20600160ff198254161790555f80f35b90346101ae5760203660031901126101ae57602091355f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc01825260ff815f20541690519015158152f35b90346101ae57806003193601126101ae57610790602092610975611079565b903561115f565b90346101ae57602091826003193601126101ae5780359267ffffffffffffffff918285116101ae57366023860112156101ae5784810135926024908411610adb576005908460051b968651956109d4868a01886110d5565b865284860160248199830101913683116101ae576024879101915b838310610acb57505050508451925f5b848110610a605787518681528751818801819052818a0191908b90895f5b828110610a4c577f2fd616621b8415a2efb27b224024340ac767797553ce6fdf4c1adefd160504c685870386a1005b835186529481019492810192600101610a1d565b8651811015610ab9578086600192861b89010151610a81610760338361115f565b5f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc018752885f208260ff19825416179055016109ff565b50603290634e487b7160e01b5f52525ffd5b82358152918101918791016109ef565b604182634e487b7160e01b5f525260245ffd5b90346101ae575f3660031901126101ae576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b5857602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b816003193601126101ae57610b7861108f565b602492833567ffffffffffffffff81116101ae57366023820112156101ae5780840135610ba4816110f7565b93610bb1845195866110d5565b81855260209182860193368983830101116101ae57815f928a8693018737870101526001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115610d8b575b50610d7b57610c166111f6565b81169484516352d1902d60e01b8152838189818a5afa5f9181610d4c575b50610c4f5750505050505191634c9c8ce360e01b8352820152fd5b9087878794938b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91828103610d375750853b15610d235750816001600160a01b03198254161790558451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115610d095750505f6107e39581925190845af4913d15610cff573d610cf1610ce8826110f7565b925192836110d5565b81525f81943d92013e611310565b5060609250611310565b9450945050505034610d1757005b63b398979f60e01b8152fd5b8651634c9c8ce360e01b8152808501849052fd5b8751632a87526960e21b815280860191909152fd5b9091508481813d8311610d74575b610d6481836110d5565b810103126101ae5751908a610c34565b503d610d5a565b845163703e46dd60e11b81528790fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141589610c09565b90346101ae57806003193601126101ae57602091610dd5611079565b90355f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0083526001600160a01b03825f2091165f52825260ff815f20541690519015158152f35b346101ae575f3660031901126101ae575f5c5f805d600180910160015b818110610e4357005b805f84925c81835d5d01610e3a565b9250346101ae575f3660031901126101ae57610e6d836110a5565b6003835260209283810193621050d360ea1b85525f90845191610e8f836110a5565b600190818452828401908336833760218501835b610fef575b50508190875193610eb8856110a5565b838552808501928136853760218601855b610fb2575b50505f95895194610ede866110a5565b8086528286019783368a3760218701825b610f7c575b50505089519a8b98519081848b01610f0b9261102c565b880191820161103b60f11b905251918260228301610f289261102c565b01601760f91b9384602283015251918260238301610f459261102c565b0191602383015251918260248301610f5c9261102c565b01039081018352602401610f7090836110d5565b5161065081928261104d565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215610fad57919082610eef565b610ef4565b9496945f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490878215610fe6579597610ec9565b50969496610ece565b9294925f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490858215611023579395610ea3565b50949294610ea8565b5f5b83811061103d5750505f910152565b818101518382015260200161102e565b6040916020825261106d815180928160208601526020868601910161102c565b601f01601f1916010190565b602435906001600160a01b03821682036101ae57565b600435906001600160a01b03821682036101ae57565b6040810190811067ffffffffffffffff8211176110c157604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176110c157604052565b67ffffffffffffffff81116110c157601f01601f191660200190565b1561111a57565b60405162461bcd60e51b815260206004820152601460248201527f73656e6465722069736e277420616c6c6f7765640000000000000000000000006044820152606490fd5b9061116a81836111bd565b91821561117657505090565b9091505f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc006020526001600160a01b0360405f2091165f5260205260ff60405f20541690565b604080516020810192835260609390931b6bffffffffffffffffffffffff191690830152906111ef8160548101610732565b5190205c90565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361122957565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156112fe57565b604051631afcd79f60e31b8152600490fd5b90611337575080511561132557805190602001fd5b60405163d6bda27560e01b8152600490fd5b8151158061136a575b611348575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561134056fea164736f6c6343000818000a", + "deployedBytecode": "0x60806040818152600480361015610014575f80fd5b5f3560e01c9283630d8e6e2c14610e525750826335334c2314610e1d57826337e6b44f14610db95782634f1ef28614610b6557826352d1902d14610aee578263557e10041461097c5782635faa299a146109565782636330a7091461090b57826365d0509c1461089b578263715018a6146107fb57826379ba5097146107995782637a9a598e1461076a5782638d9c9c92146106c85782638da5cb5b14610682578263a90cd91d14610654578263ad3cb1cc146105fc578263b198d65714610460578263c4d66de81461030b57508163ccd9a7cd146101f7578163e30c3978146101b2575063f2fde38b14610107575f80fd5b346101ae5760203660031901126101ae5761012061108f565b6101286111f6565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b346101ae575f3660031901126101ae576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b346101ae5760803660031901126101ae5761021061108f565b90602435906044356001600160a01b03938482168092036101ae5760643594808616958681036101ae57855f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc00602097818952865f20905f52885260ff865f20541696876102ec575b50508561028e575b50505050519015158152f35b6102cd9192939495506001600160a01b03165f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260405f2090565b91165f528352815f20905f52825260ff815f2054169083808080610282565b909196505f528652835f20835f52865260ff845f20541694878061027a565b346101ae5760203660031901126101ae5761032461108f565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081610458575b600114908161044e575b159081610445575b506104365767ffffffffffffffff198116600117855583610417575b5061039d6112cf565b6103a56112cf565b6001600160a01b0382161561040157506103be90611241565b6103c457005b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6024905f865191631e4fbdf760e01b8352820152fd5b68ffffffffffffffffff19166801000000000000000117845585610394565b50845163f92ee8a960e01b8152fd5b90501587610378565b303b159150610370565b859150610366565b90346101ae57806003193601126101ae5761047961108f565b90610482611079565b926001600160a01b038094169333851461059357335f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260409020931692835f52602052815f20845f5260205260ff825f2054166105515750335f9081527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0260205260409020825f52602052805f20835f526020525f20600160ff19825416179055337ff03b7c0d4879b0bcbbf440794871f139c96fd13a145a8172b33b9cab5fa2830a5f80a4005b6020606492519162461bcd60e51b8352820152601160248201527f616c72656164792064656c6567617465640000000000000000000000000000006044820152fd5b506020608492519162461bcd60e51b8352820152603360248201527f636f6e7472616374416464726573732073686f756c642062652064696666657260448201527f656e742066726f6d206d73672e73656e646572000000000000000000000000006064820152fd5b50346101ae575f3660031901126101ae5780516106509161061c826110a5565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152519182918261104d565b0390f35b50346101ae575f3660031901126101ae5760209051737b22221e4c113e27aa8c07db973465390871f2838152f35b50346101ae575f3660031901126101ae576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b346101ae57816003193601126101ae576107406107329135926106e9611079565b90737b22221e4c113e27aa8c07db973465390871f2833303610753575b516020810194855260609190911b6bffffffffffffffffffffffff191660408201529182906054820190565b03601f1981018352826110d5565b5190206001815d60015f5c0190815d5f5d005b610765610760338761115f565b611113565b610706565b90346101ae57806003193601126101ae57610790602092610789611079565b90356111bd565b90519015158152f35b346101ae575f3660031901126101ae57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036107e5576107e333611241565b005b602491519063118cdaa760e01b82523390820152fd5b346101ae575f3660031901126101ae576108136111f6565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101ae57816003193601126101ae57356108b4611079565b906108c2610760338361115f565b5f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc006020526001600160a01b03825f2091165f526020525f20600160ff198254161790555f80f35b90346101ae5760203660031901126101ae57602091355f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc01825260ff815f20541690519015158152f35b90346101ae57806003193601126101ae57610790602092610975611079565b903561115f565b90346101ae57602091826003193601126101ae5780359267ffffffffffffffff918285116101ae57366023860112156101ae5784810135926024908411610adb576005908460051b968651956109d4868a01886110d5565b865284860160248199830101913683116101ae576024879101915b838310610acb57505050508451925f5b848110610a605787518681528751818801819052818a0191908b90895f5b828110610a4c577f2fd616621b8415a2efb27b224024340ac767797553ce6fdf4c1adefd160504c685870386a1005b835186529481019492810192600101610a1d565b8651811015610ab9578086600192861b89010151610a81610760338361115f565b5f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc018752885f208260ff19825416179055016109ff565b50603290634e487b7160e01b5f52525ffd5b82358152918101918791016109ef565b604182634e487b7160e01b5f525260245ffd5b90346101ae575f3660031901126101ae576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610b5857602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b816003193601126101ae57610b7861108f565b602492833567ffffffffffffffff81116101ae57366023820112156101ae5780840135610ba4816110f7565b93610bb1845195866110d5565b81855260209182860193368983830101116101ae57815f928a8693018737870101526001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115610d8b575b50610d7b57610c166111f6565b81169484516352d1902d60e01b8152838189818a5afa5f9181610d4c575b50610c4f5750505050505191634c9c8ce360e01b8352820152fd5b9087878794938b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91828103610d375750853b15610d235750816001600160a01b03198254161790558451907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115610d095750505f6107e39581925190845af4913d15610cff573d610cf1610ce8826110f7565b925192836110d5565b81525f81943d92013e611310565b5060609250611310565b9450945050505034610d1757005b63b398979f60e01b8152fd5b8651634c9c8ce360e01b8152808501849052fd5b8751632a87526960e21b815280860191909152fd5b9091508481813d8311610d74575b610d6481836110d5565b810103126101ae5751908a610c34565b503d610d5a565b845163703e46dd60e11b81528790fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141589610c09565b90346101ae57806003193601126101ae57602091610dd5611079565b90355f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc0083526001600160a01b03825f2091165f52825260ff815f20541690519015158152f35b346101ae575f3660031901126101ae575f5c5f805d600180910160015b818110610e4357005b805f84925c81835d5d01610e3a565b9250346101ae575f3660031901126101ae57610e6d836110a5565b6003835260209283810193621050d360ea1b85525f90845191610e8f836110a5565b600190818452828401908336833760218501835b610fef575b50508190875193610eb8856110a5565b838552808501928136853760218601855b610fb2575b50505f95895194610ede866110a5565b8086528286019783368a3760218701825b610f7c575b50505089519a8b98519081848b01610f0b9261102c565b880191820161103b60f11b905251918260228301610f289261102c565b01601760f91b9384602283015251918260238301610f459261102c565b0191602383015251918260248301610f5c9261102c565b01039081018352602401610f7090836110d5565b5161065081928261104d565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215610fad57919082610eef565b610ef4565b9496945f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490878215610fe6579597610ec9565b50969496610ece565b9294925f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490858215611023579395610ea3565b50949294610ea8565b5f5b83811061103d5750505f910152565b818101518382015260200161102e565b6040916020825261106d815180928160208601526020868601910161102c565b601f01601f1916010190565b602435906001600160a01b03821682036101ae57565b600435906001600160a01b03821682036101ae57565b6040810190811067ffffffffffffffff8211176110c157604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176110c157604052565b67ffffffffffffffff81116110c157601f01601f191660200190565b1561111a57565b60405162461bcd60e51b815260206004820152601460248201527f73656e6465722069736e277420616c6c6f7765640000000000000000000000006044820152606490fd5b9061116a81836111bd565b91821561117657505090565b9091505f527fa688f31953c2015baaf8c0a488ee1ee22eb0e05273cc1fd31ea4cbee42febc006020526001600160a01b0360405f2091165f5260205260ff60405f20541690565b604080516020810192835260609390931b6bffffffffffffffffffffffff191690830152906111ef8160548101610732565b5190205c90565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361122957565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156112fe57565b604051631afcd79f60e31b8152600490fd5b90611337575080511561132557805190602001fd5b60405163d6bda27560e01b8152600490fd5b8151158061136a575b611348575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561134056fea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.dbg.json b/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.json b/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.json new file mode 100644 index 00000000..58720453 --- /dev/null +++ b/contracts/artifacts/contracts/FHEPayment.sol/FHEPayment.json @@ -0,0 +1,1110 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "FHEPayment", + "sourceName": "contracts/FHEPayment.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccountNotEnoughFunded", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "AllContractsNotAuthorized", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyAuthorizedAllContracts", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyWhitelistedContract", + "type": "error" + }, + { + "inputs": [], + "name": "CallerMustBeTFHEExecutorContract", + "type": "error" + }, + { + "inputs": [], + "name": "ContractNotWhitelisted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "ERC1967InvalidImplementation", + "type": "error" + }, + { + "inputs": [], + "name": "ERC1967NonPayable", + "type": "error" + }, + { + "inputs": [], + "name": "FHEGasBlockLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "FailedCall", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyScalarOperationsAreSupported", + "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": "RecoveryFailed", + "type": "error" + }, + { + "inputs": [], + "name": "UUPSUnauthorizedCallContext", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "slot", + "type": "bytes32" + } + ], + "name": "UUPSUnsupportedProxiableUUID", + "type": "error" + }, + { + "inputs": [], + "name": "UnsupportedOperation", + "type": "error" + }, + { + "inputs": [], + "name": "WithdrawalFailed", + "type": "error" + }, + { + "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": "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": [], + "name": "authorizeAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "becomeTransientSpender", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "depositETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "didAuthorizeAllContracts", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "dappContract", + "type": "address" + } + ], + "name": "didWhitelistContract", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getAvailableDepositsETH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getClaimableUsedFHEGas", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTFHEExecutorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForCast", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheAdd", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheBitAnd", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheBitOr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheBitXor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheDiv", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheEq", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheGe", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheGt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheLe", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheLt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheMax", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheMin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheMul", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheNe", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForFheNeg", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForFheNot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForFheRand", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForFheRandBounded", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheRem", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheRotl", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheRotr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheShl", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheShr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "payForFheSub", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForIfThenElse", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "internalType": "uint8", + "name": "resultType", + "type": "uint8" + } + ], + "name": "payForTrivialEncrypt", + "outputs": [], + "stateMutability": "nonpayable", + "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": "receiver", + "type": "address" + } + ], + "name": "recoverBurntFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "removeAuthorizationAllContracts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dappContract", + "type": "address" + } + ], + "name": "removeWhitelistedContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stopBeingTransientSpender", + "outputs": [], + "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" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dappContract", + "type": "address" + } + ], + "name": "whitelistContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "withdrawETH", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a08060405234620000d157306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000c257506001600160401b036002600160401b0319828216016200007c575b6040516144369081620000d6823960805181818161184a01526119210152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80806200005c565b63f92ee8a960e01b8152600490fd5b5f80fdfe604060808152600480361015610013575f80fd5b5f3560e01c90816303eaf064146107375781630832968e146129285781630b332f44146127b95781630d8e6e2c1461266a5781630ff24ee2146125a9578163100747ad1461220857816313f3d32914610fa15781631761d370146121a55781631ade267d14610ffe5781631db04264146121395781631f6f6aec14610fa1578163262794d8146120fc57816327af38ad146116dd5781632be8dd7914611c3c5781632d2da80614611c1457816336118b5214611b975781633a0e6d4314611ad4578163466ac06514610737578163473dceed14610ab15781634f1ef286146118a657816352d1902d1461182f578163577244bd146117e4578163715018a61461174457816372d0e43214610fa15781637300c0fa14610ab157816379ba5097146116e25781637da7e620146116dd5781638638282b146107375781638da5cb5b1461169757816399841ed7146107325781639bf55921146115c55781639d538628146115b05781639f6a0ed8146112b7578163a90cd91d14611289578163aa29aeec14611274578163aa43b7f914611003578163ad23361014610ffe578163ad3cb1cc14610fa6578163b25fd54714610fa1578163bdb4401014610f07578163bfc1f6d814610c0d578163c4d66de814610ab6578163cd2bd00314610ab1578163cea14930146109ce578163d5f0797d1461073c578163d692278314610737578163e138131e14610732578163e30c3978146106ec578163f2fde38b14610645578163f7eaec63146102cd575063fee497551461024e575f80fd5b346102c957806003193601126102c9576020906102696129bf565b6001600160a01b036102b361027c6129d5565b926001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b91165f52825260ff815f20541690519015158152f35b5f80fd5b82346102c9576102dc366129fb565b737b22221e4c113e27aa8c07db973465390871f283939293330361063557610302613493565b6001600160f81b031990811601610625576001919060ff168281036103cc5750503a1517156103b95761037a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b54916001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162021ef883018093116103a65750555b6103a46141dd565b005b601190634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b6002810361042f5750503a1517156103b957610408610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203a1b083018093116103a65750555b61039c565b600381036104915750503a1517156103b95761046b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916204ca9083018093116103a657505561039c565b8085036104f25750503a1517156103b9576104cc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620612b083018093116103a657505561039c565b600581036105545750503a1517156103b95761052e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916208e94083018093116103a657505561039c565b600681036105b65750503a1517156103b957610590610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620d13a883018093116103a657505561039c565b60080361061657503a1517156103b9576105f0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916213321083018093116103a657505561039c565b51639ba6061b60e01b81528390fd5b8151636aa9eb0560e01b81528490fd5b82516378d178a160e01b81528590fd5b346102c95760203660031901126102c95761065e6129bf565b61066661426c565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b82346102c9575f3660031901126102c9576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b61333b565b612a40565b82346102c957806003193601126102c9576107556129bf565b9061075e6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90610784613493565b16806107e857505060013a1517156103b9576107c0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161a7f883018093116103a65750556103a46141dd565b6001810361084b57505060013a1517156103b957610826610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161afc883018093116103a657505561039c565b6002810361085f57505061042a9150613980565b6003810361087357505061042a9150613980565b8084036108d557505060013a1517156103b9576108b0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161c35083018093116103a657505561039c565b600581036108e957505061042a915061392b565b600681036108fd57505061042a91506138d5565b6007810361096157505060013a1517156103b95761093b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201388083018093116103a657505561039c565b6008810361097557505061042a915061387f565b6009810361098957505061042a915061367e565b600a810361099d57505061042a915061352a565b600b036109af575061042a91506134d4565b51639ba6061b60e01b81529050fd5b81516378d178a160e01b81528490fd5b82346102c957806003193601126102c9576109e76129bf565b906109f06129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90610a16613493565b1680610a2857505061039c91506135d6565b60018103610a3c57505061042a91506135d6565b60028103610a5057505061042a91506135d6565b60038103610a6457505061042a91506135d6565b808403610a7757505061042a91506135d6565b60058103610a8b57505061042a91506135d6565b60068103610a9f57505061042a91506135d6565b6008036109af575061042a91506135d6565b613232565b9050346102c95760203660031901126102c957610ad16129bf565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081610c05575b6001149081610bfb575b159081610bf2575b50610be35767ffffffffffffffff198116600117855583610bc4575b50610b4a614345565b610b52614345565b6001600160a01b03821615610bae5750610b6b906142b7565b610b7157005b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6024905f865191631e4fbdf760e01b8352820152fd5b68ffffffffffffffffff1916680100000000000000011784555f610b41565b50845163f92ee8a960e01b8152fd5b9050155f610b25565b303b159150610b1d565b859150610b13565b82346102c957610c1c366129fb565b737b22221e4c113e27aa8c07db973465390871f283939293330361063557610c42613493565b6001600160f81b031990811601610625576001919060ff16828103610cbe5750503a1517156103b957610c95610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162045d3083018093116103a65750556103a46141dd565b60028103610d205750503a1517156103b957610cfa610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620704e083018093116103a657505561039c565b60038103610d825750503a1517156103b957610d5c610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162097db083018093116103a657505561039c565b808503610de35750503a1517156103b957610dbd610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620c488883018093116103a657505561039c565b60058103610e455750503a1517156103b957610e1f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916210b55883018093116103a657505561039c565b60068103610ea75750503a1517156103b957610e81610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916216df7883018093116103a657505561039c565b60080361061657503a1517156103b957610ee1610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621f4fa083018093116103a657505561039c565b82346102c9575f3660031901126102c95760ff610f54336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b5416610f9457335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260409020805460ff19166001179055005b51635f2223a360e11b8152fd5b612b86565b82346102c9575f3660031901126102c9578051610ffa91610fc6826132cd565b600582527f352e302e3000000000000000000000000000000000000000000000000000000060208301525191829182612b5a565b0390f35b612e30565b82346102c957806003193601126102c95761101c6129bf565b906110256129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff9061104b613493565b16806110af57505060013a1517156103b957611087610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161753083018093116103a65750556103a46141dd565b6001810361111257505060013a1517156103b9576110ed610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916180e883018093116103a657505561039c565b6002810361112657505061042a915061382a565b6003810361113a57505061042a91506137d5565b80840361119c57505060013a1517156103b957611177610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491618ca083018093116103a657505561039c565b600581036111ff57505060013a1517156103b9576111da610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161908883018093116103a657505561039c565b6006810361121357505061042a9150613780565b6008036109af575060013a1517156103b95761124f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161985883018093116103a657505561039c565b346102c9575f3660031901126102c9575f805d005b82346102c9575f3660031901126102c95760209051737b22221e4c113e27aa8c07db973465390871f2838152f35b82346102c957806003193601126102c9576112d06129bf565b906112d96129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff906112ff613493565b60019291168281036113675750503a1517156103b95761133f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161ea6083018093116103a65750556103a46141dd565b600281036113c95750503a1517156103b9576113a3610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201731883018093116103a657505561039c565b6003810361142b5750503a1517156103b957611405610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201ffb883018093116103a657505561039c565b80850361148c5750503a1517156103b957611466610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916202710083018093116103a657505561039c565b600581036114ee5750503a1517156103b9576114c8610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203095883018093116103a657505561039c565b600681036115505750503a1517156103b95761152a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203c8c083018093116103a657505561039c565b60080361061657503a1517156103b95761158a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916204b70883018093116103a657505561039c565b346102c9575f3660031901126102c957335f5d005b82346102c957806003193601126102c9576115de6129bf565b906115e76129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff9061160d613493565b166001810361162257505061039c9150613580565b6002810361163657505061042a9150613580565b6003810361164a57505061042a9150613580565b80840361165d57505061042a9150613580565b6005810361167157505061042a9150613580565b6006810361168557505061042a9150613580565b6008036109af575061042a9150613580565b82346102c9575f3660031901126102c9576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b61315d565b9050346102c9575f3660031901126102c957336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361172e576103a4336142b7565b602491519063118cdaa760e01b82523390820152fd5b346102c9575f3660031901126102c95761175c61426c565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b82346102c95760203660031901126102c9576020906118276118046129bf565b6001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b549051908152f35b82346102c9575f3660031901126102c9576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361189957602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b9050816003193601126102c9576118bb6129bf565b602492833567ffffffffffffffff81116102c957366023820112156102c95780840135926118e88461331f565b6118f4845191826132fd565b84815260209485820193368983830101116102c957815f928a8993018737830101526001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115611aa6575b50611a965761195961426c565b84516352d1902d60e01b815290831695808289818a5afa9182915f93611a66575b505061199557505050505191634c9c8ce360e01b8352820152fd5b858588928a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91828103611a515750863b15611a3d5750826001600160a01b031982541617905551907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115611a255750505f6103a49381925190845af4611a1f613464565b91614386565b925092505034611a3157005b63b398979f60e01b8152fd5b9450505191634c9c8ce360e01b8352820152fd5b8351632a87526960e21b815280870191909152fd5b9080929350813d8311611a8f575b611a7e81836132fd565b810103126102c95751905f8061197a565b503d611a74565b845163703e46dd60e11b81528790fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f61194c565b9050346102c95760203660031901126102c957611aef6129bf565b906001600160a01b03611b32336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b921691825f5260205260ff835f205416611b895750335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e05602052604090205f91825260205220805460ff19166001179055005b8251639ad3410b60e01b8152fd5b82346102c957806003193601126102c9578135611bb26129d5565b335f9081525f8051602061440a83398151915260205260409020805490838203918211611c01575f93849384938493555af1611bec613464565b5015611bf457005b516327fcd9d160e01b8152fd5b601186634e487b7160e01b5f525260245ffd5b60203660031901126102c957611c2b6118046129bf565b8054913483018093116103a6575055005b82346102c957611c4b366129fb565b737b22221e4c113e27aa8c07db973465390871f2839392933303610635579060ff91611c75613493565b60f883901b16600160f81b03611e9a576001929116828103611c9e5750505061039c915061372a565b60028103611d005750503a1517156103b957611cda610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162026d1883018093116103a657505561039c565b60038103611d625750503a1517156103b957611d3c610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162032c8083018093116103a657505561039c565b808503611d765750505061042a91506136d4565b60058103611dd85750503a1517156103b957611db2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162056ea083018093116103a657505561039c565b60068103611e3a5750503a1517156103b957611e14610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916207530083018093116103a657505561039c565b60080361061657503a1517156103b957611e74610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916209df5883018093116103a657505561039c565b6001929116828103611eb35750505061042a915061367e565b60028103611f155750503a1517156103b957611eef610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203018883018093116103a657505561039c565b60038103611f775750503a1517156103b957611f51610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203ff7083018093116103a657505561039c565b808503611fd85750503a1517156103b957611fb2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162057a5883018093116103a657505561039c565b6005810361203a5750503a1517156103b957612014610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916209c7e883018093116103a657505561039c565b6006810361209c5750503a1517156103b957612076610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621178a883018093116103a657505561039c565b60080361061657503a1517156103b9576120d6610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621f344883018093116103a657505561039c565b82346102c9575f3660031901126102c9576020907f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e02549051908152f35b82346102c95760203660031901126102c9575f8080806121576129bf565b61215f61426c565b7f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e029082825492555af1612190613464565b501561219857005b5163a4b6690960e01b8152fd5b82346102c95760203660031901126102c95760209060ff6121fd6121c76129bf565b6001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b541690519015158152f35b82346102c957806003193601126102c9576122216129bf565b9061222a6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90612250613493565b16908161226357505061039c915061362a565b60019180830361227a5750505061042a915061362a565b6002810361228f5750505061042a915061362a565b600381036122a45750505061042a91506135d6565b8085036123045750503a1517156103b9576122df610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161012c83018093116103a657505561039c565b600581036123655750503a1517156103b957612340610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161025883018093116103a657505561039c565b600681036123c65750503a1517156103b9576123a1610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161028a83018093116103a657505561039c565b600781036124275750503a1517156103b957612402610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916102bc83018093116103a657505561039c565b600881036124885750503a1517156103b957612463610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161032083018093116103a657505561039c565b600981036124e95750503a1517156103b9576124c4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161064083018093116103a657505561039c565b600a810361254a5750503a1517156103b957612525610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491610c8083018093116103a657505561039c565b600b0361061657503a1517156103b957612584610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161190083018093116103a657505561039c565b9050346102c95760203660031901126102c9576125c46129bf565b906001600160a01b03612607336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b921691825f5260205260ff835f2054161561265c5750335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e05602052604090205f91825260205220805460ff19169055005b8251632ff3629f60e21b8152fd5b82346102c9575f3660031901126102c957805191612687836132cd565b600a92600a81526020808201907f4648455061796d656e740000000000000000000000000000000000000000000082526126bf61420a565b85519660019190826126d08a6132cd565b60018a52848a01938536863760218b01825b612784575b5050610ffa61271a8a61277a60248c8f8c8e9161276c8e8e8e61270861420a565b958b519c8d98518092868b0190612b39565b870161103b60f11b848201526127398251809386602285019101612b39565b01612756601760f91b958660228401525180936023840190612b39565b0192602384015283519384918885019101612b39565b0103908101855201836132fd565b5191829182612b5a565b5f19019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156127b4579190826126e2565b6126e7565b82346102c957806003193601126102c9576127d26129bf565b906127db6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90612801613493565b168061281357505061039c9150613580565b6001810361282757505061042a9150613580565b6002810361283b57505061042a9150613580565b6003810361284f57505061042a9150613580565b80840361286257505061042a9150613580565b6005810361287657505061042a9150613580565b6006810361288a57505061042a9150613580565b6008810361289e57505061042a9150613580565b600981036128b257505061042a915061352a565b600a81036128c657505061042a91506134d4565b600b036109af575060013a1517156103b957612902610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162061a8083018093116103a657505561039c565b82346102c9575f3660031901126102c95760ff612975336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b5416156129b357335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260409020805460ff19169055005b51621c262560e81b8152fd5b600435906001600160a01b03821682036102c957565b602435906001600160a01b03821682036102c957565b6024359060ff821682036102c957565b60609060031901126102c9576004356001600160a01b03811681036102c9579060243560ff811681036102c957906044356001600160f81b0319811681036102c95790565b346102c957612a4e366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612a75613493565b60f883901b16600160f81b03612b14571660018103612a98575061039c906138d5565b60028103612aaa575061042a90613b83565b60038103612abc575061042a90613b2d565b60048103612ace575061042a90613ad7565b60058103612ae0575061042a90613a81565b60068103612af2575061042a90613a2b565b600803612b025761042a906139d5565b604051639ba6061b60e01b8152600490fd5b1660018103612a98575061042a906138d5565b6040516378d178a160e01b8152600490fd5b5f5b838110612b4a5750505f910152565b8181015183820152602001612b3b565b60409160208252612b7a8151809281602086015260208686019101612b39565b601f01601f1916010190565b346102c957612b94366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612bbb613493565b60f883901b16600160f81b03612c48571660018103612bde575061039c906137d5565b60028103612bf0575061042a906137d5565b60038103612c02575061042a906137d5565b60048103612c14575061042a906137d5565b60058103612c26575061042a90613780565b60068103612c38575061042a90613d30565b600803612b025761042a90613cdb565b1660018103612cbf575060013a151715612cab57612c86610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201c5208201809211612cab575561039c565b634e487b7160e01b5f52601160045260245ffd5b9060028203612cd25761042a9150613c85565b60038203612ce45761042a9150613c2f565b600491808303612cf9575061042a9150613bd9565b60058103612d5c575060013a1517156103b957612d36610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620376b883018093116103a657505561039c565b60068103612dbf575060013a1517156103b957612d99610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162044d9083018093116103a657505561039c565b600803612e205760013a1517156103b957612dfa610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916205573083018093116103a657505561039c565b50604051639ba6061b60e01b8152fd5b346102c957612e3e366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612e65613493565b60f883901b16600160f81b03612fe957169060018203612e895761039c9150613d85565b60028203612e9b5761042a9150613ad7565b60038203612ead5761042a915061367e565b600491808303612f12575060013a1517156103b957612eec610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620280a083018093116103a657505561039c565b60058103612f75575060013a1517156103b957612f4f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916202ee0083018093116103a657505561039c565b60068103612fd8575060013a1517156103b957612fb2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162036ee883018093116103a657505561039c565b600803612e205761042a91506136d4565b169060018203612ffd5761042a9150613d85565b6002820361300f5761042a9150613ad7565b600382036130215761042a9150613c2f565b600491808303613036575061042a9150613bd9565b60058103613099575060013a1517156103b957613073610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203345083018093116103a657505561039c565b600681036130fc575060013a1517156103b9576130d6610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203ad6883018093116103a657505561039c565b600803612e205760013a1517156103b957613137610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162043a0883018093116103a657505561039c565b346102c95761316b366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613192613493565b60f883901b16600160f81b0361321f5716600181036131b5575061039c90613f89565b600281036131c7575061042a90613f33565b600381036131d9575061042a90613c85565b600481036131eb575061042a90613edd565b600581036131fd575061042a90613e87565b6006810361320f575061042a90613e31565b600803612b025761042a90613ddb565b16600181036131b5575061042a90613f89565b346102c957613240366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613267613493565b60f883901b16600160f81b036132bd571680613287575061039c90614033565b60018103613299575061042a90613fde565b600281036132ab575061042a9061382a565b60038103612c02575061042a9061382a565b1680613287575061042a90614033565b6040810190811067ffffffffffffffff8211176132e957604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176132e957604052565b67ffffffffffffffff81116132e957601f01601f191660200190565b346102c957613349366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613370613493565b60f883901b16600160f81b03613454571680613390575061039c90614188565b600181036133a2575061042a90614133565b600281036133b4575061042a9061392b565b600381036133c6575061042a906140de565b600481036133d8575061042a90613b83565b600581036133ea575061042a90614088565b600681036133fc575061042a9061372a565b6007810361340e575061042a9061387f565b60088103613420575061042a90613580565b60098103613432575061042a9061367e565b600a8103613444575061042a9061352a565b600b03612b025761042a906134d4565b1680613390575061042a90614188565b3d1561348e573d906134758261331f565b9161348360405193846132fd565b82523d5f602084013e565b606090565b7f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e00805443116134bf5750565b4390555f5f805160206143ea83398151915255565b60013a151715612cab57613508610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620493e08201809211612cab5755565b60013a151715612cab5761355e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062030d408201809211612cab5755565b60013a151715612cab576135b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620186a08201809211612cab5755565b60013a151715612cab5761360a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549060c88201809211612cab5755565b60013a151715612cab5761365e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549060648201809211612cab5755565b60013a151715612cab576136b2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620249f08201809211612cab5755565b60013a151715612cab57613708610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620407408201809211612cab5755565b60013a151715612cab5761375e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620157c08201809211612cab5755565b60013a151715612cab576137b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906194708201809211612cab5755565b60013a151715612cab57613809610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906188b88201809211612cab5755565b60013a151715612cab5761385e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906184d08201809211612cab5755565b60013a151715612cab576138b3610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062015f908201809211612cab5755565b60013a151715612cab57613909610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620111708201809211612cab5755565b60013a151715612cab5761395f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061cf088201809211612cab5755565b60013a151715612cab576139b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061b7988201809211612cab5755565b60013a151715612cab57613a09610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620386588201809211612cab5755565b60013a151715612cab57613a5f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202e6308201809211612cab5755565b60013a151715612cab57613ab5610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620261608201809211612cab5755565b60013a151715612cab57613b0b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201f4008201809211612cab5755565b60013a151715612cab57613b61610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062019a288201809211612cab5755565b60013a151715612cab57613bb7610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620140508201809211612cab5755565b60013a151715612cab57613c0d610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202cad88201809211612cab5755565b60013a151715612cab57613c63610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620255a88201809211612cab5755565b60013a151715612cab57613cb9610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620207888201809211612cab5755565b60013a151715612cab57613d0f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061abe08201809211612cab5755565b60013a151715612cab57613d64610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061a0288201809211612cab5755565b60013a151715612cab57613db9610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201d8a88201809211612cab5755565b60013a151715612cab57613e0f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906203dc488201809211612cab5755565b60013a151715612cab57613e65610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620353908201809211612cab5755565b60013a151715612cab57613ebb610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202de608201809211612cab5755565b60013a151715612cab57613f11610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620278d08201809211612cab5755565b60013a151715612cab57613f67610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062016f308201809211612cab5755565b60013a151715612cab57613fbd610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061fde88201809211612cab5755565b60013a151715612cab57614012610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490617d008201809211612cab5755565b60013a151715612cab57614067610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906165908201809211612cab5755565b60013a151715612cab576140bc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062014ff08201809211612cab5755565b60013a151715612cab57614112610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061d2f08201809211612cab5755565b60013a151715612cab57614167610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061c7388201809211612cab5755565b60013a151715612cab576141bc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061bf688201809211612cab5755565b629896805f805160206143ea8339815191525410156141f857565b60405163964fa5eb60e01b8152600490fd5b6040515f614217826132cd565b600190600183526020368185013760218301825b614236575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156142675791908261422b565b614230565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361429f57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561437457565b604051631afcd79f60e31b8152600490fd5b906143ad575080511561439b57805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806143e0575b6143be575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156143b656fe4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e014c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e03a164736f6c6343000818000a", + "deployedBytecode": "0x604060808152600480361015610013575f80fd5b5f3560e01c90816303eaf064146107375781630832968e146129285781630b332f44146127b95781630d8e6e2c1461266a5781630ff24ee2146125a9578163100747ad1461220857816313f3d32914610fa15781631761d370146121a55781631ade267d14610ffe5781631db04264146121395781631f6f6aec14610fa1578163262794d8146120fc57816327af38ad146116dd5781632be8dd7914611c3c5781632d2da80614611c1457816336118b5214611b975781633a0e6d4314611ad4578163466ac06514610737578163473dceed14610ab15781634f1ef286146118a657816352d1902d1461182f578163577244bd146117e4578163715018a61461174457816372d0e43214610fa15781637300c0fa14610ab157816379ba5097146116e25781637da7e620146116dd5781638638282b146107375781638da5cb5b1461169757816399841ed7146107325781639bf55921146115c55781639d538628146115b05781639f6a0ed8146112b7578163a90cd91d14611289578163aa29aeec14611274578163aa43b7f914611003578163ad23361014610ffe578163ad3cb1cc14610fa6578163b25fd54714610fa1578163bdb4401014610f07578163bfc1f6d814610c0d578163c4d66de814610ab6578163cd2bd00314610ab1578163cea14930146109ce578163d5f0797d1461073c578163d692278314610737578163e138131e14610732578163e30c3978146106ec578163f2fde38b14610645578163f7eaec63146102cd575063fee497551461024e575f80fd5b346102c957806003193601126102c9576020906102696129bf565b6001600160a01b036102b361027c6129d5565b926001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b91165f52825260ff815f20541690519015158152f35b5f80fd5b82346102c9576102dc366129fb565b737b22221e4c113e27aa8c07db973465390871f283939293330361063557610302613493565b6001600160f81b031990811601610625576001919060ff168281036103cc5750503a1517156103b95761037a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b54916001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162021ef883018093116103a65750555b6103a46141dd565b005b601190634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b6002810361042f5750503a1517156103b957610408610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203a1b083018093116103a65750555b61039c565b600381036104915750503a1517156103b95761046b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916204ca9083018093116103a657505561039c565b8085036104f25750503a1517156103b9576104cc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620612b083018093116103a657505561039c565b600581036105545750503a1517156103b95761052e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916208e94083018093116103a657505561039c565b600681036105b65750503a1517156103b957610590610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620d13a883018093116103a657505561039c565b60080361061657503a1517156103b9576105f0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916213321083018093116103a657505561039c565b51639ba6061b60e01b81528390fd5b8151636aa9eb0560e01b81528490fd5b82516378d178a160e01b81528590fd5b346102c95760203660031901126102c95761065e6129bf565b61066661426c565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b82346102c9575f3660031901126102c9576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b61333b565b612a40565b82346102c957806003193601126102c9576107556129bf565b9061075e6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90610784613493565b16806107e857505060013a1517156103b9576107c0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161a7f883018093116103a65750556103a46141dd565b6001810361084b57505060013a1517156103b957610826610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161afc883018093116103a657505561039c565b6002810361085f57505061042a9150613980565b6003810361087357505061042a9150613980565b8084036108d557505060013a1517156103b9576108b0610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161c35083018093116103a657505561039c565b600581036108e957505061042a915061392b565b600681036108fd57505061042a91506138d5565b6007810361096157505060013a1517156103b95761093b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201388083018093116103a657505561039c565b6008810361097557505061042a915061387f565b6009810361098957505061042a915061367e565b600a810361099d57505061042a915061352a565b600b036109af575061042a91506134d4565b51639ba6061b60e01b81529050fd5b81516378d178a160e01b81528490fd5b82346102c957806003193601126102c9576109e76129bf565b906109f06129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90610a16613493565b1680610a2857505061039c91506135d6565b60018103610a3c57505061042a91506135d6565b60028103610a5057505061042a91506135d6565b60038103610a6457505061042a91506135d6565b808403610a7757505061042a91506135d6565b60058103610a8b57505061042a91506135d6565b60068103610a9f57505061042a91506135d6565b6008036109af575061042a91506135d6565b613232565b9050346102c95760203660031901126102c957610ad16129bf565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081610c05575b6001149081610bfb575b159081610bf2575b50610be35767ffffffffffffffff198116600117855583610bc4575b50610b4a614345565b610b52614345565b6001600160a01b03821615610bae5750610b6b906142b7565b610b7157005b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6024905f865191631e4fbdf760e01b8352820152fd5b68ffffffffffffffffff1916680100000000000000011784555f610b41565b50845163f92ee8a960e01b8152fd5b9050155f610b25565b303b159150610b1d565b859150610b13565b82346102c957610c1c366129fb565b737b22221e4c113e27aa8c07db973465390871f283939293330361063557610c42613493565b6001600160f81b031990811601610625576001919060ff16828103610cbe5750503a1517156103b957610c95610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162045d3083018093116103a65750556103a46141dd565b60028103610d205750503a1517156103b957610cfa610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620704e083018093116103a657505561039c565b60038103610d825750503a1517156103b957610d5c610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162097db083018093116103a657505561039c565b808503610de35750503a1517156103b957610dbd610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620c488883018093116103a657505561039c565b60058103610e455750503a1517156103b957610e1f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916210b55883018093116103a657505561039c565b60068103610ea75750503a1517156103b957610e81610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916216df7883018093116103a657505561039c565b60080361061657503a1517156103b957610ee1610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621f4fa083018093116103a657505561039c565b82346102c9575f3660031901126102c95760ff610f54336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b5416610f9457335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260409020805460ff19166001179055005b51635f2223a360e11b8152fd5b612b86565b82346102c9575f3660031901126102c9578051610ffa91610fc6826132cd565b600582527f352e302e3000000000000000000000000000000000000000000000000000000060208301525191829182612b5a565b0390f35b612e30565b82346102c957806003193601126102c95761101c6129bf565b906110256129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff9061104b613493565b16806110af57505060013a1517156103b957611087610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161753083018093116103a65750556103a46141dd565b6001810361111257505060013a1517156103b9576110ed610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916180e883018093116103a657505561039c565b6002810361112657505061042a915061382a565b6003810361113a57505061042a91506137d5565b80840361119c57505060013a1517156103b957611177610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491618ca083018093116103a657505561039c565b600581036111ff57505060013a1517156103b9576111da610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161908883018093116103a657505561039c565b6006810361121357505061042a9150613780565b6008036109af575060013a1517156103b95761124f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161985883018093116103a657505561039c565b346102c9575f3660031901126102c9575f805d005b82346102c9575f3660031901126102c95760209051737b22221e4c113e27aa8c07db973465390871f2838152f35b82346102c957806003193601126102c9576112d06129bf565b906112d96129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff906112ff613493565b60019291168281036113675750503a1517156103b95761133f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161ea6083018093116103a65750556103a46141dd565b600281036113c95750503a1517156103b9576113a3610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201731883018093116103a657505561039c565b6003810361142b5750503a1517156103b957611405610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916201ffb883018093116103a657505561039c565b80850361148c5750503a1517156103b957611466610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916202710083018093116103a657505561039c565b600581036114ee5750503a1517156103b9576114c8610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203095883018093116103a657505561039c565b600681036115505750503a1517156103b95761152a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203c8c083018093116103a657505561039c565b60080361061657503a1517156103b95761158a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916204b70883018093116103a657505561039c565b346102c9575f3660031901126102c957335f5d005b82346102c957806003193601126102c9576115de6129bf565b906115e76129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff9061160d613493565b166001810361162257505061039c9150613580565b6002810361163657505061042a9150613580565b6003810361164a57505061042a9150613580565b80840361165d57505061042a9150613580565b6005810361167157505061042a9150613580565b6006810361168557505061042a9150613580565b6008036109af575061042a9150613580565b82346102c9575f3660031901126102c9576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b61315d565b9050346102c9575f3660031901126102c957336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361172e576103a4336142b7565b602491519063118cdaa760e01b82523390820152fd5b346102c9575f3660031901126102c95761175c61426c565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b82346102c95760203660031901126102c9576020906118276118046129bf565b6001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b549051908152f35b82346102c9575f3660031901126102c9576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361189957602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b9050816003193601126102c9576118bb6129bf565b602492833567ffffffffffffffff81116102c957366023820112156102c95780840135926118e88461331f565b6118f4845191826132fd565b84815260209485820193368983830101116102c957815f928a8993018737830101526001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115611aa6575b50611a965761195961426c565b84516352d1902d60e01b815290831695808289818a5afa9182915f93611a66575b505061199557505050505191634c9c8ce360e01b8352820152fd5b858588928a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91828103611a515750863b15611a3d5750826001600160a01b031982541617905551907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115611a255750505f6103a49381925190845af4611a1f613464565b91614386565b925092505034611a3157005b63b398979f60e01b8152fd5b9450505191634c9c8ce360e01b8352820152fd5b8351632a87526960e21b815280870191909152fd5b9080929350813d8311611a8f575b611a7e81836132fd565b810103126102c95751905f8061197a565b503d611a74565b845163703e46dd60e11b81528790fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f61194c565b9050346102c95760203660031901126102c957611aef6129bf565b906001600160a01b03611b32336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b921691825f5260205260ff835f205416611b895750335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e05602052604090205f91825260205220805460ff19166001179055005b8251639ad3410b60e01b8152fd5b82346102c957806003193601126102c9578135611bb26129d5565b335f9081525f8051602061440a83398151915260205260409020805490838203918211611c01575f93849384938493555af1611bec613464565b5015611bf457005b516327fcd9d160e01b8152fd5b601186634e487b7160e01b5f525260245ffd5b60203660031901126102c957611c2b6118046129bf565b8054913483018093116103a6575055005b82346102c957611c4b366129fb565b737b22221e4c113e27aa8c07db973465390871f2839392933303610635579060ff91611c75613493565b60f883901b16600160f81b03611e9a576001929116828103611c9e5750505061039c915061372a565b60028103611d005750503a1517156103b957611cda610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162026d1883018093116103a657505561039c565b60038103611d625750503a1517156103b957611d3c610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162032c8083018093116103a657505561039c565b808503611d765750505061042a91506136d4565b60058103611dd85750503a1517156103b957611db2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162056ea083018093116103a657505561039c565b60068103611e3a5750503a1517156103b957611e14610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916207530083018093116103a657505561039c565b60080361061657503a1517156103b957611e74610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916209df5883018093116103a657505561039c565b6001929116828103611eb35750505061042a915061367e565b60028103611f155750503a1517156103b957611eef610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203018883018093116103a657505561039c565b60038103611f775750503a1517156103b957611f51610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203ff7083018093116103a657505561039c565b808503611fd85750503a1517156103b957611fb2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162057a5883018093116103a657505561039c565b6005810361203a5750503a1517156103b957612014610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916209c7e883018093116103a657505561039c565b6006810361209c5750503a1517156103b957612076610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621178a883018093116103a657505561039c565b60080361061657503a1517156103b9576120d6610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491621f344883018093116103a657505561039c565b82346102c9575f3660031901126102c9576020907f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e02549051908152f35b82346102c95760203660031901126102c9575f8080806121576129bf565b61215f61426c565b7f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e029082825492555af1612190613464565b501561219857005b5163a4b6690960e01b8152fd5b82346102c95760203660031901126102c95760209060ff6121fd6121c76129bf565b6001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b541690519015158152f35b82346102c957806003193601126102c9576122216129bf565b9061222a6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90612250613493565b16908161226357505061039c915061362a565b60019180830361227a5750505061042a915061362a565b6002810361228f5750505061042a915061362a565b600381036122a45750505061042a91506135d6565b8085036123045750503a1517156103b9576122df610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161012c83018093116103a657505561039c565b600581036123655750503a1517156103b957612340610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161025883018093116103a657505561039c565b600681036123c65750503a1517156103b9576123a1610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161028a83018093116103a657505561039c565b600781036124275750503a1517156103b957612402610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916102bc83018093116103a657505561039c565b600881036124885750503a1517156103b957612463610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161032083018093116103a657505561039c565b600981036124e95750503a1517156103b9576124c4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161064083018093116103a657505561039c565b600a810361254a5750503a1517156103b957612525610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491610c8083018093116103a657505561039c565b600b0361061657503a1517156103b957612584610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549161190083018093116103a657505561039c565b9050346102c95760203660031901126102c9576125c46129bf565b906001600160a01b03612607336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0560205260405f2090565b921691825f5260205260ff835f2054161561265c5750335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e05602052604090205f91825260205220805460ff19169055005b8251632ff3629f60e21b8152fd5b82346102c9575f3660031901126102c957805191612687836132cd565b600a92600a81526020808201907f4648455061796d656e740000000000000000000000000000000000000000000082526126bf61420a565b85519660019190826126d08a6132cd565b60018a52848a01938536863760218b01825b612784575b5050610ffa61271a8a61277a60248c8f8c8e9161276c8e8e8e61270861420a565b958b519c8d98518092868b0190612b39565b870161103b60f11b848201526127398251809386602285019101612b39565b01612756601760f91b958660228401525180936023840190612b39565b0192602384015283519384918885019101612b39565b0103908101855201836132fd565b5191829182612b5a565b5f19019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156127b4579190826126e2565b6126e7565b82346102c957806003193601126102c9576127d26129bf565b906127db6129eb565b737b22221e4c113e27aa8c07db973465390871f28333036109be5760ff90612801613493565b168061281357505061039c9150613580565b6001810361282757505061042a9150613580565b6002810361283b57505061042a9150613580565b6003810361284f57505061042a9150613580565b80840361286257505061042a9150613580565b6005810361287657505061042a9150613580565b6006810361288a57505061042a9150613580565b6008810361289e57505061042a9150613580565b600981036128b257505061042a915061352a565b600a81036128c657505061042a91506134d4565b600b036109af575060013a1517156103b957612902610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162061a8083018093116103a657505561039c565b82346102c9575f3660031901126102c95760ff612975336001600160a01b03165f527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260405f2090565b5416156129b357335f9081527f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e0460205260409020805460ff19169055005b51621c262560e81b8152fd5b600435906001600160a01b03821682036102c957565b602435906001600160a01b03821682036102c957565b6024359060ff821682036102c957565b60609060031901126102c9576004356001600160a01b03811681036102c9579060243560ff811681036102c957906044356001600160f81b0319811681036102c95790565b346102c957612a4e366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612a75613493565b60f883901b16600160f81b03612b14571660018103612a98575061039c906138d5565b60028103612aaa575061042a90613b83565b60038103612abc575061042a90613b2d565b60048103612ace575061042a90613ad7565b60058103612ae0575061042a90613a81565b60068103612af2575061042a90613a2b565b600803612b025761042a906139d5565b604051639ba6061b60e01b8152600490fd5b1660018103612a98575061042a906138d5565b6040516378d178a160e01b8152600490fd5b5f5b838110612b4a5750505f910152565b8181015183820152602001612b3b565b60409160208252612b7a8151809281602086015260208686019101612b39565b601f01601f1916010190565b346102c957612b94366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612bbb613493565b60f883901b16600160f81b03612c48571660018103612bde575061039c906137d5565b60028103612bf0575061042a906137d5565b60038103612c02575061042a906137d5565b60048103612c14575061042a906137d5565b60058103612c26575061042a90613780565b60068103612c38575061042a90613d30565b600803612b025761042a90613cdb565b1660018103612cbf575060013a151715612cab57612c86610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201c5208201809211612cab575561039c565b634e487b7160e01b5f52601160045260245ffd5b9060028203612cd25761042a9150613c85565b60038203612ce45761042a9150613c2f565b600491808303612cf9575061042a9150613bd9565b60058103612d5c575060013a1517156103b957612d36610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620376b883018093116103a657505561039c565b60068103612dbf575060013a1517156103b957612d99610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162044d9083018093116103a657505561039c565b600803612e205760013a1517156103b957612dfa610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916205573083018093116103a657505561039c565b50604051639ba6061b60e01b8152fd5b346102c957612e3e366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91612e65613493565b60f883901b16600160f81b03612fe957169060018203612e895761039c9150613d85565b60028203612e9b5761042a9150613ad7565b60038203612ead5761042a915061367e565b600491808303612f12575060013a1517156103b957612eec610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805491620280a083018093116103a657505561039c565b60058103612f75575060013a1517156103b957612f4f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916202ee0083018093116103a657505561039c565b60068103612fd8575060013a1517156103b957612fb2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162036ee883018093116103a657505561039c565b600803612e205761042a91506136d4565b169060018203612ffd5761042a9150613d85565b6002820361300f5761042a9150613ad7565b600382036130215761042a9150613c2f565b600491808303613036575061042a9150613bd9565b60058103613099575060013a1517156103b957613073610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203345083018093116103a657505561039c565b600681036130fc575060013a1517156103b9576130d6610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054916203ad6883018093116103a657505561039c565b600803612e205760013a1517156103b957613137610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549162043a0883018093116103a657505561039c565b346102c95761316b366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613192613493565b60f883901b16600160f81b0361321f5716600181036131b5575061039c90613f89565b600281036131c7575061042a90613f33565b600381036131d9575061042a90613c85565b600481036131eb575061042a90613edd565b600581036131fd575061042a90613e87565b6006810361320f575061042a90613e31565b600803612b025761042a90613ddb565b16600181036131b5575061042a90613f89565b346102c957613240366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613267613493565b60f883901b16600160f81b036132bd571680613287575061039c90614033565b60018103613299575061042a90613fde565b600281036132ab575061042a9061382a565b60038103612c02575061042a9061382a565b1680613287575061042a90614033565b6040810190811067ffffffffffffffff8211176132e957604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176132e957604052565b67ffffffffffffffff81116132e957601f01601f191660200190565b346102c957613349366129fb565b90737b22221e4c113e27aa8c07db973465390871f2833303612b275760ff91613370613493565b60f883901b16600160f81b03613454571680613390575061039c90614188565b600181036133a2575061042a90614133565b600281036133b4575061042a9061392b565b600381036133c6575061042a906140de565b600481036133d8575061042a90613b83565b600581036133ea575061042a90614088565b600681036133fc575061042a9061372a565b6007810361340e575061042a9061387f565b60088103613420575061042a90613580565b60098103613432575061042a9061367e565b600a8103613444575061042a9061352a565b600b03612b025761042a906134d4565b1680613390575061042a90614188565b3d1561348e573d906134758261331f565b9161348360405193846132fd565b82523d5f602084013e565b606090565b7f4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e00805443116134bf5750565b4390555f5f805160206143ea83398151915255565b60013a151715612cab57613508610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620493e08201809211612cab5755565b60013a151715612cab5761355e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062030d408201809211612cab5755565b60013a151715612cab576135b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620186a08201809211612cab5755565b60013a151715612cab5761360a610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549060c88201809211612cab5755565b60013a151715612cab5761365e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549060648201809211612cab5755565b60013a151715612cab576136b2610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620249f08201809211612cab5755565b60013a151715612cab57613708610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620407408201809211612cab5755565b60013a151715612cab5761375e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620157c08201809211612cab5755565b60013a151715612cab576137b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906194708201809211612cab5755565b60013a151715612cab57613809610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906188b88201809211612cab5755565b60013a151715612cab5761385e610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906184d08201809211612cab5755565b60013a151715612cab576138b3610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062015f908201809211612cab5755565b60013a151715612cab57613909610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620111708201809211612cab5755565b60013a151715612cab5761395f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061cf088201809211612cab5755565b60013a151715612cab576139b4610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061b7988201809211612cab5755565b60013a151715612cab57613a09610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620386588201809211612cab5755565b60013a151715612cab57613a5f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202e6308201809211612cab5755565b60013a151715612cab57613ab5610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620261608201809211612cab5755565b60013a151715612cab57613b0b610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201f4008201809211612cab5755565b60013a151715612cab57613b61610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062019a288201809211612cab5755565b60013a151715612cab57613bb7610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620140508201809211612cab5755565b60013a151715612cab57613c0d610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202cad88201809211612cab5755565b60013a151715612cab57613c63610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620255a88201809211612cab5755565b60013a151715612cab57613cb9610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620207888201809211612cab5755565b60013a151715612cab57613d0f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061abe08201809211612cab5755565b60013a151715612cab57613d64610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061a0288201809211612cab5755565b60013a151715612cab57613db9610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906201d8a88201809211612cab5755565b60013a151715612cab57613e0f610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906203dc488201809211612cab5755565b60013a151715612cab57613e65610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620353908201809211612cab5755565b60013a151715612cab57613ebb610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906202de608201809211612cab5755565b60013a151715612cab57613f11610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490620278d08201809211612cab5755565b60013a151715612cab57613f67610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062016f308201809211612cab5755565b60013a151715612cab57613fbd610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061fde88201809211612cab5755565b60013a151715612cab57614012610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea833981519152805490617d008201809211612cab5755565b60013a151715612cab57614067610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea8339815191528054906165908201809211612cab5755565b60013a151715612cab576140bc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549062014ff08201809211612cab5755565b60013a151715612cab57614112610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061d2f08201809211612cab5755565b60013a151715612cab57614167610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061c7388201809211612cab5755565b60013a151715612cab576141bc610355826001600160a01b03165f525f8051602061440a83398151915260205260405f2090565b555f805160206143ea83398151915280549061bf688201809211612cab5755565b629896805f805160206143ea8339815191525410156141f857565b60405163964fa5eb60e01b8152600490fd5b6040515f614217826132cd565b600190600183526020368185013760218301825b614236575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156142675791908261422b565b614230565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361429f57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561437457565b604051631afcd79f60e31b8152600490fd5b906143ad575080511561439b57805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806143e0575b6143be575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156143b656fe4c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e014c5af501c90907b9fb888b6dd79405547def38a1dc3110f42d77f5dbc3222e03a164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.dbg.json b/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.json b/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.json new file mode 100644 index 00000000..15171981 --- /dev/null +++ b/contracts/artifacts/contracts/InputVerifier.coprocessor.sol/InputVerifier.json @@ -0,0 +1,483 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "InputVerifier", + "sourceName": "contracts/InputVerifier.coprocessor.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "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": [], + "name": "EIP712DomainChanged", + "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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CIPHERTEXTVERIFICATION_COPRO_TYPE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "HANDLE_VERSION", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCoprocessorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getKMSVerifierAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "get_CIPHERTEXTVERIFICATION_COPRO_TYPE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "kmsVerifier", + "outputs": [ + { + "internalType": "contract KMSVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": [], + "name": "renounceOwnership", + "outputs": [], + "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" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "internalType": "struct TFHEExecutor.ContextUserInputs", + "name": "context", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161249c90816100d1823960805181818161057e01526106d70152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806303b031cf1461012f5780630d8e6e2c1461012a5780631967d4a6146100f35780634d52c107146101255780634f1ef2861461012057806352d1902d1461011b5780636a8c8eb414610116578063715018a61461011157806379ba50971461010c57806384b0196e146101075780638da5cb5b146101025780638e188f43146100fd578063ad3cb1cc146100f8578063b578ba0d146100f3578063c4d66de8146100ee578063e30c3978146100e9578063f0ea684d146100e45763f2fde38b146100df575f80fd5b610c3a565b61012f565b610bf5565b610a71565b6103fc565b610a14565b6109e6565b6109a1565b6108c9565b6107e1565b610741565b610727565b6106bd565b61053d565b6104b3565b6101bb565b3461015d575f36600319011261015d576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b5f80fd5b5f5b8381106101725750505f910152565b8181015183820152602001610163565b9060209161019b81518092818552858086019101610161565b601f01601f1916010190565b9060206101b8928181520190610182565b90565b3461015d575f36600319011261015d5761027c6101d6610ce1565b6102706101e16118ef565b916102626101ed61192b565b60246101f76118ef565b91604051968561021189975180926020808b019101610161565b860161103b60f11b6020820152610232825180936020602285019101610161565b0190601760f91b91826022820152610254825180936020602385019101610161565b019060238201520190610d1a565b03601f1981018352826102ed565b604051918291826101a7565b0390f35b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176102b057604052565b610280565b60c0810190811067ffffffffffffffff8211176102b057604052565b6040810190811067ffffffffffffffff8211176102b057604052565b90601f8019910116810190811067ffffffffffffffff8211176102b057604052565b67ffffffffffffffff81116102b057601f01601f191660200190565b60405190610338826102b5565b608d82527f747261637441646472657373290000000000000000000000000000000000000060a0837f43697068657274657874566572696669636174696f6e466f72436f70726f286160208201527f6464726573732061636c416464726573732c6279746573333220686173684f6660408201527f436970686572746578742c75696e743235365b5d2068616e646c65734c69737460608201527f2c616464726573732075736572416464726573732c6164647265737320636f6e60808201520152565b3461015d575f36600319011261015d5761027c61041761032b565b604051918291602083526020830190610182565b600435906001600160a01b038216820361015d57565b602435906001600160a01b038216820361015d57565b604435906001600160a01b038216820361015d57565b81601f8201121561015d578035906104848261030f565b9261049260405194856102ed565b8284526020838301011161015d57815f926020809301838601378301015290565b3461015d57366003190160a0811261015d5760601361015d576040516104d881610294565b6104e061042b565b81526104ea610441565b60208201526104f7610457565b604082015260843567ffffffffffffffff811161015d5761027c9161052361052d92369060040161046d565b9060643590611262565b6040519081529081906020820190565b604036600319011261015d5761055161042b565b60243567ffffffffffffffff811161015d5761057190369060040161046d565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561068f575b5061067d5760206004936105bb611b6f565b6040516352d1902d60e01b8152948591829086165afa5f938161064c575b506105ff57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8303610633576106319250611e23565b005b604051632a87526960e21b815260048101849052602490fd5b61066f91945060203d602011610676575b61066781836102ed565b810190611b60565b925f6105d9565b503d61065d565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f6105a9565b3461015d575f36600319011261015d576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361067d5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b3461015d575f36600319011261015d5760206040515f8152f35b3461015d575f36600319011261015d57610759611b6f565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015d575f36600319011261015d57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361082b5761063133611ba2565b60405163118cdaa760e01b8152336004820152602490fd5b919361087e6001600160a01b039295600f60f81b855261087060209760e0602088015260e0870190610182565b908582036040870152610182565b9360608401521660808201525f60a082015260c0818303910152602080845192838152019301915f5b8281106108b5575050505090565b8351855293810193928101926001016108a7565b3461015d575f36600319011261015d577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610978575b156109335761090f611c68565b610917611d4e565b9061027c610923610f97565b6040519384933091469186610843565b60405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415610902565b3461015d575f36600319011261015d5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461015d575f36600319011261015d57602060405173c9990fefe0c27d31d0c2aa36196b085c0c4d456c8152f35b3461015d575f36600319011261015d5761027c604051610a33816102d1565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610182565b3461015d57602036600319011261015d57610a8a61042b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610bed575b6001149081610be3575b159081610bda575b50610bc8577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff19166001179055610b219082610b87576116d4565b610b2757005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916680100000000000000001790556116d4565b60405163f92ee8a960e01b8152600490fd5b9050155f610adb565b303b159150610ad3565b839150610ac9565b3461015d575f36600319011261015d5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461015d57602036600319011261015d57610c5361042b565b610c5b611b6f565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b60405190610cee826102d1565b600d82527f496e7075745665726966696572000000000000000000000000000000000000006020830152565b90610d2d60209282815194859201610161565b0190565b634e487b7160e01b5f52603260045260245ffd5b805115610d525760200190565b610d31565b805160011015610d525760210190565b908151811015610d52570160200190565b15610d7f57565b60405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b908160051b9180830460201490151715610dee57565b610dc4565b908160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610dee57565b908160051b917f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610dee57565b9081604102916041830403610dee57565b6022019081602211610dee57565b6063019081606311610dee57565b91908201809211610dee57565b601f0390601f8211610dee57565b15610ea257565b60405162461bcd60e51b815260206004820152601160248201527f57726f6e6720696e70757448616e646c650000000000000000000000000000006044820152606490fd5b15610eee57565b60405162461bcd60e51b815260206004820152601060248201527f456d70747920696e70757450726f6f66000000000000000000000000000000006044820152606490fd5b15610f3a57565b60405162461bcd60e51b815260206004820152601e60248201527f4572726f7220646573657269616c697a696e6720696e70757450726f6f6600006044820152606490fd5b67ffffffffffffffff81116102b05760051b60200190565b6040516020810181811067ffffffffffffffff8211176102b0576040525f8152905f368137565b90610fc882610f7f565b610fd560405191826102ed565b8281528092610fe6601f1991610f7f565b0190602036910137565b15610ff757565b60405162461bcd60e51b815260206004820152601460248201527f57726f6e672068616e646c652076657273696f6e0000000000000000000000006044820152606490fd5b8051821015610d525760209160051b010190565b604051906080820182811067ffffffffffffffff8211176102b057604052604182526060366020840137565b6040519060a0820182811067ffffffffffffffff8211176102b0576040525f608083828152826020820152606060408201528260608201520152565b906110c282610f7f565b6110cf60405191826102ed565b82815280926110e0601f1991610f7f565b01905f5b8281106110f057505050565b8060606020809385010152016110e4565b604051906080820182811067ffffffffffffffff8211176102b0576040525f6060838281528260208201528260408201520152565b9081602091031261015d5751801515810361015d5790565b9060a08201906001600160a01b03808251168452606060209260208101516020870152826040820151166040870152015116606084015260a06080840152835180925260c0830192602060c08460051b8301019501935f915b8483106111b75750505050505090565b90919293949584806111d560019360bf198682030187528a51610182565b98019301930191949392906111a7565b6040513d5f823e3d90fd5b156111f757565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820756e69717565204b4d5320696e707574207369676e60448201527f61747572657300000000000000000000000000000000000000000000000000006064820152608490fd5b60208082018051939491936001600160a01b0316916112a2604085019361129085516001600160a01b031690565b86516001600160a01b0316918461197e565b94909360ff9360ff8960101c1695155f1461164c57929091879282516112c9811515610ee7565b61130d6113076113016112db87610d45565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b60ff1690565b906113586113236113076113016112db89610d57565b9161132f8b8511610d78565b61135261134361133e86610e23565b610e72565b61134c85610e53565b90610e80565b14610f33565b60228501519161136781610fbe565b985f5b82811061160f57505061137b611050565b5f5b604181106115c5575061140b9061139261107c565b6113b36113a689516001600160a01b031690565b6001600160a01b03168252565b858a8201528b60408201526113e26113d28c516001600160a01b031690565b6001600160a01b03166060830152565b6114066113f688516001600160a01b031690565b6001600160a01b03166080830152565b611a34565b611414826110b8565b955f5b838110611528575050505061148b9161147e61146e6114a6986113d29461145d611450611442611101565b99516001600160a01b031690565b6001600160a01b03168952565b89880152516001600160a01b031690565b6001600160a01b03166040860152565b516001600160a01b031690565b60405163073371f960e11b815293849283926004840161114e565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1938415611523576114e46114ee956114e9936101b8985f926114f6575b50506111f0565b611b5a565b61103c565b518214610e9b565b6115159250803d1061151c575b61150d81836102ed565b810190611136565b5f806114dd565b503d611503565b6111e5565b82939495979996985061153c929192611050565b611546828c61103c565b52611551818b61103c565b505f5b8a604182106115735750506001915001908c9795989694939291611417565b6115bb826115b1856115ab6112db6115a5856115a061159761133e60019d9e610e23565b61134c87610e53565b610e80565b8b610d67565b9461103c565b51925f1a92610d67565b5301908391611554565b8293949597999698506115f26112db6115ec836115a06115e760019798610e23565b610e64565b8c610d67565b5f1a6115fe8285610d67565b5301908c979598969493929161137d565b60019192939495979996985060428160051b8b01015161163184821615610ff0565b61163b828d61103c565b5201908c979598969493929161136a565b505050919390508492506116728460ff61166b6113016112db87610d45565b1611610d78565b5f915f945b82861061168c575050506101b8925014610e9b565b919350916001906116b56113076113016112db6116af8a6115a06115e78a610dd8565b88610d67565b6116c66116c188610e8d565b610df3565b1b1794019391859391611677565b6116dc611ed9565b6116e4611ed9565b6001600160a01b038116156118bd576116fc90611ba2565b611704610ce1565b90604051611711816102d1565b6001808252602090603160f81b602084015261172b611ed9565b611733611ed9565b84519067ffffffffffffffff82116102b0577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029261177a836117758654611c30565b611f1a565b602091601f841160011461181457505090806117b0926117b796975f92611809575b50508160011b915f199060031b1c19161790565b9055612032565b6117df5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b6118075f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b565b015190505f8061179c565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f908152601f198516987f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d949390925b8a83106118a657505050908392916001946117b798991061188e575b505050811b019055612032565b01515f1960f88460031b161c191690555f8080611881565b838501518655948501949381019391810191611865565b604051631e4fbdf760e01b81525f6004820152602490fd5b604051906118e2826102d1565b6001825260203681840137565b5f6118f86118d5565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490816118fe57505090565b6001806119366118d5565b9160218301825b611948575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156119795791908261193d565b611942565b6119e091605c9194939460405194859260208401976bffffffffffffffffffffffff199283809260601b168a5260601b16603485015260601b1660488301526119d08151809260208686019101610161565b810103603c8101845201826102ed565b519020805c91565b156119ef57565b60405162461bcd60e51b815260206004820152601c60248201527f436f70726f636573736f722061646472657373206d69736d61746368000000006044820152606490fd5b90611a3d61032b565b8051602080920120906001600160a01b0393848151169180820151604083015192604051938385019081858251919201905f5b818110611b465750505094611b3a94611b266118079b9995611b3f9995611b32958573c9990fefe0c27d31d0c2aa36196b085c0c4d456c9e9b0395611abd601f19978881018352826102ed565b519020611ae86080611ad960608501516001600160a01b031690565b9301516001600160a01b031690565b604080519687019a8b526001600160a01b03998a1660208c01528a019390935260608901528616608088015290941660a086015292839060c0860190565b039081018352826102ed565b519020612152565b611e0d565b16146119e8565b825184529287019291870191600101611a70565b6001905d565b9081602091031261015d575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361082b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b90600182811c92168015611c5e575b6020831014611c4a57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611c3f565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10291825492611c9c84611c30565b80845293602091600191828116908115611d285750600114611cc8575b505050611807925003836102ed565b5f9081527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9590935091905b828410611d1057506118079450505081016020015f8080611cb9565b85548885018301529485019487945092810192611cf4565b925050506020925061180794915060ff191682840152151560051b8201015f8080611cb9565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10391825492611d8284611c30565b80845293602091600191828116908115611d285750600114611dad57505050611807925003836102ed565b5f9081527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b759590935091905b828410611df557506118079450505081016020015f8080611cb9565b85548885018301529485019487945092810192611dd9565b6101b891611e1a916121d2565b9092919261222a565b90813b15611eb8576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115611e9d57611e9a916122b7565b50565b505034611ea657565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611f0857565b604051631afcd79f60e31b8152600490fd5b601f8111611f26575050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d906020601f840160051c83019310611f9c575b601f0160051c01905b818110611f91575050565b5f8155600101611f86565b9091508190611f7d565b601f8111611fb2575050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75906020601f840160051c83019310612028575b601f0160051c01905b81811061201d575050565b5f8155600101612012565b9091508190612009565b90815167ffffffffffffffff81116102b0577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10390612079816120748454611c30565b611fa6565b602080601f83116001146120ae575081906120aa9394955f926118095750508160011b915f199060031b1c19161790565b9055565b90601f198316956120ff7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b7590565b925f905b88821061213a57505083600195969710612122575b505050811b019055565b01515f1960f88460031b161c191690555f8080612118565b80600185968294968601518155019501930190612103565b60429061215d6123e0565b61216561244a565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526121b4816102b5565b519020906040519161190160f01b8352600283015260228201522090565b8151919060418303612202576121fb9250602082015190606060408401519301515f1a906122fb565b9192909190565b50505f9160029190565b6004111561221657565b634e487b7160e01b5f52602160045260245ffd5b6122338161220c565b8061223c575050565b6122458161220c565b6001810361225f5760405163f645eedf60e01b8152600490fd5b6122688161220c565b600281036122895760405163fce698f760e01b815260048101839052602490fd5b8061229560039261220c565b1461229d5750565b6040516335e2f38360e21b81526004810191909152602490fd5b5f806101b893602081519101845af43d156122f3573d916122d78361030f565b926122e560405194856102ed565b83523d5f602085013e61237d565b60609161237d565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612372579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611523575f516001600160a01b0381161561236857905f905f90565b505f906001905f90565b5050505f9160039190565b906123a4575080511561239257805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806123d7575b6123b5575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156123ad565b6123e8611c68565b80519081156123f8576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1005480156124255790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b612452611d4e565b8051908115612462576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015612425579056fea164736f6c6343000818000a", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c806303b031cf1461012f5780630d8e6e2c1461012a5780631967d4a6146100f35780634d52c107146101255780634f1ef2861461012057806352d1902d1461011b5780636a8c8eb414610116578063715018a61461011157806379ba50971461010c57806384b0196e146101075780638da5cb5b146101025780638e188f43146100fd578063ad3cb1cc146100f8578063b578ba0d146100f3578063c4d66de8146100ee578063e30c3978146100e9578063f0ea684d146100e45763f2fde38b146100df575f80fd5b610c3a565b61012f565b610bf5565b610a71565b6103fc565b610a14565b6109e6565b6109a1565b6108c9565b6107e1565b610741565b610727565b6106bd565b61053d565b6104b3565b6101bb565b3461015d575f36600319011261015d576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b5f80fd5b5f5b8381106101725750505f910152565b8181015183820152602001610163565b9060209161019b81518092818552858086019101610161565b601f01601f1916010190565b9060206101b8928181520190610182565b90565b3461015d575f36600319011261015d5761027c6101d6610ce1565b6102706101e16118ef565b916102626101ed61192b565b60246101f76118ef565b91604051968561021189975180926020808b019101610161565b860161103b60f11b6020820152610232825180936020602285019101610161565b0190601760f91b91826022820152610254825180936020602385019101610161565b019060238201520190610d1a565b03601f1981018352826102ed565b604051918291826101a7565b0390f35b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff8211176102b057604052565b610280565b60c0810190811067ffffffffffffffff8211176102b057604052565b6040810190811067ffffffffffffffff8211176102b057604052565b90601f8019910116810190811067ffffffffffffffff8211176102b057604052565b67ffffffffffffffff81116102b057601f01601f191660200190565b60405190610338826102b5565b608d82527f747261637441646472657373290000000000000000000000000000000000000060a0837f43697068657274657874566572696669636174696f6e466f72436f70726f286160208201527f6464726573732061636c416464726573732c6279746573333220686173684f6660408201527f436970686572746578742c75696e743235365b5d2068616e646c65734c69737460608201527f2c616464726573732075736572416464726573732c6164647265737320636f6e60808201520152565b3461015d575f36600319011261015d5761027c61041761032b565b604051918291602083526020830190610182565b600435906001600160a01b038216820361015d57565b602435906001600160a01b038216820361015d57565b604435906001600160a01b038216820361015d57565b81601f8201121561015d578035906104848261030f565b9261049260405194856102ed565b8284526020838301011161015d57815f926020809301838601378301015290565b3461015d57366003190160a0811261015d5760601361015d576040516104d881610294565b6104e061042b565b81526104ea610441565b60208201526104f7610457565b604082015260843567ffffffffffffffff811161015d5761027c9161052361052d92369060040161046d565b9060643590611262565b6040519081529081906020820190565b604036600319011261015d5761055161042b565b60243567ffffffffffffffff811161015d5761057190369060040161046d565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561068f575b5061067d5760206004936105bb611b6f565b6040516352d1902d60e01b8152948591829086165afa5f938161064c575b506105ff57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8303610633576106319250611e23565b005b604051632a87526960e21b815260048101849052602490fd5b61066f91945060203d602011610676575b61066781836102ed565b810190611b60565b925f6105d9565b503d61065d565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f6105a9565b3461015d575f36600319011261015d576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361067d5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b3461015d575f36600319011261015d5760206040515f8152f35b3461015d575f36600319011261015d57610759611b6f565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015d575f36600319011261015d57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361082b5761063133611ba2565b60405163118cdaa760e01b8152336004820152602490fd5b919361087e6001600160a01b039295600f60f81b855261087060209760e0602088015260e0870190610182565b908582036040870152610182565b9360608401521660808201525f60a082015260c0818303910152602080845192838152019301915f5b8281106108b5575050505090565b8351855293810193928101926001016108a7565b3461015d575f36600319011261015d577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610978575b156109335761090f611c68565b610917611d4e565b9061027c610923610f97565b6040519384933091469186610843565b60405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415610902565b3461015d575f36600319011261015d5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461015d575f36600319011261015d57602060405173c9990fefe0c27d31d0c2aa36196b085c0c4d456c8152f35b3461015d575f36600319011261015d5761027c604051610a33816102d1565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610182565b3461015d57602036600319011261015d57610a8a61042b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610bed575b6001149081610be3575b159081610bda575b50610bc8577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff19166001179055610b219082610b87576116d4565b610b2757005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916680100000000000000001790556116d4565b60405163f92ee8a960e01b8152600490fd5b9050155f610adb565b303b159150610ad3565b839150610ac9565b3461015d575f36600319011261015d5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461015d57602036600319011261015d57610c5361042b565b610c5b611b6f565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b60405190610cee826102d1565b600d82527f496e7075745665726966696572000000000000000000000000000000000000006020830152565b90610d2d60209282815194859201610161565b0190565b634e487b7160e01b5f52603260045260245ffd5b805115610d525760200190565b610d31565b805160011015610d525760210190565b908151811015610d52570160200190565b15610d7f57565b60405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b908160051b9180830460201490151715610dee57565b610dc4565b908160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610dee57565b908160051b917f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610dee57565b9081604102916041830403610dee57565b6022019081602211610dee57565b6063019081606311610dee57565b91908201809211610dee57565b601f0390601f8211610dee57565b15610ea257565b60405162461bcd60e51b815260206004820152601160248201527f57726f6e6720696e70757448616e646c650000000000000000000000000000006044820152606490fd5b15610eee57565b60405162461bcd60e51b815260206004820152601060248201527f456d70747920696e70757450726f6f66000000000000000000000000000000006044820152606490fd5b15610f3a57565b60405162461bcd60e51b815260206004820152601e60248201527f4572726f7220646573657269616c697a696e6720696e70757450726f6f6600006044820152606490fd5b67ffffffffffffffff81116102b05760051b60200190565b6040516020810181811067ffffffffffffffff8211176102b0576040525f8152905f368137565b90610fc882610f7f565b610fd560405191826102ed565b8281528092610fe6601f1991610f7f565b0190602036910137565b15610ff757565b60405162461bcd60e51b815260206004820152601460248201527f57726f6e672068616e646c652076657273696f6e0000000000000000000000006044820152606490fd5b8051821015610d525760209160051b010190565b604051906080820182811067ffffffffffffffff8211176102b057604052604182526060366020840137565b6040519060a0820182811067ffffffffffffffff8211176102b0576040525f608083828152826020820152606060408201528260608201520152565b906110c282610f7f565b6110cf60405191826102ed565b82815280926110e0601f1991610f7f565b01905f5b8281106110f057505050565b8060606020809385010152016110e4565b604051906080820182811067ffffffffffffffff8211176102b0576040525f6060838281528260208201528260408201520152565b9081602091031261015d5751801515810361015d5790565b9060a08201906001600160a01b03808251168452606060209260208101516020870152826040820151166040870152015116606084015260a06080840152835180925260c0830192602060c08460051b8301019501935f915b8483106111b75750505050505090565b90919293949584806111d560019360bf198682030187528a51610182565b98019301930191949392906111a7565b6040513d5f823e3d90fd5b156111f757565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820756e69717565204b4d5320696e707574207369676e60448201527f61747572657300000000000000000000000000000000000000000000000000006064820152608490fd5b60208082018051939491936001600160a01b0316916112a2604085019361129085516001600160a01b031690565b86516001600160a01b0316918461197e565b94909360ff9360ff8960101c1695155f1461164c57929091879282516112c9811515610ee7565b61130d6113076113016112db87610d45565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b60ff1690565b906113586113236113076113016112db89610d57565b9161132f8b8511610d78565b61135261134361133e86610e23565b610e72565b61134c85610e53565b90610e80565b14610f33565b60228501519161136781610fbe565b985f5b82811061160f57505061137b611050565b5f5b604181106115c5575061140b9061139261107c565b6113b36113a689516001600160a01b031690565b6001600160a01b03168252565b858a8201528b60408201526113e26113d28c516001600160a01b031690565b6001600160a01b03166060830152565b6114066113f688516001600160a01b031690565b6001600160a01b03166080830152565b611a34565b611414826110b8565b955f5b838110611528575050505061148b9161147e61146e6114a6986113d29461145d611450611442611101565b99516001600160a01b031690565b6001600160a01b03168952565b89880152516001600160a01b031690565b6001600160a01b03166040860152565b516001600160a01b031690565b60405163073371f960e11b815293849283926004840161114e565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1938415611523576114e46114ee956114e9936101b8985f926114f6575b50506111f0565b611b5a565b61103c565b518214610e9b565b6115159250803d1061151c575b61150d81836102ed565b810190611136565b5f806114dd565b503d611503565b6111e5565b82939495979996985061153c929192611050565b611546828c61103c565b52611551818b61103c565b505f5b8a604182106115735750506001915001908c9795989694939291611417565b6115bb826115b1856115ab6112db6115a5856115a061159761133e60019d9e610e23565b61134c87610e53565b610e80565b8b610d67565b9461103c565b51925f1a92610d67565b5301908391611554565b8293949597999698506115f26112db6115ec836115a06115e760019798610e23565b610e64565b8c610d67565b5f1a6115fe8285610d67565b5301908c979598969493929161137d565b60019192939495979996985060428160051b8b01015161163184821615610ff0565b61163b828d61103c565b5201908c979598969493929161136a565b505050919390508492506116728460ff61166b6113016112db87610d45565b1611610d78565b5f915f945b82861061168c575050506101b8925014610e9b565b919350916001906116b56113076113016112db6116af8a6115a06115e78a610dd8565b88610d67565b6116c66116c188610e8d565b610df3565b1b1794019391859391611677565b6116dc611ed9565b6116e4611ed9565b6001600160a01b038116156118bd576116fc90611ba2565b611704610ce1565b90604051611711816102d1565b6001808252602090603160f81b602084015261172b611ed9565b611733611ed9565b84519067ffffffffffffffff82116102b0577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1029261177a836117758654611c30565b611f1a565b602091601f841160011461181457505090806117b0926117b796975f92611809575b50508160011b915f199060031b1c19161790565b9055612032565b6117df5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10055565b6118075f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10155565b565b015190505f8061179c565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f908152601f198516987f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d949390925b8a83106118a657505050908392916001946117b798991061188e575b505050811b019055612032565b01515f1960f88460031b161c191690555f8080611881565b838501518655948501949381019391810191611865565b604051631e4fbdf760e01b81525f6004820152602490fd5b604051906118e2826102d1565b6001825260203681840137565b5f6118f86118d5565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530490816118fe57505090565b6001806119366118d5565b9160218301825b611948575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156119795791908261193d565b611942565b6119e091605c9194939460405194859260208401976bffffffffffffffffffffffff199283809260601b168a5260601b16603485015260601b1660488301526119d08151809260208686019101610161565b810103603c8101845201826102ed565b519020805c91565b156119ef57565b60405162461bcd60e51b815260206004820152601c60248201527f436f70726f636573736f722061646472657373206d69736d61746368000000006044820152606490fd5b90611a3d61032b565b8051602080920120906001600160a01b0393848151169180820151604083015192604051938385019081858251919201905f5b818110611b465750505094611b3a94611b266118079b9995611b3f9995611b32958573c9990fefe0c27d31d0c2aa36196b085c0c4d456c9e9b0395611abd601f19978881018352826102ed565b519020611ae86080611ad960608501516001600160a01b031690565b9301516001600160a01b031690565b604080519687019a8b526001600160a01b03998a1660208c01528a019390935260608901528616608088015290941660a086015292839060c0860190565b039081018352826102ed565b519020612152565b611e0d565b16146119e8565b825184529287019291870191600101611a70565b6001905d565b9081602091031261015d575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361082b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b90600182811c92168015611c5e575b6020831014611c4a57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611c3f565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10291825492611c9c84611c30565b80845293602091600191828116908115611d285750600114611cc8575b505050611807925003836102ed565b5f9081527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9590935091905b828410611d1057506118079450505081016020015f8080611cb9565b85548885018301529485019487945092810192611cf4565b925050506020925061180794915060ff191682840152151560051b8201015f8080611cb9565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10391825492611d8284611c30565b80845293602091600191828116908115611d285750600114611dad57505050611807925003836102ed565b5f9081527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b759590935091905b828410611df557506118079450505081016020015f8080611cb9565b85548885018301529485019487945092810192611dd9565b6101b891611e1a916121d2565b9092919261222a565b90813b15611eb8576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115611e9d57611e9a916122b7565b50565b505034611ea657565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611f0857565b604051631afcd79f60e31b8152600490fd5b601f8111611f26575050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d906020601f840160051c83019310611f9c575b601f0160051c01905b818110611f91575050565b5f8155600101611f86565b9091508190611f7d565b601f8111611fb2575050565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75906020601f840160051c83019310612028575b601f0160051c01905b81811061201d575050565b5f8155600101612012565b9091508190612009565b90815167ffffffffffffffff81116102b0577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10390612079816120748454611c30565b611fa6565b602080601f83116001146120ae575081906120aa9394955f926118095750508160011b915f199060031b1c19161790565b9055565b90601f198316956120ff7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b7590565b925f905b88821061213a57505083600195969710612122575b505050811b019055565b01515f1960f88460031b161c191690555f8080612118565b80600185968294968601518155019501930190612103565b60429061215d6123e0565b61216561244a565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526121b4816102b5565b519020906040519161190160f01b8352600283015260228201522090565b8151919060418303612202576121fb9250602082015190606060408401519301515f1a906122fb565b9192909190565b50505f9160029190565b6004111561221657565b634e487b7160e01b5f52602160045260245ffd5b6122338161220c565b8061223c575050565b6122458161220c565b6001810361225f5760405163f645eedf60e01b8152600490fd5b6122688161220c565b600281036122895760405163fce698f760e01b815260048101839052602490fd5b8061229560039261220c565b1461229d5750565b6040516335e2f38360e21b81526004810191909152602490fd5b5f806101b893602081519101845af43d156122f3573d916122d78361030f565b926122e560405194856102ed565b83523d5f602085013e61237d565b60609161237d565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612372579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611523575f516001600160a01b0381161561236857905f905f90565b505f906001905f90565b5050505f9160039190565b906123a4575080511561239257805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806123d7575b6123b5575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156123ad565b6123e8611c68565b80519081156123f8576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1005480156124255790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b612452611d4e565b8051908115612462576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015612425579056fea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.dbg.json b/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.json b/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.json new file mode 100644 index 00000000..140dbadf --- /dev/null +++ b/contracts/artifacts/contracts/InputVerifier.native.sol/InputVerifier.json @@ -0,0 +1,368 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "InputVerifier", + "sourceName": "contracts/InputVerifier.native.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": 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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "HANDLE_VERSION", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getKMSVerifierAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "kmsVerifier", + "outputs": [ + { + "internalType": "contract KMSVerifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "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": [], + "name": "renounceOwnership", + "outputs": [], + "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" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "internalType": "struct TFHEExecutor.ContextUserInputs", + "name": "context", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b6040516117e390816100d1823960805181818161044e01526105a70152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806303b031cf146100f45780630d8e6e2c146100ef5780634d52c107146100ea5780634f1ef286146100e557806352d1902d146100e05780636a8c8eb4146100db578063715018a6146100d657806379ba5097146100d15780638da5cb5b146100cc578063ad3cb1cc146100c7578063c4d66de8146100c2578063e30c3978146100bd578063f0ea684d146100b85763f2fde38b146100b3575f80fd5b61097e565b6100f4565b610939565b6107b5565b610758565b610713565b6106b1565b610611565b6105f7565b61058d565b61040d565b610383565b610180565b34610122575f366003190112610122576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b5f80fd5b5f5b8381106101375750505f910152565b8181015183820152602001610128565b9060209161016081518092818552858086019101610126565b601f01601f1916010190565b90602061017d928181520190610147565b90565b34610122575f3660031901126101225761026861020861025c6040516101a5816102a1565b600d815261024e602082017f496e707574566572696669657200000000000000000000000000000000000000815261024861023b6101e161142b565b60236101eb611467565b916101f461142b565b956040519a8b9951809260208c0190610126565b880161103b60f11b6020820152610229825180936020602285019101610126565b01601760f91b60228201520190610a25565b601760f91b815260010190565b90610a25565b03601f1981018352826102bd565b6040519182918261016c565b0390f35b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761029c57604052565b61026c565b6040810190811067ffffffffffffffff82111761029c57604052565b90601f8019910116810190811067ffffffffffffffff82111761029c57604052565b600435906001600160a01b038216820361012257565b602435906001600160a01b038216820361012257565b604435906001600160a01b038216820361012257565b67ffffffffffffffff811161029c57601f01601f191660200190565b81601f820112156101225780359061035482610321565b9261036260405194856102bd565b8284526020838301011161012257815f926020809301838601378301015290565b3461012257366003190160a0811261012257606013610122576040516103a881610280565b6103b06102df565b81526103ba6102f5565b60208201526103c761030b565b604082015260843567ffffffffffffffff811161012257610268916103f36103fd92369060040161033d565b9060643590610fc5565b6040519081529081906020820190565b6040366003190112610122576104216102df565b60243567ffffffffffffffff81116101225761044190369060040161033d565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561055f575b5061054d57602060049361048b611539565b6040516352d1902d60e01b8152948591829086165afa5f938161051c575b506104cf57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc830361050357610501925061163c565b005b604051632a87526960e21b815260048101849052602490fd5b61053f91945060203d602011610546575b61053781836102bd565b81019061152a565b925f6104a9565b503d61052d565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f610479565b34610122575f366003190112610122576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361054d5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b34610122575f3660031901126101225760206040515f8152f35b34610122575f36600319011261012257610629611539565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610122575f36600319011261012257336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036106fb576105013361156c565b60405163118cdaa760e01b8152336004820152602490fd5b34610122575f3660031901126101225760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b34610122575f36600319011261012257610268604051610777816102a1565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610147565b34610122576020366003190112610122576107ce6102df565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610931575b6001149081610927575b15908161091e575b5061090c577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff1916600117905561086590826108cb576115fa565b61086b57005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916680100000000000000001790556115fa565b60405163f92ee8a960e01b8152600490fd5b9050155f61081f565b303b159150610817565b83915061080d565b34610122575f3660031901126101225760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b34610122576020366003190112610122576109976102df565b61099f611539565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b90610a3860209282815194859201610126565b0190565b634e487b7160e01b5f52603260045260245ffd5b805115610a5d5760200190565b610a3c565b805160011015610a5d5760210190565b908151811015610a5d570160200190565b15610a8a57565b60405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b908160051b9180830460201490151715610af957565b610acf565b908160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610af957565b908160051b917f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610af957565b9081604102916041830403610af957565b6002019081600211610af957565b91908201809211610af957565b601f0390601f8211610af957565b91908203918211610af957565b15610bac57565b60405162461bcd60e51b815260206004820152601160248201527f57726f6e6720696e70757448616e646c650000000000000000000000000000006044820152606490fd5b15610bf857565b60405162461bcd60e51b815260206004820152601060248201527f456d70747920696e70757450726f6f66000000000000000000000000000000006044820152606490fd5b15610c4457565b60405162461bcd60e51b815260206004820152601e60248201527f4572726f7220646573657269616c697a696e6720696e70757450726f6f6600006044820152606490fd5b604051906080820182811067ffffffffffffffff82111761029c57604052604182526060366020840137565b60405190610cc2826102a1565b6001825260203681840137565b90610cd982610321565b610ce660405191826102bd565b8281528092610cf7601f1991610321565b0190602036910137565b67ffffffffffffffff811161029c5760051b60200190565b90610d2382610d01565b610d3060405191826102bd565b8281528092610d41601f1991610d01565b01905f5b828110610d5157505050565b806060602080938501015201610d45565b8051821015610a5d5760209160051b010190565b604051906080820182811067ffffffffffffffff82111761029c576040525f6060838281528260208201528260408201520152565b90816020910312610122575180151581036101225790565b9060a08201906001600160a01b03808251168452606060209260208101516020870152826040820151166040870152015116606084015260a06080840152835180925260c0830192602060c08460051b8301019501935f915b848310610e2c5750505050505090565b9091929394958480610e4a60019360bf198682030187528a51610147565b9801930193019194939290610e1c565b6040513d5f823e3d90fd5b15610e6c57565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820756e69717565204b4d5320696e707574207369676e60448201527f61747572657300000000000000000000000000000000000000000000000000006064820152608490fd5b15610ede57565b60405162461bcd60e51b815260206004820152601460248201527f57726f6e672068616e646c652076657273696f6e0000000000000000000000006044820152606490fd5b15610f2a57565b60405162461bcd60e51b815260206004820152602160248201527f57726f6e6720696e64657820666f722073657269616c697a65642068616e646c6044820152606560f81b6064820152608490fd5b15610f8057565b60405162461bcd60e51b815260206004820152601a60248201527f57726f6e672068616e646c6520696e20696e70757450726f6f660000000000006044820152606490fd5b9091602091828101610fde81516001600160a01b031690565b9260409161100d6040850195610ffb87516001600160a01b031690565b86516001600160a01b031691856114ba565b96909360ff9360109660ff8b60101c1696155f14611395579793815180151561103590610bf1565b61103e83610a50565b5160f81c9961104c84610a62565b5160f81c9161105c8a8d11610a83565b6110658c610b2e565b61106e90610b6f565b61107784610b5e565b61108091610b7d565b811161108b90610c3d565b6110948c610b2e565b61109d90610b6f565b6110a684610b5e565b6110af91610b7d565b90816110ba91610b98565b6110c381610ccf565b915f5b8281106113655750505090818780949351910120976110e483610d19565b925f5b8181106112a35750506111596111699161114c61113c6111849861112a61111d61110f610d76565b98516001600160a01b031690565b6001600160a01b03168852565b8d89880152516001600160a01b031690565b6001600160a01b03166040860152565b516001600160a01b031690565b6001600160a01b03166060830152565b60405163073371f960e11b8152938492839260048401610dc3565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1801561129e576111b5915f91611271575b50610e65565b5f5b8881106111d05750505050505050505061017d90611524565b80602260019260051b840101516111e988821615610ed7565b6111f88289838d1c1614610f23565b8451868101888152838a1660f81b7fff000000000000000000000000000000000000000000000000000000000000001660208201526112519161123e816021840161024e565b51902062ffffff19838116911614610f79565b888214611260575b50016111b7565b61126b908d14610ba5565b5f611259565b6112919150853d8711611297575b61128981836102bd565b810190610dab565b5f6111af565b503d61127f565b610e5a565b909193959294506112b2610c89565b6112bc8288610d62565b526112c78187610d62565b505f8e5b604182106112e4575050600101908894929593916110e7565b9061134561131f61131983611314611305611300600198610b2e565b610b6f565b61130e89610b5e565b90610b7d565b610b7d565b8b610a72565b517fff000000000000000000000000000000000000000000000000000000000000001690565b61135d82611353868c610d62565b51925f1a92610a72565b53018e6112cb565b8061137d61131f6113196001949a9e98999a86610b7d565b5f1a6113898287610a72565b530199959493996110c6565b5095505092955050508492506113c38460ff6113bc6113b661131f87610a50565b60f81c90565b1611610a83565b5f915f945b8286106113dd5750505061017d925014610ba5565b9193509160019061140c6114066113b661131f6114008a6113146113008a610ae3565b88610a72565b60ff1690565b61141d61141888610b8a565b610afe565b1b17940193918593916113c8565b5f611434610cb5565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908161143a57505090565b600180611472610cb5565b9160218301825b611484575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156114b557919082611479565b61147e565b61151c91605c9194939460405194859260208401976bffffffffffffffffffffffff199283809260601b168a5260601b16603485015260601b16604883015261150c8151809260208686019101610126565b810103603c8101845201826102bd565b519020805c91565b6001905d565b90816020910312610122575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300541633036106fb57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6116026116f2565b61160a6116f2565b6001600160a01b03811615611624576116229061156c565b565b604051631e4fbdf760e01b81525f6004820152602490fd5b90813b156116d1576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156116b6576116b391611733565b50565b5050346116bf57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561172157565b604051631afcd79f60e31b8152600490fd5b5f8061017d93602081519101845af43d1561176f573d9161175383610321565b9261176160405194856102bd565b83523d5f602085013e611773565b6060915b9061179a575080511561178857805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806117cd575b6117ab575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156117a356fea164736f6c6343000818000a", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c806303b031cf146100f45780630d8e6e2c146100ef5780634d52c107146100ea5780634f1ef286146100e557806352d1902d146100e05780636a8c8eb4146100db578063715018a6146100d657806379ba5097146100d15780638da5cb5b146100cc578063ad3cb1cc146100c7578063c4d66de8146100c2578063e30c3978146100bd578063f0ea684d146100b85763f2fde38b146100b3575f80fd5b61097e565b6100f4565b610939565b6107b5565b610758565b610713565b6106b1565b610611565b6105f7565b61058d565b61040d565b610383565b610180565b34610122575f366003190112610122576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b5f80fd5b5f5b8381106101375750505f910152565b8181015183820152602001610128565b9060209161016081518092818552858086019101610126565b601f01601f1916010190565b90602061017d928181520190610147565b90565b34610122575f3660031901126101225761026861020861025c6040516101a5816102a1565b600d815261024e602082017f496e707574566572696669657200000000000000000000000000000000000000815261024861023b6101e161142b565b60236101eb611467565b916101f461142b565b956040519a8b9951809260208c0190610126565b880161103b60f11b6020820152610229825180936020602285019101610126565b01601760f91b60228201520190610a25565b601760f91b815260010190565b90610a25565b03601f1981018352826102bd565b6040519182918261016c565b0390f35b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761029c57604052565b61026c565b6040810190811067ffffffffffffffff82111761029c57604052565b90601f8019910116810190811067ffffffffffffffff82111761029c57604052565b600435906001600160a01b038216820361012257565b602435906001600160a01b038216820361012257565b604435906001600160a01b038216820361012257565b67ffffffffffffffff811161029c57601f01601f191660200190565b81601f820112156101225780359061035482610321565b9261036260405194856102bd565b8284526020838301011161012257815f926020809301838601378301015290565b3461012257366003190160a0811261012257606013610122576040516103a881610280565b6103b06102df565b81526103ba6102f5565b60208201526103c761030b565b604082015260843567ffffffffffffffff811161012257610268916103f36103fd92369060040161033d565b9060643590610fc5565b6040519081529081906020820190565b6040366003190112610122576104216102df565b60243567ffffffffffffffff81116101225761044190369060040161033d565b906001600160a01b0391827f00000000000000000000000000000000000000000000000000000000000000001680301490811561055f575b5061054d57602060049361048b611539565b6040516352d1902d60e01b8152948591829086165afa5f938161051c575b506104cf57604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc830361050357610501925061163c565b005b604051632a87526960e21b815260048101849052602490fd5b61053f91945060203d602011610546575b61053781836102bd565b81019061152a565b925f6104a9565b503d61052d565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f610479565b34610122575f366003190112610122576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361054d5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b34610122575f3660031901126101225760206040515f8152f35b34610122575f36600319011261012257610629611539565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610122575f36600319011261012257336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036106fb576105013361156c565b60405163118cdaa760e01b8152336004820152602490fd5b34610122575f3660031901126101225760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b34610122575f36600319011261012257610268604051610777816102a1565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610147565b34610122576020366003190112610122576107ce6102df565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549067ffffffffffffffff60ff8360401c1615921680159081610931575b6001149081610927575b15908161091e575b5061090c577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805467ffffffffffffffff1916600117905561086590826108cb576115fa565b61086b57005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916680100000000000000001790556115fa565b60405163f92ee8a960e01b8152600490fd5b9050155f61081f565b303b159150610817565b83915061080d565b34610122575f3660031901126101225760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b34610122576020366003190112610122576109976102df565b61099f611539565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b90610a3860209282815194859201610126565b0190565b634e487b7160e01b5f52603260045260245ffd5b805115610a5d5760200190565b610a3c565b805160011015610a5d5760210190565b908151811015610a5d570160200190565b15610a8a57565b60405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420696e646578000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b908160051b9180830460201490151715610af957565b610acf565b908160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610af957565b908160051b917f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603610af957565b9081604102916041830403610af957565b6002019081600211610af957565b91908201809211610af957565b601f0390601f8211610af957565b91908203918211610af957565b15610bac57565b60405162461bcd60e51b815260206004820152601160248201527f57726f6e6720696e70757448616e646c650000000000000000000000000000006044820152606490fd5b15610bf857565b60405162461bcd60e51b815260206004820152601060248201527f456d70747920696e70757450726f6f66000000000000000000000000000000006044820152606490fd5b15610c4457565b60405162461bcd60e51b815260206004820152601e60248201527f4572726f7220646573657269616c697a696e6720696e70757450726f6f6600006044820152606490fd5b604051906080820182811067ffffffffffffffff82111761029c57604052604182526060366020840137565b60405190610cc2826102a1565b6001825260203681840137565b90610cd982610321565b610ce660405191826102bd565b8281528092610cf7601f1991610321565b0190602036910137565b67ffffffffffffffff811161029c5760051b60200190565b90610d2382610d01565b610d3060405191826102bd565b8281528092610d41601f1991610d01565b01905f5b828110610d5157505050565b806060602080938501015201610d45565b8051821015610a5d5760209160051b010190565b604051906080820182811067ffffffffffffffff82111761029c576040525f6060838281528260208201528260408201520152565b90816020910312610122575180151581036101225790565b9060a08201906001600160a01b03808251168452606060209260208101516020870152826040820151166040870152015116606084015260a06080840152835180925260c0830192602060c08460051b8301019501935f915b848310610e2c5750505050505090565b9091929394958480610e4a60019360bf198682030187528a51610147565b9801930193019194939290610e1c565b6040513d5f823e3d90fd5b15610e6c57565b60405162461bcd60e51b815260206004820152602660248201527f4e6f7420656e6f75676820756e69717565204b4d5320696e707574207369676e60448201527f61747572657300000000000000000000000000000000000000000000000000006064820152608490fd5b15610ede57565b60405162461bcd60e51b815260206004820152601460248201527f57726f6e672068616e646c652076657273696f6e0000000000000000000000006044820152606490fd5b15610f2a57565b60405162461bcd60e51b815260206004820152602160248201527f57726f6e6720696e64657820666f722073657269616c697a65642068616e646c6044820152606560f81b6064820152608490fd5b15610f8057565b60405162461bcd60e51b815260206004820152601a60248201527f57726f6e672068616e646c6520696e20696e70757450726f6f660000000000006044820152606490fd5b9091602091828101610fde81516001600160a01b031690565b9260409161100d6040850195610ffb87516001600160a01b031690565b86516001600160a01b031691856114ba565b96909360ff9360109660ff8b60101c1696155f14611395579793815180151561103590610bf1565b61103e83610a50565b5160f81c9961104c84610a62565b5160f81c9161105c8a8d11610a83565b6110658c610b2e565b61106e90610b6f565b61107784610b5e565b61108091610b7d565b811161108b90610c3d565b6110948c610b2e565b61109d90610b6f565b6110a684610b5e565b6110af91610b7d565b90816110ba91610b98565b6110c381610ccf565b915f5b8281106113655750505090818780949351910120976110e483610d19565b925f5b8181106112a35750506111596111699161114c61113c6111849861112a61111d61110f610d76565b98516001600160a01b031690565b6001600160a01b03168852565b8d89880152516001600160a01b031690565b6001600160a01b03166040860152565b516001600160a01b031690565b6001600160a01b03166060830152565b60405163073371f960e11b8152938492839260048401610dc3565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1801561129e576111b5915f91611271575b50610e65565b5f5b8881106111d05750505050505050505061017d90611524565b80602260019260051b840101516111e988821615610ed7565b6111f88289838d1c1614610f23565b8451868101888152838a1660f81b7fff000000000000000000000000000000000000000000000000000000000000001660208201526112519161123e816021840161024e565b51902062ffffff19838116911614610f79565b888214611260575b50016111b7565b61126b908d14610ba5565b5f611259565b6112919150853d8711611297575b61128981836102bd565b810190610dab565b5f6111af565b503d61127f565b610e5a565b909193959294506112b2610c89565b6112bc8288610d62565b526112c78187610d62565b505f8e5b604182106112e4575050600101908894929593916110e7565b9061134561131f61131983611314611305611300600198610b2e565b610b6f565b61130e89610b5e565b90610b7d565b610b7d565b8b610a72565b517fff000000000000000000000000000000000000000000000000000000000000001690565b61135d82611353868c610d62565b51925f1a92610a72565b53018e6112cb565b8061137d61131f6113196001949a9e98999a86610b7d565b5f1a6113898287610a72565b530199959493996110c6565b5095505092955050508492506113c38460ff6113bc6113b661131f87610a50565b60f81c90565b1611610a83565b5f915f945b8286106113dd5750505061017d925014610ba5565b9193509160019061140c6114066113b661131f6114008a6113146113008a610ae3565b88610a72565b60ff1690565b61141d61141888610b8a565b610afe565b1b17940193918593916113c8565b5f611434610cb5565b90602182015b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908161143a57505090565b600180611472610cb5565b9160218301825b611484575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156114b557919082611479565b61147e565b61151c91605c9194939460405194859260208401976bffffffffffffffffffffffff199283809260601b168a5260601b16603485015260601b16604883015261150c8151809260208686019101610126565b810103603c8101845201826102bd565b519020805c91565b6001905d565b90816020910312610122575190565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300541633036106fb57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6116026116f2565b61160a6116f2565b6001600160a01b03811615611624576116229061156c565b565b604051631e4fbdf760e01b81525f6004820152602490fd5b90813b156116d1576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156116b6576116b391611733565b50565b5050346116bf57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561172157565b604051631afcd79f60e31b8152600490fd5b5f8061017d93602081519101845af43d1561176f573d9161175383610321565b9261176160405194856102bd565b83523d5f602085013e611773565b6060915b9061179a575080511561178857805190602001fd5b60405163d6bda27560e01b8152600490fd5b815115806117cd575b6117ab575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156117a356fea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.dbg.json b/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.json b/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.json new file mode 100644 index 00000000..b8cb5576 --- /dev/null +++ b/contracts/artifacts/contracts/KMSVerifier.sol/KMSVerifier.json @@ -0,0 +1,575 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "KMSVerifier", + "sourceName": "contracts/KMSVerifier.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + } + ], + "name": "AddressEmptyCode", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "ECDSAInvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "ECDSAInvalidSignatureS", + "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": [], + "name": "EIP712DomainChanged", + "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": "signer", + "type": "address" + } + ], + "name": "SignerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "SignerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "CIPHERTEXTVERIFICATION_KMS_TYPE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "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": "signer", + "type": "address" + } + ], + "name": "addSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSigners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "get_CIPHERTEXTVERIFICATION_KMS_TYPE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "get_DECRYPTIONRESULT_TYPE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "isSigner", + "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": "signer", + "type": "address" + } + ], + "name": "removeSigner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "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" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "handlesList", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "decryptedResult", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "name": "verifyDecryptionEIP712KMSSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "hashOfCiphertext", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "internalType": "struct KMSVerifier.CiphertextVerificationForKMS", + "name": "cv", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "name": "verifyInputEIP712KMSSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161226c90816100d18239608051818181610ee50152610f800152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe60406080815260049081361015610014575f80fd5b5f3560e01c9182630d8e6e2c1461128c5782630e316ab7146112635782630e66e3f2146111815782631994b168146103bd5782634f1ef28614610f4157826352d1902d14610eca578263715018a614610e2a57826379ba509714610dc85782637df73e2714610d6d57826384b0196e14610c0d5782638da5cb5b14610bc757826392bacce414610baa57826394cf795e14610ac9578263ad3cb1cc14610a6d578263c4d66de8146105cf578263dd66628714610437578263e30c3978146103f1578263e6c51123146103bd578263e75235b814610380578263eb12d61e146101b157505063f2fde38b14610106575f80fd5b346101ad5760203660031901126101ad5761011f611496565b6101276119b5565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b346101ad5760203660031901126101ad576101ca611496565b906101d36119b5565b6001600160a01b03821692831561033d57835f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89008060205260ff825f2054166102d457845f526020525f20600160ff198254161790557f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901805491680100000000000000008310156102c15750816102749160016102939594019055611714565b9091906001600160a01b038084549260031b9316831b921b1916179055565b61029b611a00565b7f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f245f80a2005b604190634e487b7160e01b5f525260245ffd5b815162461bcd60e51b8152602081850152602860248201527f4b4d5356657269666965723a204164647265737320697320616c72656164792060448201527f61207369676e65720000000000000000000000000000000000000000000000006064820152608490fd5b906020606492519162461bcd60e51b8352820152601c60248201527f4b4d5356657269666965723a2041646472657373206973206e756c6c000000006044820152fd5b50346101ad575f3660031901126101ad576020907f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8902549051908152f35b50346101ad575f3660031901126101ad576103ed906103da611630565b9051918291602083526020830190611471565b0390f35b50346101ad575f3660031901126101ad576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b90346101ad5760803660031901126101ad57610451611496565b906024359267ffffffffffffffff908185116101ad57366023860112156101ad57848101359361048085611536565b9561048d85519788611514565b85875260209560248789019160051b830101913683116101ad576024889101915b8383106105bf57505050506044358381116101ad576104d0903690840161156a565b906064358481116101ad576104e890369085016115b0565b938551936060850191858310908311176102c15750855285830191858401976001600160a01b0380931685528352875261052061191f565b86815191012092511690519584518681019081888a51919a01905f5b8181106105ab575050509161059d9391836105656105a29897958c03601f198101835282611514565b519020905188815191012090875192898401948552888401526060830152608082015260808152610595816114f8565b519020611f15565b611a74565b90519015158152f35b82518c529a8a019a918a019160010161053c565b82358152918101918891016104ae565b346101ad57602090816003193601126101ad576105ea611496565b927ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009384549260ff84841c16159167ffffffffffffffff9081861695861580610a66575b60018098149081610a5c575b159081610a53575b50610a435767ffffffffffffffff1981168717895584610a24575b50610666611fc2565b61066e611fc2565b6001600160a01b03811615610a0e5761068690611ca8565b61068e6116db565b84519261069a846114dc565b868452603160f81b888501526106ae611fc2565b6106b6611fc2565b81518381116109fb577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10290806106ec8354611d36565b948b601f9687811161098c575b50508b9086831160011461090d575f92610902575b50505f19600383901b1c191690891b1790555b83519283116102c1575081907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103936107598554611d36565b828111610894575b5088918311600114610817575f9261080c575b50505f19600383901b1c191690851b1790555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101556107d357005b7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29368ff000000000000000019815416905551908152a1005b015190508880610774565b90879350601f19831691855f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75925f5b8b82821061087e5750508411610866575b505050811b019055610787565b01515f1960f88460031b161c19169055888080610859565b8385015186558b97909501949384019301610848565b90919250845f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b758380860160051c8201928b87106108f9575b9186958b929594930160051c01915b8281106108eb575050610761565b5f81558695508a91016108dd565b925081926108ce565b015190508c8061070e565b5f8581528c94507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d929190601f198516908f5b828210610975575050841161095d575b505050811b019055610721565b01515f1960f88460031b161c191690558c8080610950565b8385015186558f979095019493840193018f610940565b90919250845f52867f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9181860160051c83019386106109f2575b918d91869594930160051c01915b8281106109e457508d91506106f9565b5f81558594508d91016109d4565b925081926109c6565b604182634e487b7160e01b5f525260245ffd5b8451631e4fbdf760e01b81525f81850152602490fd5b68ffffffffffffffffff1916680100000000000000011788558861065d565b855163f92ee8a960e01b81528490fd5b9050158a610642565b303b15915061063a565b508461062e565b50346101ad575f3660031901126101ad5780516103ed91610a8d826114dc565b600582527f352e302e30000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190611471565b50346101ad575f3660031901126101ad57805190817f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890190815480825260208092019081935f527f145a8827e9bfba2e12db7e3125e9c7a45032a77e46e5b19a76bb8dfdf3b3ce36905f5b818110610b8d5750505084610b49910385611514565b825181815293518185018190528493840192915f5b828110610b6d57505050500390f35b83516001600160a01b031685528695509381019392810192600101610b5e565b82546001600160a01b031684529284019260019283019201610b33565b50346101ad575f3660031901126101ad576103ed906103da61191f565b50346101ad575f3660031901126101ad576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b346101ad575f3660031901126101ad577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610d44575b15610d0257610c53611d6e565b91610c5c611e56565b815191602091602084019484861067ffffffffffffffff8711176102c15750610cb78260209287610caa99989795525f85528151988998600f60f81b8a5260e0868b015260e08a0190611471565b9188830390890152611471565b914660608701523060808701525f60a087015285830360c087015251918281520192915f5b828110610ceb57505050500390f35b835185528695509381019392810192600101610cdc565b6020606492519162461bcd60e51b8352820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415610c46565b50346101ad5760203660031901126101ad576020906001600160a01b03610d92611496565b165f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8900825260ff815f20541690519015158152f35b346101ad575f3660031901126101ad57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00541603610e1457610e1233611ca8565b005b602491519063118cdaa760e01b82523390820152fd5b346101ad575f3660031901126101ad57610e426119b5565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b90346101ad575f3660031901126101ad576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f3457602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b816003193601126101ad57610f54611496565b9160243567ffffffffffffffff81116101ad57610f74903690840161156a565b906001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115611153575b5061114357610fb86119b5565b8416918151946352d1902d60e01b865260209081878781885afa5f9781611114575b50610ff6578351634c9c8ce360e01b8152808701869052602490fd5b919490937f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc877fc9f76b5ec45e5cdef99837d7b6d2467235c1df8933c8ca56df5c35afa2c7d44481016110fe5750833b156110e757816001600160a01b03198254161790558351907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28551156110ce5750505f808585610e1297519101845af4913d156110c4573d6110b66110ad8261154e565b92519283611514565b81525f81943d92013e6120c0565b50606092506120c0565b935093505050346110db57005b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9097508281813d831161113c575b61112c8183611514565b810103126101ad57519688610fda565b503d611122565b815163703e46dd60e11b81528490fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141586610fab565b90346101ad57366003190160a081126101ad576080136101ad5780519167ffffffffffffffff9060808401828111858210176109fb5783526111c1611496565b845260208401906024358252604435946001600160a01b039283871687036101ad578582019687526064359684881688036101ad57606083019788526084359586116101ad5760209761121d61059d956105a2983691016115b0565b958080611228611630565b8c81519101209651169451935116915116918851938a8501958652898501526060840152608083015260a082015260a08152610595816114ac565b346101ad5760203660031901126101ad57610e1261127f611496565b6112876119b5565b61177b565b346101ad575f3660031901126101ad576112a46116db565b915f918151936112b3856114dc565b6001808652602094858701908636833760218801835b611421575b505090808551916112de836114dc565b818352878301908836833760218401835b6113e4575b50505f93875192611304846114dc565b808452898401958a36883760218501825b6113ae575b505050875199868b975190818c808b0192019161133692611450565b8701908a820161103b60f11b90525191826022830161135492611450565b01601760f91b938460228301525191826023830161137192611450565b019160238301525191826024830161138892611450565b0103908101845260240161139c9084611514565b5191818392835282016103ed91611471565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156113df57919082611315565b61131a565b9294925f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908582156114185793956112ef565b509492946112f4565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049083826112c957506112ce565b5f5b8381106114615750505f910152565b8181015183820152602001611452565b9060209161148a81518092818552858086019101611450565b601f01601f1916010190565b600435906001600160a01b03821682036101ad57565b60c0810190811067ffffffffffffffff8211176114c857604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176114c857604052565b60a0810190811067ffffffffffffffff8211176114c857604052565b90601f8019910116810190811067ffffffffffffffff8211176114c857604052565b67ffffffffffffffff81116114c85760051b60200190565b67ffffffffffffffff81116114c857601f01601f191660200190565b81601f820112156101ad578035906115818261154e565b9261158f6040519485611514565b828452602083830101116101ad57815f926020809301838601378301015290565b81601f820112156101ad578035916020916115ca84611536565b936115d86040519586611514565b808552838086019160051b830101928084116101ad57848301915b8483106116035750505050505090565b823567ffffffffffffffff81116101ad5786916116258484809489010161156a565b8152019201916115f3565b6040519061163d826114f8565b607582527f7265737320636f6e7472616374416464726573732900000000000000000000006080837f43697068657274657874566572696669636174696f6e466f724b4d532861646460208201527f726573732061636c416464726573732c6279746573333220686173684f66436960408201527f70686572746578742c616464726573732075736572416464726573732c61646460608201520152565b604051906116e8826114dc565b600b82527f4b4d5356657269666965720000000000000000000000000000000000000000006020830152565b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89018054821015611767575f527f145a8827e9bfba2e12db7e3125e9c7a45032a77e46e5b19a76bb8dfdf3b3ce3601905f90565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b03809116805f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89008060205260ff60405f205416156118ce57815f5260205260405f2060ff1981541690555f5b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901805490818310156118c75784918461180785611714565b949054600395861b1c1614611821575050506001016117cf565b9394919390925f1991808301919082116118b3576102748461184561185294611714565b905490891b1c1691611714565b8254801561189f57019261186584611714565b81939154921b1b1916905555611879611a00565b7f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b5f80a2565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5050505050565b60405162461bcd60e51b8152602060048201526024808201527f4b4d5356657269666965723a2041646472657373206973206e6f74206120736960448201526333b732b960e11b6064820152608490fd5b604051906080820182811067ffffffffffffffff8211176114c857604052605082527f646563727970746564526573756c7429000000000000000000000000000000006060837f44656372797074696f6e526573756c7428616464726573732061636c4164647260208201527f6573732c75696e743235365b5d2068616e646c65734c6973742c62797465732060408201520152565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300541633036119e857565b60405163118cdaa760e01b8152336004820152602490fd5b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901545f1981019081116118b35760039004600181018091116118b3577f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890255565b80518210156117675760209160051b010190565b908051918215611c57577f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890254808410611bec57611ab084611536565b91604090611ac16040519485611514565b858452611acd86611536565b60209190601f190136868401375f955f5b888110611af957505050505050611af59250611f95565b5f90565b611b19611b10611b098385611a60565b5185612003565b9092919261203d565b6001600160a01b038116805f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8900865260ff875f20541615611ba857815c15611b84575b505085881015611b6f57600101611ade565b505050505050611b7f9250611f95565b600190565b611b918a8a9b939b611a60565b525f1981146118b3576001809101985d5f80611b5d565b865162461bcd60e51b815260048101879052601f60248201527f4b6d7356657269666965723a20496e76616c6964204b4d53207369676e6572006044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f4b6d7356657269666965723a206174206c65617374207468726573686f6c642060448201527f6e756d626572206f66207369676e6174757265732072657175697265640000006064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f4b6d7356657269666965723a206e6f207369676e6174757265732070726f766960448201526219195960ea1b6064820152608490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b90600182811c92168015611d64575b6020831014611d5057565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611d45565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10291825492611da284611d36565b80845293602091600191828116908115611e305750600114611dd0575b505050611dce92500383611514565b565b5f9081527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9590935091905b828410611e185750611dce9450505081016020015f8080611dbf565b85548885018301529485019487945092810192611dfc565b9250505060209250611dce94915060ff191682840152151560051b8201015f8080611dbf565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10391825492611e8a84611d36565b80845293602091600191828116908115611e305750600114611eb557505050611dce92500383611514565b5f9081527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b759590935091905b828410611efd5750611dce9450505081016020015f8080611dbf565b85548885018301529485019487945092810192611ee1565b604290611f20612123565b611f2861218d565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611f77816114ac565b519020906040519161190160f01b8352600283015260228201522090565b5f5b828110611fa357505050565b805f6001600160a01b03611fb960019486611a60565b51165d01611f97565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611ff157565b604051631afcd79f60e31b8152600490fd5b81519190604183036120335761202c9250602082015190606060408401519301515f1a906121d2565b9192909190565b50505f9160029190565b60048110156120ac578061204f575050565b600181036120695760405163f645eedf60e01b8152600490fd5b6002810361208a5760405163fce698f760e01b815260048101839052602490fd5b6003146120945750565b602490604051906335e2f38360e21b82526004820152fd5b634e487b7160e01b5f52602160045260245ffd5b906120e757508051156120d557805190602001fd5b60405163d6bda27560e01b8152600490fd5b8151158061211a575b6120f8575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156120f0565b61212b611d6e565b805190811561213b576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1005480156121685790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b612195611e56565b80519081156121a5576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015480156121685790565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612254579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612249575f516001600160a01b0381161561223f57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c6343000818000a", + "deployedBytecode": "0x60406080815260049081361015610014575f80fd5b5f3560e01c9182630d8e6e2c1461128c5782630e316ab7146112635782630e66e3f2146111815782631994b168146103bd5782634f1ef28614610f4157826352d1902d14610eca578263715018a614610e2a57826379ba509714610dc85782637df73e2714610d6d57826384b0196e14610c0d5782638da5cb5b14610bc757826392bacce414610baa57826394cf795e14610ac9578263ad3cb1cc14610a6d578263c4d66de8146105cf578263dd66628714610437578263e30c3978146103f1578263e6c51123146103bd578263e75235b814610380578263eb12d61e146101b157505063f2fde38b14610106575f80fd5b346101ad5760203660031901126101ad5761011f611496565b6101276119b5565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b346101ad5760203660031901126101ad576101ca611496565b906101d36119b5565b6001600160a01b03821692831561033d57835f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89008060205260ff825f2054166102d457845f526020525f20600160ff198254161790557f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901805491680100000000000000008310156102c15750816102749160016102939594019055611714565b9091906001600160a01b038084549260031b9316831b921b1916179055565b61029b611a00565b7f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f245f80a2005b604190634e487b7160e01b5f525260245ffd5b815162461bcd60e51b8152602081850152602860248201527f4b4d5356657269666965723a204164647265737320697320616c72656164792060448201527f61207369676e65720000000000000000000000000000000000000000000000006064820152608490fd5b906020606492519162461bcd60e51b8352820152601c60248201527f4b4d5356657269666965723a2041646472657373206973206e756c6c000000006044820152fd5b50346101ad575f3660031901126101ad576020907f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8902549051908152f35b50346101ad575f3660031901126101ad576103ed906103da611630565b9051918291602083526020830190611471565b0390f35b50346101ad575f3660031901126101ad576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b90346101ad5760803660031901126101ad57610451611496565b906024359267ffffffffffffffff908185116101ad57366023860112156101ad57848101359361048085611536565b9561048d85519788611514565b85875260209560248789019160051b830101913683116101ad576024889101915b8383106105bf57505050506044358381116101ad576104d0903690840161156a565b906064358481116101ad576104e890369085016115b0565b938551936060850191858310908311176102c15750855285830191858401976001600160a01b0380931685528352875261052061191f565b86815191012092511690519584518681019081888a51919a01905f5b8181106105ab575050509161059d9391836105656105a29897958c03601f198101835282611514565b519020905188815191012090875192898401948552888401526060830152608082015260808152610595816114f8565b519020611f15565b611a74565b90519015158152f35b82518c529a8a019a918a019160010161053c565b82358152918101918891016104ae565b346101ad57602090816003193601126101ad576105ea611496565b927ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009384549260ff84841c16159167ffffffffffffffff9081861695861580610a66575b60018098149081610a5c575b159081610a53575b50610a435767ffffffffffffffff1981168717895584610a24575b50610666611fc2565b61066e611fc2565b6001600160a01b03811615610a0e5761068690611ca8565b61068e6116db565b84519261069a846114dc565b868452603160f81b888501526106ae611fc2565b6106b6611fc2565b81518381116109fb577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10290806106ec8354611d36565b948b601f9687811161098c575b50508b9086831160011461090d575f92610902575b50505f19600383901b1c191690891b1790555b83519283116102c1575081907fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103936107598554611d36565b828111610894575b5088918311600114610817575f9261080c575b50505f19600383901b1c191690851b1790555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101556107d357005b7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29368ff000000000000000019815416905551908152a1005b015190508880610774565b90879350601f19831691855f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75925f5b8b82821061087e5750508411610866575b505050811b019055610787565b01515f1960f88460031b161c19169055888080610859565b8385015186558b97909501949384019301610848565b90919250845f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b758380860160051c8201928b87106108f9575b9186958b929594930160051c01915b8281106108eb575050610761565b5f81558695508a91016108dd565b925081926108ce565b015190508c8061070e565b5f8581528c94507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d929190601f198516908f5b828210610975575050841161095d575b505050811b019055610721565b01515f1960f88460031b161c191690558c8080610950565b8385015186558f979095019493840193018f610940565b90919250845f52867f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9181860160051c83019386106109f2575b918d91869594930160051c01915b8281106109e457508d91506106f9565b5f81558594508d91016109d4565b925081926109c6565b604182634e487b7160e01b5f525260245ffd5b8451631e4fbdf760e01b81525f81850152602490fd5b68ffffffffffffffffff1916680100000000000000011788558861065d565b855163f92ee8a960e01b81528490fd5b9050158a610642565b303b15915061063a565b508461062e565b50346101ad575f3660031901126101ad5780516103ed91610a8d826114dc565b600582527f352e302e30000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190611471565b50346101ad575f3660031901126101ad57805190817f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890190815480825260208092019081935f527f145a8827e9bfba2e12db7e3125e9c7a45032a77e46e5b19a76bb8dfdf3b3ce36905f5b818110610b8d5750505084610b49910385611514565b825181815293518185018190528493840192915f5b828110610b6d57505050500390f35b83516001600160a01b031685528695509381019392810192600101610b5e565b82546001600160a01b031684529284019260019283019201610b33565b50346101ad575f3660031901126101ad576103ed906103da61191f565b50346101ad575f3660031901126101ad576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b346101ad575f3660031901126101ad577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580610d44575b15610d0257610c53611d6e565b91610c5c611e56565b815191602091602084019484861067ffffffffffffffff8711176102c15750610cb78260209287610caa99989795525f85528151988998600f60f81b8a5260e0868b015260e08a0190611471565b9188830390890152611471565b914660608701523060808701525f60a087015285830360c087015251918281520192915f5b828110610ceb57505050500390f35b835185528695509381019392810192600101610cdc565b6020606492519162461bcd60e51b8352820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415610c46565b50346101ad5760203660031901126101ad576020906001600160a01b03610d92611496565b165f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8900825260ff815f20541690519015158152f35b346101ad575f3660031901126101ad57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00541603610e1457610e1233611ca8565b005b602491519063118cdaa760e01b82523390820152fd5b346101ad575f3660031901126101ad57610e426119b5565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b90346101ad575f3660031901126101ad576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f3457602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b816003193601126101ad57610f54611496565b9160243567ffffffffffffffff81116101ad57610f74903690840161156a565b906001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115611153575b5061114357610fb86119b5565b8416918151946352d1902d60e01b865260209081878781885afa5f9781611114575b50610ff6578351634c9c8ce360e01b8152808701869052602490fd5b919490937f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc877fc9f76b5ec45e5cdef99837d7b6d2467235c1df8933c8ca56df5c35afa2c7d44481016110fe5750833b156110e757816001600160a01b03198254161790558351907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28551156110ce5750505f808585610e1297519101845af4913d156110c4573d6110b66110ad8261154e565b92519283611514565b81525f81943d92013e6120c0565b50606092506120c0565b935093505050346110db57005b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9097508281813d831161113c575b61112c8183611514565b810103126101ad57519688610fda565b503d611122565b815163703e46dd60e11b81528490fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141586610fab565b90346101ad57366003190160a081126101ad576080136101ad5780519167ffffffffffffffff9060808401828111858210176109fb5783526111c1611496565b845260208401906024358252604435946001600160a01b039283871687036101ad578582019687526064359684881688036101ad57606083019788526084359586116101ad5760209761121d61059d956105a2983691016115b0565b958080611228611630565b8c81519101209651169451935116915116918851938a8501958652898501526060840152608083015260a082015260a08152610595816114ac565b346101ad5760203660031901126101ad57610e1261127f611496565b6112876119b5565b61177b565b346101ad575f3660031901126101ad576112a46116db565b915f918151936112b3856114dc565b6001808652602094858701908636833760218801835b611421575b505090808551916112de836114dc565b818352878301908836833760218401835b6113e4575b50505f93875192611304846114dc565b808452898401958a36883760218501825b6113ae575b505050875199868b975190818c808b0192019161133692611450565b8701908a820161103b60f11b90525191826022830161135492611450565b01601760f91b938460228301525191826023830161137192611450565b019160238301525191826024830161138892611450565b0103908101845260240161139c9084611514565b5191818392835282016103ed91611471565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156113df57919082611315565b61131a565b9294925f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304908582156114185793956112ef565b509492946112f4565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049083826112c957506112ce565b5f5b8381106114615750505f910152565b8181015183820152602001611452565b9060209161148a81518092818552858086019101611450565b601f01601f1916010190565b600435906001600160a01b03821682036101ad57565b60c0810190811067ffffffffffffffff8211176114c857604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176114c857604052565b60a0810190811067ffffffffffffffff8211176114c857604052565b90601f8019910116810190811067ffffffffffffffff8211176114c857604052565b67ffffffffffffffff81116114c85760051b60200190565b67ffffffffffffffff81116114c857601f01601f191660200190565b81601f820112156101ad578035906115818261154e565b9261158f6040519485611514565b828452602083830101116101ad57815f926020809301838601378301015290565b81601f820112156101ad578035916020916115ca84611536565b936115d86040519586611514565b808552838086019160051b830101928084116101ad57848301915b8483106116035750505050505090565b823567ffffffffffffffff81116101ad5786916116258484809489010161156a565b8152019201916115f3565b6040519061163d826114f8565b607582527f7265737320636f6e7472616374416464726573732900000000000000000000006080837f43697068657274657874566572696669636174696f6e466f724b4d532861646460208201527f726573732061636c416464726573732c6279746573333220686173684f66436960408201527f70686572746578742c616464726573732075736572416464726573732c61646460608201520152565b604051906116e8826114dc565b600b82527f4b4d5356657269666965720000000000000000000000000000000000000000006020830152565b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89018054821015611767575f527f145a8827e9bfba2e12db7e3125e9c7a45032a77e46e5b19a76bb8dfdf3b3ce3601905f90565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b03809116805f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce89008060205260ff60405f205416156118ce57815f5260205260405f2060ff1981541690555f5b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901805490818310156118c75784918461180785611714565b949054600395861b1c1614611821575050506001016117cf565b9394919390925f1991808301919082116118b3576102748461184561185294611714565b905490891b1c1691611714565b8254801561189f57019261186584611714565b81939154921b1b1916905555611879611a00565b7f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b5f80a2565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5050505050565b60405162461bcd60e51b8152602060048201526024808201527f4b4d5356657269666965723a2041646472657373206973206e6f74206120736960448201526333b732b960e11b6064820152608490fd5b604051906080820182811067ffffffffffffffff8211176114c857604052605082527f646563727970746564526573756c7429000000000000000000000000000000006060837f44656372797074696f6e526573756c7428616464726573732061636c4164647260208201527f6573732c75696e743235365b5d2068616e646c65734c6973742c62797465732060408201520152565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300541633036119e857565b60405163118cdaa760e01b8152336004820152602490fd5b7f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8901545f1981019081116118b35760039004600181018091116118b3577f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890255565b80518210156117675760209160051b010190565b908051918215611c57577f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce890254808410611bec57611ab084611536565b91604090611ac16040519485611514565b858452611acd86611536565b60209190601f190136868401375f955f5b888110611af957505050505050611af59250611f95565b5f90565b611b19611b10611b098385611a60565b5185612003565b9092919261203d565b6001600160a01b038116805f527f7e81a744be86773af8644dd7304fa1dc9350ccabf16cfcaa614ddb78b4ce8900865260ff875f20541615611ba857815c15611b84575b505085881015611b6f57600101611ade565b505050505050611b7f9250611f95565b600190565b611b918a8a9b939b611a60565b525f1981146118b3576001809101985d5f80611b5d565b865162461bcd60e51b815260048101879052601f60248201527f4b6d7356657269666965723a20496e76616c6964204b4d53207369676e6572006044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f4b6d7356657269666965723a206174206c65617374207468726573686f6c642060448201527f6e756d626572206f66207369676e6174757265732072657175697265640000006064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f4b6d7356657269666965723a206e6f207369676e6174757265732070726f766960448201526219195960ea1b6064820152608490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b90600182811c92168015611d64575b6020831014611d5057565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611d45565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10291825492611da284611d36565b80845293602091600191828116908115611e305750600114611dd0575b505050611dce92500383611514565b565b5f9081527f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d9590935091905b828410611e185750611dce9450505081016020015f8080611dbf565b85548885018301529485019487945092810192611dfc565b9250505060209250611dce94915060ff191682840152151560051b8201015f8080611dbf565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10391825492611e8a84611d36565b80845293602091600191828116908115611e305750600114611eb557505050611dce92500383611514565b5f9081527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b759590935091905b828410611efd5750611dce9450505081016020015f8080611dbf565b85548885018301529485019487945092810192611ee1565b604290611f20612123565b611f2861218d565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a08152611f77816114ac565b519020906040519161190160f01b8352600283015260228201522090565b5f5b828110611fa357505050565b805f6001600160a01b03611fb960019486611a60565b51165d01611f97565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611ff157565b604051631afcd79f60e31b8152600490fd5b81519190604183036120335761202c9250602082015190606060408401519301515f1a906121d2565b9192909190565b50505f9160029190565b60048110156120ac578061204f575050565b600181036120695760405163f645eedf60e01b8152600490fd5b6002810361208a5760405163fce698f760e01b815260048101839052602490fd5b6003146120945750565b602490604051906335e2f38360e21b82526004820152fd5b634e487b7160e01b5f52602160045260245ffd5b906120e757508051156120d557805190602001fd5b60405163d6bda27560e01b8152600490fd5b8151158061211a575b6120f8575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156120f0565b61212b611d6e565b805190811561213b576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1005480156121685790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b612195611e56565b80519081156121a5576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015480156121685790565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411612254579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15612249575f516001600160a01b0381161561223f57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.dbg.json b/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.json b/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.json new file mode 100644 index 00000000..515bebd5 --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutor.sol/IInputVerifier.json @@ -0,0 +1,57 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IInputVerifier", + "sourceName": "contracts/TFHEExecutor.sol", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "contractAddress", + "type": "address" + } + ], + "internalType": "struct TFHEExecutor.ContextUserInputs", + "name": "context", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.dbg.json b/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.json b/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.json new file mode 100644 index 00000000..989b3a18 --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutor.sol/TFHEExecutor.json @@ -0,0 +1,1189 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TFHEExecutor", + "sourceName": "contracts/TFHEExecutor.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": 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": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "HANDLE_VERSION", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "cast", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheAdd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitAnd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitOr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitXor", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheDiv", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheEq", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheEq", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "control", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifTrue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifFalse", + "type": "uint256" + } + ], + "name": "fheIfThenElse", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMax", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMin", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMul", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheNe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheNe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNeg", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNot", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRand", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "upperBound", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRandBounded", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRem", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheSub", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getACLAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFHEPaymentAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInputVerifierAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pt", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "trivialEncrypt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pt", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "trivialEncrypt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "inputType", + "type": "bytes1" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a08060405234620000d157306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000c257506001600160401b036002600160401b0319828216016200007c575b604051614d6c9081620000d68239608051818181612d250152612dc00152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80806200005c565b63f92ee8a960e01b8152600490fd5b5f80fdfe604060808152600480361015610013575f80fd5b5f915f3560e01c8063052896f11461446257806305907343146141bc5780630b90dfc314613fd15780630d8e6e2c14613e5f57806313801ffa14613d235780631927108114613b0e578063275e36bf14613ae65780632c7d67b7146139495780632e817ff01461377657806336cdd31b146135705780633e63c50a146133d757806344ae9c5c1461323a5780634be68d2014612fb05780634f1ef28614612d8157806352d1902d14612d08578063666a358814612b6b578063694daf72146129d25780636a8c8eb4146129b75780636be31758146127a2578063715018a61461270057806379ba50971461269a578063816d57d3146124fd57806389a4314b146123605780638c14cc21146121465780638da5cb5b146120ff578063900d294e14611f2d5780639675211f14611d55578063a86e9de514611bb8578063a87deac414611a1b578063a8b42a8914611892578063a8c7c2c114611863578063ad3cb1cc14611802578063bc47139a1461158a578063c4d66de81461142c578063cb3b9407146110a6578063e0c516ae14610ea0578063e0c5cbb314610d46578063e30c397814610cff578063e71746b814610b91578063ec4057dc146109f4578063eee1833c14610857578063f2fde38b146107ab578063f6859bdc1461077f578063f953e427146104be5763fa33b7af1461020c575f80fd5b3461040857806003193601126104085781359161022761462e565b908160f81c61023e61017e6001831b161515614a1a565b84151580610497575b156104545785905f80516020614d20833981519152803b15610408578551639bf5592160e01b81523385820190815260ff9093166020840152918391839182908490829060400103925af1801561044a57610432575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f19430143811161041f578551602081019283525f80516020614d40833981519152604082015246605482015290406074820152426094820152906103158260b481015b03601f1981018452836146ec565b6fffffffffffffffffffffffffffffffff199151902016948451956020870191601b60f81b8352602188015260ff60f81b83166041880152604287015260328652606086019286841067ffffffffffffffff85111761040c57509061ff00879284875261ffff199088519020169160f01c1617945f80516020614d00833981519152803b15610408576346ce4e4960e11b845260648201879052336084909201919091528290604490829084905af180156103fe576103e6575b50602093506103de8154614a66565b905551908152f35b6103f08591614670565b6103fa57836103cf565b8380fd5b83513d87823e3d90fd5b8280fd5b604190634e487b7160e01b5f525260245ffd5b634e487b7160e01b885260118452602488fd5b61043b90614670565b61044657845f61029d565b8480fd5b85513d84823e3d90fd5b835162461bcd60e51b8152602081840152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606490fd5b505f1985018581116104ab57851615610247565b634e487b7160e01b875260118352602487fd5b5034610408576104cd36614645565b949160ff8160081c16956104e961017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516327af38ad60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591610761575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906105ac91899161073a575b5061482c565b831561066a575b50509061ff009186519189830191878352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b61ffff19915190201691161793813b156104085783516346ce4e4960e11b815290810185815233602082015290929182918491908290849082906040015b03925af190811561065f5750610650575b5051908152f35b61065990614670565b5f610649565b8351903d90823e3d90fd5b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906106a2918891610703575b50614ad4565b60ff8260081c16036106b5575f806105b3565b855162461bcd60e51b8152808801899052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61072391508b3d8d11610729575b61071b81836146ec565b810190614814565b5f61069c565b503d610711565b88513d89823e3d90fd5b61075191508c8d3d106107295761071b81836146ec565b5f6105a6565b89513d8a823e3d90fd5b61076a90614670565b6103fa57835f610552565b86513d87823e3d90fd5b8382346107a757816003193601126107a757602090515f80516020614d008339815191528152f35b5080fd5b8334610854576020366003190112610854576107c56147fe565b6107cd614b82565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b50346104085761086636614645565b949160ff8160081c169561088261017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516307dbdabb60e21b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916109e0575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061094491899161073a575061482c565b8315610996575b50509061ff009186519189830191600960f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906109cd9188916107035750614ad4565b60ff8260081c16036106b5575f8061094b565b6109e990614670565b6103fa57835f6108eb565b503461040857610a0336614645565b949160ff8160081c1695610a1f61017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551633980607d60e11b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591610b7d575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790610ae191899161073a575061482c565b8315610b33575b50509061ff009186519189830191600360f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790610b6a9188916107035750614ad4565b60ff8260081c16036106b5575f80610ae8565b610b8690614670565b6103fa57835f610a88565b503461040857806003193601126104085782610bab61462e565b8060f81c610bc16101ff6001831b161515614a88565b5f80516020614d20833981519152803b156103fa57845163100747ad60e01b81523387820190815260ff9093166020840152918491839182908490829060400103925af18015610cf557908391610ce1575b505061ff00835160208101600360fb1b81528635602183015260ff60f81b841660418301525f80516020614d40833981519152604283015246605683015260568252610c5e826146d0565b61ffff1991519020169160f01c1617925f80516020614d0083398151915290813b156104085783516346ce4e4960e11b8152908101858152336020820152909291839182908490829060400103925af18015610cd757610cc3575b6020838351908152f35b610ccd8491614670565b6104085782610cb9565b82513d86823e3d90fd5b610cea90614670565b6107a757815f610c13565b84513d85823e3d90fd5b8382346107a757816003193601126107a7576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b503461040857806003193601126104085782823567ffffffffffffffff81116107a757610d76903690850161472a565b610d7e61462e565b908160f81c90610d96610e006001841b161515614a88565b5f80516020614d20833981519152803b1561044657855163100747ad60e01b81523381890190815260ff851660208201529091869183919082908490829060400103925af1801561077557908591610e8c575b5050805161ff0092869060098103610e645750610e06911461495c565b845190610c5e6056836020810193600360fb1b8552610e2f8151809260206021860191016147b8565b810160ff60f81b881660218201525f80516020614d4083398151915260228201524660368201520360368101855201836146ec565b600a14159050610e7f576080610e7a91146148ea565b610e06565b610100610e7a9114614878565b610e9590614670565b6103fa57835f610de9565b503461040857610eaf36614645565b600160f81b1694916001600160f81b0319860161105757610ed18215156149ce565b60ff8160081c1695610eeb61017e6001891b161515614a88565b5f80516020614d20833981519152803b156104465785516317f83edb60e31b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611043575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790610fa791899161073a575061482c565b8315610ff9575b50509061ff009186519189830191600160fa1b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906110309188916107035750614ad4565b60ff8260081c16036106b5575f80610fae565b61104c90614670565b6103fa57835f610f4e565b835162461bcd60e51b81526020818701526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b508290346107a75760603660031901126107a757823591602435936044359360ff8660081c16956110df610fff6001891b161515614a88565b5f80516020614d20833981519152803b1561044657855163d5f0797d60e01b81523385820190815260ff8a1660208201529091869183919082908490829060400103925af1801561077557908591611418575b50508451632fd514cd60e11b80825284820184815233602082810191909152999294929190859060400103948a815f80516020614d008339815191529781895afa908115610757579061118b9189916113fb575061482c565b87518181528681018581523360208201528b90829081906040010381895afa9081156107575788916113de575b501561139b5787519081528581018981523360208201528a90829081906040010381885afa90811561073057906111f591889161137e5750614ad4565b60ff8260081c1661133b5760ff8860081c16036112d25785519688880191601960f81b8352602189015282604189015260618801525f80516020614d4083398151915260818801524660958801526095875260c087019387851067ffffffffffffffff86111761040c575061ff009084875261ffff1990885190201691161794813b156103fa576346ce4e4960e11b835260c481018690523360e49091015282908290604490829084905af180156112c8576112b4575b505051908152f35b6112be8291614670565b61085457806112ac565b83513d84823e3d90fd5b855162461bcd60e51b8152808501899052602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608490fd5b865162461bcd60e51b81528086018a9052601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606490fd5b61139591508b3d8d116107295761071b81836146ec565b8b61069c565b875162461bcd60e51b81528087018b9052601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606490fd5b6113f591508b3d8d116107295761071b81836146ec565b8b6111b8565b61141291508c8d3d106107295761071b81836146ec565b8c6105a6565b61142190614670565b6103fa578388611132565b509034610408576020366003190112610408576114476147fe565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081611582575b6001149081611578575b15908161156f575b506115605767ffffffffffffffff198116600117855583611541575b506114c0614c5b565b6114c8614c5b565b6001600160a01b0382161561152a57506114e190614bcd565b6114e9578280f35b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f808280f35b8451631e4fbdf760e01b8152908101869052602490fd5b68ffffffffffffffffff1916680100000000000000011784555f6114b7565b50845163f92ee8a960e01b8152fd5b9050155f61149b565b303b159150611493565b859150611489565b50346104085761159936614770565b600883901c60ff1695926115b56001881b610e00161515614a88565b600160f81b809216918203611799575f80516020614d20833981519152803b1561044657855163709c098f60e11b81523381890190815260ff8a1660208201526001600160f81b0319851660408201529091869183919082908490829060600103925af1801561077557908591611785575b50508451632fd514cd60e11b81528681018281523360208281019190915298919491908590604001039489815f80516020614d008339815191529781895afa90811561073057916116856116f694926076948a9161176e575061482c565b88825191600981145f14611746575061169e911461495c565b87519485918b830195600360fa1b875260218401526116c78c82519283916041870191016147b8565b82019060418201525f80516020614d4083398151915260428201524660568201520360568101855201836146ec565b9051902061ffff191693813b156104085783516346ce4e4960e11b8152908101858152336020820152909183918391908290849082906040015b03925af180156112c8576112b457505051908152f35b600a1415905061176157608061175c91146148ea565b61169e565b61010061175c9114614878565b61075191508d803d106107295761071b81836146ec565b61178e90614670565b6103fa57835f611627565b845162461bcd60e51b8152602081880152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608490fd5b8382346107a757816003193601126107a757805161185f91611823826146b4565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152519182916020835260208301906147d9565b0390f35b8382346107a757816003193601126107a75760209051732ed2c0473d8218e99238e6ba82a3fa50bf43f7198152f35b5034610408576020928360031936011261085457823560ff8160081c166118c161017e6001831b161515614a88565b5f80516020614d2083398151915290813b156103fa5784516313ed41db60e31b81523387820190815260ff909216602083015291849183919082908490829060400103925af18015610cf557908391611a07575b50508251632fd514cd60e11b81528481018281523360208201529091908290604001039186815f80516020614d008339815191529481865afa9081156119fd5784916119e0575b501561199d5761ff008451878101600560fa1b81528360218301525f80516020614d408339815191526041830152466055830152605582526105fa826146d0565b835162461bcd60e51b8152808601879052601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606490fd5b6119f79150873d89116107295761071b81836146ec565b5f61195c565b85513d86823e3d90fd5b611a1090614670565b6107a757815f611915565b503461040857611a2a36614645565b949160ff8160081c1695611a4661017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551630ad2336160e41b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611ba4575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611b0891899161073a575061482c565b8315611b5a575b50509061ff009186519189830191600960f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790611b919188916107035750614ad4565b60ff8260081c16036106b5575f80611b0f565b611bad90614670565b6103fa57835f611aaf565b503461040857611bc736614645565b949160ff8160081c1695611be361017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551631ade267d60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611d41575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611ca591899161073a575061482c565b8315611cf7575b50509061ff009186519189830191601360f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790611d2e9188916107035750614ad4565b60ff8260081c16036106b5575f80611cac565b611d4a90614670565b6103fa57835f611c4c565b503461040857611d6436614645565b94919060ff8260081c1695611d8161017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b1561044657855163466ac06560e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591611f19575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611e4491899161073a575061482c565b8215611ecf575b505085519288840192601160f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b9051902061ffff191693813b156104085783516346ce4e4960e11b81529081018581523360208201529092918291849190829084908290604001610638565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790611f069188916107035750614ad4565b60ff8460081c16036106b5575f80611e4b565b611f2290614670565b6103fa57835f611deb565b50346104085760203660031901126104085781356001600160f81b031981169081810361044657848160f81c611f6b610f7f6001831b161515614a1a565b5f80516020614d20833981519152803b156104085785516302cccbd160e21b81523388820190815260ff9093166020840152918391839182908490829060400103925af1801561044a576120eb575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f1943014381116120d8578551602081019283525f80516020614d4083398151915260408201524660548201529040607482015242609482015287939261ff00929091906120318260b48101610307565b6fffffffffffffffffffffffffffffffff199151902016908651916020830191600d60f91b8352602184015260228301526012825261206f826146b4565b61ffff1991519020169160f01c1617935f80516020614d0083398151915290813b156104085784516346ce4e4960e11b8152908101868152336020820152909291839182908490829060400103925af180156103fe576103e65750602093506103de8154614a66565b634e487b7160e01b885260118752602488fd5b6120f490614670565b61044657845f611fba565b8382346107a757816003193601126107a7576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b50346104085761215536614645565b90949160ff8160081c169561217261017e6001891b161515614a88565b600160f81b928316925f80516020614d20833981519152803b1561235c5786516303ed3f3160e51b815233818a0190815260ff8b1660208201526001600160f81b0319871660408201529091879183919082908490829060600103925af180156123525790869161233e575b50508551632fd514cd60e11b808252888201858152336020828101919091529a9296929190879060400103968b815f80516020614d0083398151915299818b5afa9081156123345790612237918a9161176e575061482c565b8215612285575b50509061ff0092918751928a8401928352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b88519081528981018581523360208201528b908290819060400103818a5afa90811561075757906122bc91899161231d5750614ad4565b60ff8460081c16036122cf575f8061223e565b865162461bcd60e51b81528089018a9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61072391508c8d3d106107295761071b81836146ec565b8a513d8b823e3d90fd5b61234790614670565b61044657845f6121de565b87513d88823e3d90fd5b8580fd5b50346104085761236f36614645565b949160ff8160081c169561238b61017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551633968721960e11b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916124e9575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061244d91899161073a575061482c565b831561249f575b50509061ff009186519189830191600160fb1b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906124d69188916107035750614ad4565b60ff8260081c16036106b5575f80612454565b6124f290614670565b6103fa57835f6123f4565b50346104085761250c36614645565b949160ff8160081c169561252861017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551632be8dd7960e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591612686575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906125ea91899161073a575061482c565b831561263c575b50509061ff009186519189830191600160f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906126739188916107035750614ad4565b60ff8260081c16036106b5575f806125f1565b61268f90614670565b6103fa57835f612591565b5034610408578260031936011261040857336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036126e957826126e633614bcd565b80f35b60249250519063118cdaa760e01b82523390820152fd5b8334610854578060031936011261085457612719614b82565b806001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610408576127b136614645565b9060ff8360089794971c16956127cf610fff6001891b161515614a88565b600160f81b928316928314612945575b5f80516020614d20833981519152803b1561044657855163709c098f60e11b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591612931575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061289b91899161073a575061482c565b82156128e7575b505085519288840192600360fa1b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa908115610730579061291e9188916107035750614ad4565b60ff8460081c16036106b5575f806128a2565b61293a90614670565b6103fa57835f612842565b60088711156127df57845162461bcd60e51b8152602081880152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152608490fd5b8382346107a757816003193601126107a75751908152602090f35b5034610408576129e136614645565b94919060ff8260081c16956129fe61017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b1561044657855163d692278360e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591612b57575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790612ac191899161073a575061482c565b8215612b0d575b505085519288840192600160fc1b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790612b449188916107035750614ad4565b60ff8460081c16036106b5575f80612ac8565b612b6090614670565b6103fa57835f612a68565b503461040857612b7a36614645565b949160ff8160081c1695612b9661017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b1561044657855163cd2bd00360e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591612cf4575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790612c5891899161073a575061482c565b8315612caa575b50509061ff009186519189830191600560f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790612ce19188916107035750614ad4565b60ff8260081c16036106b5575f80612c5f565b612cfd90614670565b6103fa57835f612bff565b508234610854578060031936011261085457506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003612d7457602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b508060031936011261040857612d956147fe565b9060243567ffffffffffffffff811161044657612db5903690850161472a565b6001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115612f82575b50612f7257612df8614b82565b82516352d1902d60e01b81529084169360209182818881895afa889181612f3f575b50612e36578451634c9c8ce360e01b8152808801879052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc96929591939690818103612f295750833b15612f125780546001600160a01b0319168217905583518792917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a2865115612ef5575050808585612ee797519101845af4913d15612eeb573d612ed9612ed08261470e565b925192836146ec565b81528581943d92013e614c9c565b5080f35b5060609250614c9c565b9450945050505034612f0657505080f35b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9091508381813d8311612f6b575b612f5781836146ec565b81010312612f675751905f612e1a565b8880fd5b503d612f4d565b825163703e46dd60e11b81528590fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f612deb565b5034610408578060031936011261040857813592612fcc61462e565b8251632fd514cd60e11b81528481018681523360208281019190915296919291908390604001039287815f80516020614d008339815191529581875afa90811561077557859161321d575b50156131da5760ff8160081c169061303761017f6001841b161515614a88565b61017e60018460f81c1b1615613197576001600160f81b0319838116929060f083901b168314613154575f80516020614d20833981519152803b15613150578751630cea149360e41b815233818b0190815260ff9093166020840152918791839182908490829060400103925af180156123525790869161313c575b50509061ff009186519189830191601760f81b8352602184015260418301525f80516020614d408339815191526042830152466056830152605682526130f8826146d0565b61ffff1991519020169160f01c161793813b156104085783516346ce4e4960e11b815290810185815233602082015290918391839190829084908290604001611730565b61314590614670565b61044657845f6130b3565b8680fd5b865162461bcd60e51b81528089018a9052601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606490fd5b855162461bcd60e51b8152808801899052601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606490fd5b845162461bcd60e51b8152808701889052601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606490fd5b6132349150883d8a116107295761071b81836146ec565b5f613017565b50346104085761324936614645565b949160ff8160081c169561326561017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516313f3d32960e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916133c3575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061332791899161073a575061482c565b8315613379575b50509061ff009186519189830191600b60f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906133b09188916107035750614ad4565b60ff8260081c16036106b5575f8061332e565b6133cc90614670565b6103fa57835f6132ce565b5034610408576133e636614645565b94919060ff8260081c169561340361017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b15610446578551638638282b60e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af180156107755790859161355c575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906134c691899161073a575061482c565b8215613512575b505085519288840192600f60f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa90811561073057906135499188916107035750614ad4565b60ff8460081c16036106b5575f806134cd565b61356590614670565b6103fa57835f61346d565b50346104085761357f36614645565b600160f81b1694916001600160f81b03198601613727576135a18215156149ce565b60ff8160081c16956135bb61017e6001891b161515614a88565b5f80516020614d20833981519152803b1561044657855163f7eaec6360e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591613713575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061367791899161073a575061482c565b83156136c9575b50509061ff009186519189830191600360f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906137009188916107035750614ad4565b60ff8260081c16036106b5575f8061367e565b61371c90614670565b6103fa57835f61361e565b835162461bcd60e51b81526020818701526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b508290346107a75760803660031901126107a757823591602435926001600160a01b03948585168095036104085767ffffffffffffffff95604435878111610446576137c5903690840161472a565b60643597906001600160f81b03198916890361235c5786519160608301908111838210176139365787525f80516020614d00833981519152948583526020998a8401998a528884019033825260ff8360081c169060f81c036138f3579161386791858095948d978c519d8e988998634d52c10760e01b8a5251168b8901525116602487015251166044850152606484015260a0608484015260a48301906147d9565b038186732ed2c0473d8218e99238e6ba82a3fa50bf43f7195af1948515610cf55783956138c4575b50813b156104085783516346ce4e4960e11b815290810185815233602082015290918391839190829084908290604001611730565b9094508581813d83116138ec575b6138dc81836146ec565b810103126104085751938661388f565b503d6138d2565b885162461bcd60e51b81528087018c9052600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b875260418552602487fd5b50346104085761395836614645565b949160ff8160081c169561397461017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b1561044657855163473dceed60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591613ad2575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790613a3691899161073a575061482c565b8315613a88575b50509061ff009186519189830191600760f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790613abf9188916107035750614ad4565b60ff8260081c16036106b5575f80613a3d565b613adb90614670565b6103fa57835f6139dd565b8382346107a757816003193601126107a757602090515f80516020614d208339815191528152f35b503461040857613b1d36614645565b9060ff8360089794971c1695613b3b610fff6001891b161515614a88565b600160f81b928316928314613cb1575b5f80516020614d20833981519152803b156104465785516399841ed760e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591613c9d575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790613c0791899161073a575061482c565b8215613c53575b505085519288840192600d60f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790613c8a9188916107035750614ad4565b60ff8460081c16036106b5575f80613c0e565b613ca690614670565b6103fa57835f613bae565b6008871115613b4b57845162461bcd60e51b8152602081880152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152608490fd5b5034610408576020928360031936011261085457823560ff8160081c16613d5261017f6001831b161515614a88565b5f80516020614d2083398151915290813b156103fa57845163aa43b7f960e01b81523387820190815260ff909216602083015291849183919082908490829060400103925af18015610cf557908391613e4b575b50508251632fd514cd60e11b81528481018281523360208201529091908290604001039186815f80516020614d008339815191529481865afa9081156119fd578491613e2e575b501561199d5761ff008451878101601560f81b81528360218301525f80516020614d408339815191526041830152466055830152605582526105fa826146d0565b613e459150873d89116107295761071b81836146ec565b5f613ded565b613e5490614670565b6107a757815f613da6565b508290346107a757816003193601126107a757805190613e7e826146b4565b600c82526020938285809401947f544648454578656375746f7200000000000000000000000000000000000000008652613eb6614b20565b600180830192919080806021613ee3613ece8861470e565b97613edb8c51998a6146ec565b80895261470e565b878c019690601f1901368837870101905b613f9b575b50505096613f8c94926024949261185f9899613f13614b20565b93613f288a519d8e97519283918901906147b8565b850161103b60f11b8c820152613f488c83519384916022850191016147b8565b01613f65601760f91b9384602284015251809360238401906147b8565b01906023820152613f7e825180938b88850191016147b8565b0103908101875201856146ec565b519282849384528301906147d9565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215613fcc57919082613ef4565b613ef9565b503461414f57613fe036614770565b600883901c60ff169592613ffc6001881b610e00161515614a88565b600160f81b809216918203614153575f80516020614d20833981519152803b1561414f5785516399841ed760e01b81523381890190815260ff8a1660208201526001600160f81b03198516604082015290915f9183919082908490829060600103925af1801561414557614132575b508451632fd514cd60e11b81528681018281523360208281019190915298919491908590604001039489815f80516020614d008339815191529781895afa90811561073057916140c86116f694926076948a9161176e575061482c565b88825191600981145f1461410a57506140e1911461495c565b87519485918b830195600d60f81b875260218401526116c78c82519283916041870191016147b8565b600a1415905061412557608061412091146148ea565b6140e1565b6101006141209114614878565b61413d919450614670565b5f925f61406b565b86513d5f823e3d90fd5b5f80fd5b845162461bcd60e51b8152602081880152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608490fd5b50903461414f576141cc36614645565b939160ff8160089593951c16946141eb61017e6001881b161515614a88565b600160f81b165f80516020614d20833981519152803b1561414f57845163b25fd54760e01b81523385820190815260ff891660208201526001600160f81b03198416604082015290915f9183919082908490829060600103925af1801561445857614449575b508351632fd514cd60e11b808252848201848152336020828101919091529892979291908890604001039789815f80516020614d008339815191529a818c5afa90811561443f57906142a9915f91614422575061482c565b8315614363575b50509061ff009185519188830191600560f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526142fb82614698565b61ffff19915190201691161792803b1561414f5782516346ce4e4960e11b81529182018481523360208201525f9183918290849082906040015b03925af180156143595761434a575051908152f35b61435390614670565b83610649565b82513d5f823e3d90fd5b865190815285810183815233602082015289908290819060400103818b5afa908115614418579061439a915f916143fb5750614ad4565b60ff8260081c16036143ad5787806142b0565b845162461bcd60e51b8152808501889052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61441291508a3d8c116107295761071b81836146ec565b8a61069c565b87513d5f823e3d90fd5b61443991508b3d8d116107295761071b81836146ec565b8b6105a6565b88513d5f823e3d90fd5b61445290614670565b86614251565b85513d5f823e3d90fd5b50903461414f5761447236614645565b9391929060ff8460081c169461449061017e6001881b161515614a88565b600160f81b16935f80516020614d20833981519152803b1561414f57845162fabc1960e21b81523385820190815260ff891660208201526001600160f81b03198816604082015290915f9183919082908490829060600103925af180156144585761461f575b508351632fd514cd60e11b808252848201838152336020828101919091529892979291908890604001039789815f80516020614d008339815191529a818c5afa90811561443f579061454e915f91614422575061482c565b82156145d5575b505084519287840192600760f91b84526021850152604184015260618301525f80516020614d4083398151915260628301524660768301526076825261459a82614698565b9051902061ffff191692803b1561414f5782516346ce4e4960e11b81529182018481523360208201525f918391829084908290604001614335565b865190815285810185815233602082015289908290819060400103818b5afa908115614418579061460c915f916143fb5750614ad4565b60ff8460081c16036143ad578780614555565b61462890614670565b866144f6565b602435906001600160f81b03198216820361414f57565b606090600319011261414f5760043590602435906044356001600160f81b03198116810361414f5790565b67ffffffffffffffff811161468457604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff82111761468457604052565b6040810190811067ffffffffffffffff82111761468457604052565b6080810190811067ffffffffffffffff82111761468457604052565b90601f8019910116810190811067ffffffffffffffff82111761468457604052565b67ffffffffffffffff811161468457601f01601f191660200190565b81601f8201121561414f578035906147418261470e565b9261474f60405194856146ec565b8284526020838301011161414f57815f926020809301838601378301015290565b90606060031983011261414f57600435916024359067ffffffffffffffff821161414f576147a09160040161472a565b906044356001600160f81b03198116810361414f5790565b5f5b8381106147c95750505f910152565b81810151838201526020016147ba565b906020916147f2815180928185528580860191016147b8565b601f01601f1916010190565b600435906001600160a01b038216820361414f57565b9081602091031261414f5751801515810361414f5790565b1561483357565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606490fd5b1561487f57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201527f686f756c642062652032353600000000000000000000000000000000000000006064820152608490fd5b156148f157565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201527f686f756c642062652031323800000000000000000000000000000000000000006064820152608490fd5b1561496357565b60405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f66204279746573363420736860448201527f6f756c64206265203634000000000000000000000000000000000000000000006064820152608490fd5b156149d557565b60405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606490fd5b15614a2157565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606490fd5b5f198114614a745760010190565b634e487b7160e01b5f52601160045260245ffd5b15614a8f57565b60405162461bcd60e51b815260206004820152601060248201527f556e737570706f727465642074797065000000000000000000000000000000006044820152606490fd5b15614adb57565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606490fd5b6040515f614b2d826146b4565b600190600183526020368185013760218301825b614b4c575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614b7d57919082614b41565b614b46565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303614bb557565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615614c8a57565b604051631afcd79f60e31b8152600490fd5b90614cc35750805115614cb157805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580614cf6575b614cd4575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15614ccc56fe0000000000000000000000001f2f59242e4f8186e18463d8c9f1a7cc6d425f530000000000000000000000008f8e203122ba1d2d0d1982a34404005cbf94a5ab1f2f59242e4f8186e18463d8c9f1a7cc6d425f53000000000000000000000000a164736f6c6343000818000a", + "deployedBytecode": "0x604060808152600480361015610013575f80fd5b5f915f3560e01c8063052896f11461446257806305907343146141bc5780630b90dfc314613fd15780630d8e6e2c14613e5f57806313801ffa14613d235780631927108114613b0e578063275e36bf14613ae65780632c7d67b7146139495780632e817ff01461377657806336cdd31b146135705780633e63c50a146133d757806344ae9c5c1461323a5780634be68d2014612fb05780634f1ef28614612d8157806352d1902d14612d08578063666a358814612b6b578063694daf72146129d25780636a8c8eb4146129b75780636be31758146127a2578063715018a61461270057806379ba50971461269a578063816d57d3146124fd57806389a4314b146123605780638c14cc21146121465780638da5cb5b146120ff578063900d294e14611f2d5780639675211f14611d55578063a86e9de514611bb8578063a87deac414611a1b578063a8b42a8914611892578063a8c7c2c114611863578063ad3cb1cc14611802578063bc47139a1461158a578063c4d66de81461142c578063cb3b9407146110a6578063e0c516ae14610ea0578063e0c5cbb314610d46578063e30c397814610cff578063e71746b814610b91578063ec4057dc146109f4578063eee1833c14610857578063f2fde38b146107ab578063f6859bdc1461077f578063f953e427146104be5763fa33b7af1461020c575f80fd5b3461040857806003193601126104085781359161022761462e565b908160f81c61023e61017e6001831b161515614a1a565b84151580610497575b156104545785905f80516020614d20833981519152803b15610408578551639bf5592160e01b81523385820190815260ff9093166020840152918391839182908490829060400103925af1801561044a57610432575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f19430143811161041f578551602081019283525f80516020614d40833981519152604082015246605482015290406074820152426094820152906103158260b481015b03601f1981018452836146ec565b6fffffffffffffffffffffffffffffffff199151902016948451956020870191601b60f81b8352602188015260ff60f81b83166041880152604287015260328652606086019286841067ffffffffffffffff85111761040c57509061ff00879284875261ffff199088519020169160f01c1617945f80516020614d00833981519152803b15610408576346ce4e4960e11b845260648201879052336084909201919091528290604490829084905af180156103fe576103e6575b50602093506103de8154614a66565b905551908152f35b6103f08591614670565b6103fa57836103cf565b8380fd5b83513d87823e3d90fd5b8280fd5b604190634e487b7160e01b5f525260245ffd5b634e487b7160e01b885260118452602488fd5b61043b90614670565b61044657845f61029d565b8480fd5b85513d84823e3d90fd5b835162461bcd60e51b8152602081840152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606490fd5b505f1985018581116104ab57851615610247565b634e487b7160e01b875260118352602487fd5b5034610408576104cd36614645565b949160ff8160081c16956104e961017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516327af38ad60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591610761575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906105ac91899161073a575b5061482c565b831561066a575b50509061ff009186519189830191878352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b61ffff19915190201691161793813b156104085783516346ce4e4960e11b815290810185815233602082015290929182918491908290849082906040015b03925af190811561065f5750610650575b5051908152f35b61065990614670565b5f610649565b8351903d90823e3d90fd5b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906106a2918891610703575b50614ad4565b60ff8260081c16036106b5575f806105b3565b855162461bcd60e51b8152808801899052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61072391508b3d8d11610729575b61071b81836146ec565b810190614814565b5f61069c565b503d610711565b88513d89823e3d90fd5b61075191508c8d3d106107295761071b81836146ec565b5f6105a6565b89513d8a823e3d90fd5b61076a90614670565b6103fa57835f610552565b86513d87823e3d90fd5b8382346107a757816003193601126107a757602090515f80516020614d008339815191528152f35b5080fd5b8334610854576020366003190112610854576107c56147fe565b6107cd614b82565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b50346104085761086636614645565b949160ff8160081c169561088261017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516307dbdabb60e21b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916109e0575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061094491899161073a575061482c565b8315610996575b50509061ff009186519189830191600960f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906109cd9188916107035750614ad4565b60ff8260081c16036106b5575f8061094b565b6109e990614670565b6103fa57835f6108eb565b503461040857610a0336614645565b949160ff8160081c1695610a1f61017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551633980607d60e11b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591610b7d575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790610ae191899161073a575061482c565b8315610b33575b50509061ff009186519189830191600360f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790610b6a9188916107035750614ad4565b60ff8260081c16036106b5575f80610ae8565b610b8690614670565b6103fa57835f610a88565b503461040857806003193601126104085782610bab61462e565b8060f81c610bc16101ff6001831b161515614a88565b5f80516020614d20833981519152803b156103fa57845163100747ad60e01b81523387820190815260ff9093166020840152918491839182908490829060400103925af18015610cf557908391610ce1575b505061ff00835160208101600360fb1b81528635602183015260ff60f81b841660418301525f80516020614d40833981519152604283015246605683015260568252610c5e826146d0565b61ffff1991519020169160f01c1617925f80516020614d0083398151915290813b156104085783516346ce4e4960e11b8152908101858152336020820152909291839182908490829060400103925af18015610cd757610cc3575b6020838351908152f35b610ccd8491614670565b6104085782610cb9565b82513d86823e3d90fd5b610cea90614670565b6107a757815f610c13565b84513d85823e3d90fd5b8382346107a757816003193601126107a7576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b503461040857806003193601126104085782823567ffffffffffffffff81116107a757610d76903690850161472a565b610d7e61462e565b908160f81c90610d96610e006001841b161515614a88565b5f80516020614d20833981519152803b1561044657855163100747ad60e01b81523381890190815260ff851660208201529091869183919082908490829060400103925af1801561077557908591610e8c575b5050805161ff0092869060098103610e645750610e06911461495c565b845190610c5e6056836020810193600360fb1b8552610e2f8151809260206021860191016147b8565b810160ff60f81b881660218201525f80516020614d4083398151915260228201524660368201520360368101855201836146ec565b600a14159050610e7f576080610e7a91146148ea565b610e06565b610100610e7a9114614878565b610e9590614670565b6103fa57835f610de9565b503461040857610eaf36614645565b600160f81b1694916001600160f81b0319860161105757610ed18215156149ce565b60ff8160081c1695610eeb61017e6001891b161515614a88565b5f80516020614d20833981519152803b156104465785516317f83edb60e31b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611043575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790610fa791899161073a575061482c565b8315610ff9575b50509061ff009186519189830191600160fa1b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906110309188916107035750614ad4565b60ff8260081c16036106b5575f80610fae565b61104c90614670565b6103fa57835f610f4e565b835162461bcd60e51b81526020818701526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b508290346107a75760603660031901126107a757823591602435936044359360ff8660081c16956110df610fff6001891b161515614a88565b5f80516020614d20833981519152803b1561044657855163d5f0797d60e01b81523385820190815260ff8a1660208201529091869183919082908490829060400103925af1801561077557908591611418575b50508451632fd514cd60e11b80825284820184815233602082810191909152999294929190859060400103948a815f80516020614d008339815191529781895afa908115610757579061118b9189916113fb575061482c565b87518181528681018581523360208201528b90829081906040010381895afa9081156107575788916113de575b501561139b5787519081528581018981523360208201528a90829081906040010381885afa90811561073057906111f591889161137e5750614ad4565b60ff8260081c1661133b5760ff8860081c16036112d25785519688880191601960f81b8352602189015282604189015260618801525f80516020614d4083398151915260818801524660958801526095875260c087019387851067ffffffffffffffff86111761040c575061ff009084875261ffff1990885190201691161794813b156103fa576346ce4e4960e11b835260c481018690523360e49091015282908290604490829084905af180156112c8576112b4575b505051908152f35b6112be8291614670565b61085457806112ac565b83513d84823e3d90fd5b855162461bcd60e51b8152808501899052602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608490fd5b865162461bcd60e51b81528086018a9052601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606490fd5b61139591508b3d8d116107295761071b81836146ec565b8b61069c565b875162461bcd60e51b81528087018b9052601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606490fd5b6113f591508b3d8d116107295761071b81836146ec565b8b6111b8565b61141291508c8d3d106107295761071b81836146ec565b8c6105a6565b61142190614670565b6103fa578388611132565b509034610408576020366003190112610408576114476147fe565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff811680159081611582575b6001149081611578575b15908161156f575b506115605767ffffffffffffffff198116600117855583611541575b506114c0614c5b565b6114c8614c5b565b6001600160a01b0382161561152a57506114e190614bcd565b6114e9578280f35b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f808280f35b8451631e4fbdf760e01b8152908101869052602490fd5b68ffffffffffffffffff1916680100000000000000011784555f6114b7565b50845163f92ee8a960e01b8152fd5b9050155f61149b565b303b159150611493565b859150611489565b50346104085761159936614770565b600883901c60ff1695926115b56001881b610e00161515614a88565b600160f81b809216918203611799575f80516020614d20833981519152803b1561044657855163709c098f60e11b81523381890190815260ff8a1660208201526001600160f81b0319851660408201529091869183919082908490829060600103925af1801561077557908591611785575b50508451632fd514cd60e11b81528681018281523360208281019190915298919491908590604001039489815f80516020614d008339815191529781895afa90811561073057916116856116f694926076948a9161176e575061482c565b88825191600981145f14611746575061169e911461495c565b87519485918b830195600360fa1b875260218401526116c78c82519283916041870191016147b8565b82019060418201525f80516020614d4083398151915260428201524660568201520360568101855201836146ec565b9051902061ffff191693813b156104085783516346ce4e4960e11b8152908101858152336020820152909183918391908290849082906040015b03925af180156112c8576112b457505051908152f35b600a1415905061176157608061175c91146148ea565b61169e565b61010061175c9114614878565b61075191508d803d106107295761071b81836146ec565b61178e90614670565b6103fa57835f611627565b845162461bcd60e51b8152602081880152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608490fd5b8382346107a757816003193601126107a757805161185f91611823826146b4565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152519182916020835260208301906147d9565b0390f35b8382346107a757816003193601126107a75760209051732ed2c0473d8218e99238e6ba82a3fa50bf43f7198152f35b5034610408576020928360031936011261085457823560ff8160081c166118c161017e6001831b161515614a88565b5f80516020614d2083398151915290813b156103fa5784516313ed41db60e31b81523387820190815260ff909216602083015291849183919082908490829060400103925af18015610cf557908391611a07575b50508251632fd514cd60e11b81528481018281523360208201529091908290604001039186815f80516020614d008339815191529481865afa9081156119fd5784916119e0575b501561199d5761ff008451878101600560fa1b81528360218301525f80516020614d408339815191526041830152466055830152605582526105fa826146d0565b835162461bcd60e51b8152808601879052601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606490fd5b6119f79150873d89116107295761071b81836146ec565b5f61195c565b85513d86823e3d90fd5b611a1090614670565b6107a757815f611915565b503461040857611a2a36614645565b949160ff8160081c1695611a4661017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551630ad2336160e41b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611ba4575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611b0891899161073a575061482c565b8315611b5a575b50509061ff009186519189830191600960f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790611b919188916107035750614ad4565b60ff8260081c16036106b5575f80611b0f565b611bad90614670565b6103fa57835f611aaf565b503461040857611bc736614645565b949160ff8160081c1695611be361017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551631ade267d60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591611d41575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611ca591899161073a575061482c565b8315611cf7575b50509061ff009186519189830191601360f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790611d2e9188916107035750614ad4565b60ff8260081c16036106b5575f80611cac565b611d4a90614670565b6103fa57835f611c4c565b503461040857611d6436614645565b94919060ff8260081c1695611d8161017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b1561044657855163466ac06560e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591611f19575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790611e4491899161073a575061482c565b8215611ecf575b505085519288840192601160f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b9051902061ffff191693813b156104085783516346ce4e4960e11b81529081018581523360208201529092918291849190829084908290604001610638565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790611f069188916107035750614ad4565b60ff8460081c16036106b5575f80611e4b565b611f2290614670565b6103fa57835f611deb565b50346104085760203660031901126104085781356001600160f81b031981169081810361044657848160f81c611f6b610f7f6001831b161515614a1a565b5f80516020614d20833981519152803b156104085785516302cccbd160e21b81523388820190815260ff9093166020840152918391839182908490829060400103925af1801561044a576120eb575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f1943014381116120d8578551602081019283525f80516020614d4083398151915260408201524660548201529040607482015242609482015287939261ff00929091906120318260b48101610307565b6fffffffffffffffffffffffffffffffff199151902016908651916020830191600d60f91b8352602184015260228301526012825261206f826146b4565b61ffff1991519020169160f01c1617935f80516020614d0083398151915290813b156104085784516346ce4e4960e11b8152908101868152336020820152909291839182908490829060400103925af180156103fe576103e65750602093506103de8154614a66565b634e487b7160e01b885260118752602488fd5b6120f490614670565b61044657845f611fba565b8382346107a757816003193601126107a7576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b50346104085761215536614645565b90949160ff8160081c169561217261017e6001891b161515614a88565b600160f81b928316925f80516020614d20833981519152803b1561235c5786516303ed3f3160e51b815233818a0190815260ff8b1660208201526001600160f81b0319871660408201529091879183919082908490829060600103925af180156123525790869161233e575b50508551632fd514cd60e11b808252888201858152336020828101919091529a9296929190879060400103968b815f80516020614d0083398151915299818b5afa9081156123345790612237918a9161176e575061482c565b8215612285575b50509061ff0092918751928a8401928352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b88519081528981018581523360208201528b908290819060400103818a5afa90811561075757906122bc91899161231d5750614ad4565b60ff8460081c16036122cf575f8061223e565b865162461bcd60e51b81528089018a9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61072391508c8d3d106107295761071b81836146ec565b8a513d8b823e3d90fd5b61234790614670565b61044657845f6121de565b87513d88823e3d90fd5b8580fd5b50346104085761236f36614645565b949160ff8160081c169561238b61017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551633968721960e11b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916124e9575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061244d91899161073a575061482c565b831561249f575b50509061ff009186519189830191600160fb1b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906124d69188916107035750614ad4565b60ff8260081c16036106b5575f80612454565b6124f290614670565b6103fa57835f6123f4565b50346104085761250c36614645565b949160ff8160081c169561252861017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b15610446578551632be8dd7960e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591612686575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906125ea91899161073a575061482c565b831561263c575b50509061ff009186519189830191600160f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906126739188916107035750614ad4565b60ff8260081c16036106b5575f806125f1565b61268f90614670565b6103fa57835f612591565b5034610408578260031936011261040857336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416036126e957826126e633614bcd565b80f35b60249250519063118cdaa760e01b82523390820152fd5b8334610854578060031936011261085457612719614b82565b806001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610408576127b136614645565b9060ff8360089794971c16956127cf610fff6001891b161515614a88565b600160f81b928316928314612945575b5f80516020614d20833981519152803b1561044657855163709c098f60e11b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591612931575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061289b91899161073a575061482c565b82156128e7575b505085519288840192600360fa1b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa908115610730579061291e9188916107035750614ad4565b60ff8460081c16036106b5575f806128a2565b61293a90614670565b6103fa57835f612842565b60088711156127df57845162461bcd60e51b8152602081880152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152608490fd5b8382346107a757816003193601126107a75751908152602090f35b5034610408576129e136614645565b94919060ff8260081c16956129fe61017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b1561044657855163d692278360e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591612b57575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790612ac191899161073a575061482c565b8215612b0d575b505085519288840192600160fc1b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790612b449188916107035750614ad4565b60ff8460081c16036106b5575f80612ac8565b612b6090614670565b6103fa57835f612a68565b503461040857612b7a36614645565b949160ff8160081c1695612b9661017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b1561044657855163cd2bd00360e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591612cf4575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790612c5891899161073a575061482c565b8315612caa575b50509061ff009186519189830191600560f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790612ce19188916107035750614ad4565b60ff8260081c16036106b5575f80612c5f565b612cfd90614670565b6103fa57835f612bff565b508234610854578060031936011261085457506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003612d7457602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b508060031936011261040857612d956147fe565b9060243567ffffffffffffffff811161044657612db5903690850161472a565b6001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115612f82575b50612f7257612df8614b82565b82516352d1902d60e01b81529084169360209182818881895afa889181612f3f575b50612e36578451634c9c8ce360e01b8152808801879052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc96929591939690818103612f295750833b15612f125780546001600160a01b0319168217905583518792917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a2865115612ef5575050808585612ee797519101845af4913d15612eeb573d612ed9612ed08261470e565b925192836146ec565b81528581943d92013e614c9c565b5080f35b5060609250614c9c565b9450945050505034612f0657505080f35b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9091508381813d8311612f6b575b612f5781836146ec565b81010312612f675751905f612e1a565b8880fd5b503d612f4d565b825163703e46dd60e11b81528590fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f612deb565b5034610408578060031936011261040857813592612fcc61462e565b8251632fd514cd60e11b81528481018681523360208281019190915296919291908390604001039287815f80516020614d008339815191529581875afa90811561077557859161321d575b50156131da5760ff8160081c169061303761017f6001841b161515614a88565b61017e60018460f81c1b1615613197576001600160f81b0319838116929060f083901b168314613154575f80516020614d20833981519152803b15613150578751630cea149360e41b815233818b0190815260ff9093166020840152918791839182908490829060400103925af180156123525790869161313c575b50509061ff009186519189830191601760f81b8352602184015260418301525f80516020614d408339815191526042830152466056830152605682526130f8826146d0565b61ffff1991519020169160f01c161793813b156104085783516346ce4e4960e11b815290810185815233602082015290918391839190829084908290604001611730565b61314590614670565b61044657845f6130b3565b8680fd5b865162461bcd60e51b81528089018a9052601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606490fd5b855162461bcd60e51b8152808801899052601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606490fd5b845162461bcd60e51b8152808701889052601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606490fd5b6132349150883d8a116107295761071b81836146ec565b5f613017565b50346104085761324936614645565b949160ff8160081c169561326561017e6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b156104465785516313f3d32960e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af18015610775579085916133c3575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061332791899161073a575061482c565b8315613379575b50509061ff009186519189830191600b60f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906133b09188916107035750614ad4565b60ff8260081c16036106b5575f8061332e565b6133cc90614670565b6103fa57835f6132ce565b5034610408576133e636614645565b94919060ff8260081c169561340361017e6001891b161515614a88565b600160f81b16915f80516020614d20833981519152803b15610446578551638638282b60e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af180156107755790859161355c575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa90811561075757906134c691899161073a575061482c565b8215613512575b505085519288840192600f60f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa90811561073057906135499188916107035750614ad4565b60ff8460081c16036106b5575f806134cd565b61356590614670565b6103fa57835f61346d565b50346104085761357f36614645565b600160f81b1694916001600160f81b03198601613727576135a18215156149ce565b60ff8160081c16956135bb61017e6001891b161515614a88565b5f80516020614d20833981519152803b1561044657855163f7eaec6360e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591613713575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa908115610757579061367791899161073a575061482c565b83156136c9575b50509061ff009186519189830191600360f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa90811561073057906137009188916107035750614ad4565b60ff8260081c16036106b5575f8061367e565b61371c90614670565b6103fa57835f61361e565b835162461bcd60e51b81526020818701526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b508290346107a75760803660031901126107a757823591602435926001600160a01b03948585168095036104085767ffffffffffffffff95604435878111610446576137c5903690840161472a565b60643597906001600160f81b03198916890361235c5786519160608301908111838210176139365787525f80516020614d00833981519152948583526020998a8401998a528884019033825260ff8360081c169060f81c036138f3579161386791858095948d978c519d8e988998634d52c10760e01b8a5251168b8901525116602487015251166044850152606484015260a0608484015260a48301906147d9565b038186732ed2c0473d8218e99238e6ba82a3fa50bf43f7195af1948515610cf55783956138c4575b50813b156104085783516346ce4e4960e11b815290810185815233602082015290918391839190829084908290604001611730565b9094508581813d83116138ec575b6138dc81836146ec565b810103126104085751938661388f565b503d6138d2565b885162461bcd60e51b81528087018c9052600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b875260418552602487fd5b50346104085761395836614645565b949160ff8160081c169561397461017f6001891b161515614a88565b600160f81b165f80516020614d20833981519152803b1561044657855163473dceed60e01b81523381890190815260ff8a1660208201526001600160f81b0319841660408201529091869183919082908490829060600103925af1801561077557908591613ad2575b50508451632fd514cd60e11b80825287820184815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790613a3691899161073a575061482c565b8315613a88575b50509061ff009186519189830191600760f81b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526105fa82614698565b87519081528881018381523360208201528a90829081906040010381895afa9081156107305790613abf9188916107035750614ad4565b60ff8260081c16036106b5575f80613a3d565b613adb90614670565b6103fa57835f6139dd565b8382346107a757816003193601126107a757602090515f80516020614d208339815191528152f35b503461040857613b1d36614645565b9060ff8360089794971c1695613b3b610fff6001891b161515614a88565b600160f81b928316928314613cb1575b5f80516020614d20833981519152803b156104465785516399841ed760e01b81523381890190815260ff8a1660208201526001600160f81b0319861660408201529091869183919082908490829060600103925af1801561077557908591613c9d575b50508451632fd514cd60e11b80825287820183815233602082810191909152999295929190869060400103958a815f80516020614d0083398151915298818a5afa9081156107575790613c0791899161073a575061482c565b8215613c53575b505085519288840192600d60f81b84526021850152604184015260618301525f80516020614d40833981519152606283015246607683015260768252611e9082614698565b87519081528881018581523360208201528a90829081906040010381895afa9081156107305790613c8a9188916107035750614ad4565b60ff8460081c16036106b5575f80613c0e565b613ca690614670565b6103fa57835f613bae565b6008871115613b4b57845162461bcd60e51b8152602081880152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152608490fd5b5034610408576020928360031936011261085457823560ff8160081c16613d5261017f6001831b161515614a88565b5f80516020614d2083398151915290813b156103fa57845163aa43b7f960e01b81523387820190815260ff909216602083015291849183919082908490829060400103925af18015610cf557908391613e4b575b50508251632fd514cd60e11b81528481018281523360208201529091908290604001039186815f80516020614d008339815191529481865afa9081156119fd578491613e2e575b501561199d5761ff008451878101601560f81b81528360218301525f80516020614d408339815191526041830152466055830152605582526105fa826146d0565b613e459150873d89116107295761071b81836146ec565b5f613ded565b613e5490614670565b6107a757815f613da6565b508290346107a757816003193601126107a757805190613e7e826146b4565b600c82526020938285809401947f544648454578656375746f7200000000000000000000000000000000000000008652613eb6614b20565b600180830192919080806021613ee3613ece8861470e565b97613edb8c51998a6146ec565b80895261470e565b878c019690601f1901368837870101905b613f9b575b50505096613f8c94926024949261185f9899613f13614b20565b93613f288a519d8e97519283918901906147b8565b850161103b60f11b8c820152613f488c83519384916022850191016147b8565b01613f65601760f91b9384602284015251809360238401906147b8565b01906023820152613f7e825180938b88850191016147b8565b0103908101875201856146ec565b519282849384528301906147d9565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215613fcc57919082613ef4565b613ef9565b503461414f57613fe036614770565b600883901c60ff169592613ffc6001881b610e00161515614a88565b600160f81b809216918203614153575f80516020614d20833981519152803b1561414f5785516399841ed760e01b81523381890190815260ff8a1660208201526001600160f81b03198516604082015290915f9183919082908490829060600103925af1801561414557614132575b508451632fd514cd60e11b81528681018281523360208281019190915298919491908590604001039489815f80516020614d008339815191529781895afa90811561073057916140c86116f694926076948a9161176e575061482c565b88825191600981145f1461410a57506140e1911461495c565b87519485918b830195600d60f81b875260218401526116c78c82519283916041870191016147b8565b600a1415905061412557608061412091146148ea565b6140e1565b6101006141209114614878565b61413d919450614670565b5f925f61406b565b86513d5f823e3d90fd5b5f80fd5b845162461bcd60e51b8152602081880152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608490fd5b50903461414f576141cc36614645565b939160ff8160089593951c16946141eb61017e6001881b161515614a88565b600160f81b165f80516020614d20833981519152803b1561414f57845163b25fd54760e01b81523385820190815260ff891660208201526001600160f81b03198416604082015290915f9183919082908490829060600103925af1801561445857614449575b508351632fd514cd60e11b808252848201848152336020828101919091529892979291908890604001039789815f80516020614d008339815191529a818c5afa90811561443f57906142a9915f91614422575061482c565b8315614363575b50509061ff009185519188830191600560f91b8352856021850152604184015260618301525f80516020614d408339815191526062830152466076830152607682526142fb82614698565b61ffff19915190201691161792803b1561414f5782516346ce4e4960e11b81529182018481523360208201525f9183918290849082906040015b03925af180156143595761434a575051908152f35b61435390614670565b83610649565b82513d5f823e3d90fd5b865190815285810183815233602082015289908290819060400103818b5afa908115614418579061439a915f916143fb5750614ad4565b60ff8260081c16036143ad5787806142b0565b845162461bcd60e51b8152808501889052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61441291508a3d8c116107295761071b81836146ec565b8a61069c565b87513d5f823e3d90fd5b61443991508b3d8d116107295761071b81836146ec565b8b6105a6565b88513d5f823e3d90fd5b61445290614670565b86614251565b85513d5f823e3d90fd5b50903461414f5761447236614645565b9391929060ff8460081c169461449061017e6001881b161515614a88565b600160f81b16935f80516020614d20833981519152803b1561414f57845162fabc1960e21b81523385820190815260ff891660208201526001600160f81b03198816604082015290915f9183919082908490829060600103925af180156144585761461f575b508351632fd514cd60e11b808252848201838152336020828101919091529892979291908890604001039789815f80516020614d008339815191529a818c5afa90811561443f579061454e915f91614422575061482c565b82156145d5575b505084519287840192600760f91b84526021850152604184015260618301525f80516020614d4083398151915260628301524660768301526076825261459a82614698565b9051902061ffff191692803b1561414f5782516346ce4e4960e11b81529182018481523360208201525f918391829084908290604001614335565b865190815285810185815233602082015289908290819060400103818b5afa908115614418579061460c915f916143fb5750614ad4565b60ff8460081c16036143ad578780614555565b61462890614670565b866144f6565b602435906001600160f81b03198216820361414f57565b606090600319011261414f5760043590602435906044356001600160f81b03198116810361414f5790565b67ffffffffffffffff811161468457604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff82111761468457604052565b6040810190811067ffffffffffffffff82111761468457604052565b6080810190811067ffffffffffffffff82111761468457604052565b90601f8019910116810190811067ffffffffffffffff82111761468457604052565b67ffffffffffffffff811161468457601f01601f191660200190565b81601f8201121561414f578035906147418261470e565b9261474f60405194856146ec565b8284526020838301011161414f57815f926020809301838601378301015290565b90606060031983011261414f57600435916024359067ffffffffffffffff821161414f576147a09160040161472a565b906044356001600160f81b03198116810361414f5790565b5f5b8381106147c95750505f910152565b81810151838201526020016147ba565b906020916147f2815180928185528580860191016147b8565b601f01601f1916010190565b600435906001600160a01b038216820361414f57565b9081602091031261414f5751801515810361414f5790565b1561483357565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606490fd5b1561487f57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201527f686f756c642062652032353600000000000000000000000000000000000000006064820152608490fd5b156148f157565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201527f686f756c642062652031323800000000000000000000000000000000000000006064820152608490fd5b1561496357565b60405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f66204279746573363420736860448201527f6f756c64206265203634000000000000000000000000000000000000000000006064820152608490fd5b156149d557565b60405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606490fd5b15614a2157565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606490fd5b5f198114614a745760010190565b634e487b7160e01b5f52601160045260245ffd5b15614a8f57565b60405162461bcd60e51b815260206004820152601060248201527f556e737570706f727465642074797065000000000000000000000000000000006044820152606490fd5b15614adb57565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606490fd5b6040515f614b2d826146b4565b600190600183526020368185013760218301825b614b4c575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614b7d57919082614b41565b614b46565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303614bb557565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615614c8a57565b604051631afcd79f60e31b8152600490fd5b90614cc35750805115614cb157805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580614cf6575b614cd4575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15614ccc56fe0000000000000000000000001f2f59242e4f8186e18463d8c9f1a7cc6d425f530000000000000000000000008f8e203122ba1d2d0d1982a34404005cbf94a5ab1f2f59242e4f8186e18463d8c9f1a7cc6d425f53000000000000000000000000a164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.dbg.json b/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.dbg.json new file mode 100644 index 00000000..5678cfab --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/cefcaa0593493278b72c1d1d0bdc16d8.json" +} diff --git a/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.json b/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.json new file mode 100644 index 00000000..e148120f --- /dev/null +++ b/contracts/artifacts/contracts/TFHEExecutorWithEvents.sol/TFHEExecutorWithEvents.json @@ -0,0 +1,2096 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TFHEExecutorWithEvents", + "sourceName": "contracts/TFHEExecutorWithEvents.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": false, + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "Cast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheAdd", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheBitAnd", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheBitOr", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheBitXor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheDiv", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheEq", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheEqBytes", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheGe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheGt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "control", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ifTrue", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ifFalse", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheIfThenElse", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheLe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheLt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheMax", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheMin", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheMul", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheNe", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheNeBytes", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheNeg", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheNot", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheRand", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "upperBound", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheRandBounded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheRem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheRotl", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheRotr", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheShl", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheShr", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "FheSub", + "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": false, + "internalType": "uint256", + "name": "pt", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "TrivialEncrypt", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "pt", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "TrivialEncryptBytes", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes1", + "name": "inputType", + "type": "bytes1" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "name": "VerifyCiphertext", + "type": "event" + }, + { + "inputs": [], + "name": "HANDLE_VERSION", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "cast", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheAdd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitAnd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitOr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitXor", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheDiv", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheEq", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheEq", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "control", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifTrue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifFalse", + "type": "uint256" + } + ], + "name": "fheIfThenElse", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMax", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMin", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMul", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "rhs", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheNe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheNe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNeg", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNot", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRand", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "upperBound", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRandBounded", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRem", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheSub", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getACLAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFHEPaymentAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInputVerifierAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVersion", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "initialOwner", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "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": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "pt", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "trivialEncrypt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pt", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "trivialEncrypt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "inputType", + "type": "bytes1" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a0604052346200004257306080526200001862000046565b6200002262000046565b604051615ef89081620000e6823960805181818161385d01526138f80152f35b5f80fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c16620000d3576001600160401b036002600160401b0319828216016200009457505050565b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1565b60405163f92ee8a960e01b8152600490fdfe604060808152600480361015610013575f80fd5b5f915f3560e01c8063052896f11461555d578063059073431461527d5780630b90dfc314614ff15780630d8e6e2c14614e7f57806313801ffa14614cc15780631927108114614a01578063275e36bf146149d95780632c7d67b71461478e5780632e817ff01461453357806336cdd31b1461427d5780633e63c50a1461403857806344ae9c5c14613ded5780634be68d2014613aec5780634f1ef286146138b957806352d1902d14613840578063666a3588146135f5578063694daf72146133b05780636a8c8eb4146133955780636be31758146130d5578063715018a61461303357806379ba509714612fcd578063816d57d314612d8257806389a4314b14612b375780638c14cc21146128595780638da5cb5b14612812578063900d294e146125f55780639675211f146123b0578063a86e9de514612165578063a87deac414611f1a578063a8b42a8914611cfe578063a8c7c2c114611ccf578063ad3cb1cc14611c6e578063bc47139a146119bc578063c4d66de81461185e578063cb3b9407146114a4578063e0c516ae146111a5578063e0c5cbb314610f7e578063e30c397814610f37578063e71746b814610d92578063ec4057dc14610b47578063eee1833c146108fc578063f2fde38b14610853578063f6859bdc1461082b578063f953e4271461050d5763fa33b7af1461020c575f80fd5b3461049f578060031936011261049f578135610226615786565b938460f81c61023d61017e6001831b161515615ce1565b821515806104e6575b156104a3575f80516020615eac83398151915290813b1561049f578451639bf5592160e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291610481575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009081545f19430143811161046e578551602081019283525f80516020615ecc833981519152604082015246605482015290406074820152426094820152906103178260b481015b03601f198101845283615844565b905190208451601b60f81b60208201908152602182018690526001600160f81b0319891660418301526fffffffffffffffffffffffffffffffff199092166042820152603281529560608701919087831067ffffffffffffffff84111761045b575081865261ffff1990875190201661ff008860f01c1617955f80516020615e8c83398151915290813b15610457576346ce4e4960e11b8352606481018890523360849091015282908290604490829084905af1801561044d57610436575b5050937f92331e27bd97df8f1490a60822d7d55e23a39dcbf856ff4ad171be686e9df97b918561040860209754615d2d565b905583519081526001600160f81b031990911660208201526040810184905280606081015b0390a151908152f35b61044082916157c8565b61044a57806103d6565b80fd5b85513d84823e3d90fd5b8380fd5b604190634e487b7160e01b5f525260245ffd5b634e487b7160e01b835260118752602483fd5b61048a906157c8565b61044a57805f61029f565b84513d84823e3d90fd5b8280fd5b835162461bcd60e51b8152602081870152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606490fd5b505f1983018381116104fa57831615610246565b634e487b7160e01b835260118652602483fd5b503461049f5761051c3661579d565b60ff8360089493941c169561053961017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516327af38ad60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610809575b5050855196632fd514cd60e11b98898952602099898b81806105df338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061060b9187916107e2575b506159b8565b8215610712575b50508651908982019084825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610655826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fca101b6655df270ab4c630a5cd2c2df7b974e16b2d53387ce9ed51591f7742ed94939261042d9288926106f8575b508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b610701906157c8565b5f6106cf565b8651903d90823e3d90fd5b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d8579061074a9186916107ab575b50615d9b565b60ff8760081c160361075d575f80610612565b865162461bcd60e51b81528083018a9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b6107cb91508c8d3d106107d1575b6107c38183615844565b8101906159a0565b5f610744565b503d6107b9565b89513d87823e3d90fd5b6107f991508d803d106107d1576107c38183615844565b5f610605565b8a513d88823e3d90fd5b610812906157c8565b61081d57815f6105a4565b5080fd5b87513d85823e3d90fd5b83823461081d578160031936011261081d57602090515f80516020615e8c8339815191528152f35b833461044a57602036600319011261044a5761086d615956565b610875615c08565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461049f5761090b3661579d565b60ff8360089493941c169561092861017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516307dbdabb60e21b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610b33575b5050855196632fd514cd60e11b98898952602099898b81806109ce338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906109f99187916107e257506159b8565b8215610ae9575b505086519089820190600960f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610a47826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fdbd92baa847015c4d6cd3a7a5baeb65aaedeb3f4598aedcadd6062107f04531894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790610b209186916107ab5750615d9b565b60ff8760081c160361075d575f80610a00565b610b3c906157c8565b61081d57815f610993565b503461049f57610b563661579d565b60ff8360089493941c1695610b7361017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651633980607d60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610d7e575b5050855196632fd514cd60e11b98898952602099898b8180610c19338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790610c449187916107e257506159b8565b8215610d34575b505086519089820190600360f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610c92826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fe34d43146b8cd59adb8714914fcb0a11b9c117dfe923edb15c7d929361ce11f894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790610d6b9186916107ab5750615d9b565b60ff8760081c160361075d575f80610c4b565b610d87906157c8565b61081d57815f610bde565b503461049f578060031936011261049f578135610dad615786565b938460f81c610dc46101ff6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f57845163100747ad60e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291610f23575b5050825160208101600360fb1b815283602183015260ff60f81b871660418301525f80516020615ecc833981519152604283015246605683015260568252610e5f82615828565b61ffff19915190201661ff008660f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af1801561049557610f0f575b505081519081526001600160f81b031990931660208481019190915260408401839052927f11218712ed0401394352868fe9038b5e6ccbf9724007fd2c6757618044885b3490806060810161042d565b610f1982916157c8565b61044a5780610ebf565b610f2c906157c8565b61044a57805f610e18565b83823461081d578160031936011261081d576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b503461049f578060031936011261049f57813567ffffffffffffffff811161045757610fad9036908401615882565b92610fb6615786565b908160f81c610fcd610e006001831b161515615d4f565b5f80516020615eac833981519152803b1561049f57845163100747ad60e01b81523387820190815260ff841660208201529091849183919082908490829060400103925af1801561119b57908391611187575b505083865191600981145f1461115f575061103b9114615ae8565b82519161ff006020840193600360fb1b85528751611060816021840160208c01615910565b81019461109e60568360ff60f81b8716988960218201525f80516020615ecc8339815191526022820152466036820152036036810185520183615844565b61ffff1991519020169160f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af180156104955761114b575b50506111386020947f1113c34f59d2144e0abd8d37fb966653a61c15142afe3c606cafbb4bbc05f485928451928392606084526060840190615931565b908783015285858301520390a151908152f35b61115582916157c8565b61044a57806110fb565b600a1415905061117a5760806111759114615a76565b61103b565b6101006111759114615a04565b611190906157c8565b61081d57815f611020565b85513d85823e3d90fd5b5082903461081d576111b63661579d565b600160f81b8116949192916001600160f81b03198601611455576111db841515615bbc565b60ff8360081c16966111f561017e60018a1b161515615d4f565b5f80516020615eac833981519152803b1561049f5786516317f83edb60e31b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391611441575b5050855196632fd514cd60e11b98898952602099898b8180611293338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906112be91879161142457506159b8565b82156113bd575b505086519089820190600160fa1b825286602184015287604184015260618301525f80516020615ecc83398151915260628301524660768301526076825261130c826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f5955bd79cf32dbacc40c6b8d59b5ed35e027bfbef26c4e9db048b41a3778e16b94939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b6113b7906157c8565b896106cf565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906113f49186916114075750615d9b565b60ff8760081c160361075d5789806112c5565b61141e91508c8d3d106107d1576107c38183615844565b8c610744565b61143b91508d803d106107d1576107c38183615844565b8d610605565b61144a906157c8565b61081d578189611258565b845162461bcd60e51b81526020818901526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b503461049f57606036600319011261049f5781356024356044359060ff8160081c16956114d9610fff6001891b161515615d4f565b5f80516020615eac833981519152803b1561081d57855163d5f0797d60e01b81523381890190815260ff8a1660208201529091839183919082908490829060400103925af180156116fc5790829161184a575b50508451632fd514cd60e11b80825287820186815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d8579061158591869161183357506159b8565b87518181528381018681523360208201528b908290819060400103818d5afa9081156107d8578591611816575b50156117d35787519081528281018681523360208201528a908290819060400103818c5afa9081156117c957906115ef9185916117b25750615d9b565b60ff8660081c1661176f5760ff8560081c160361170657855196888801601960f81b81528660218a01528460418a01528560618a01525f80516020615ecc83398151915260818a01524660958a01526095895260c089019289841067ffffffffffffffff85111761045b575082885261ffff1990895190201661ff0085161797813b15610457576346ce4e4960e11b835260c481018990523360e49091015282908290604490829084905af180156116fc576116e8575b5050916080917fcb2748038781ebdf91e7fb61259ffa009fa4d389ff38772b0784b45803b527f39385519283528783015284820152846060820152a151908152f35b6116f282916157c8565b61044a57806116a6565b86513d84823e3d90fd5b855162461bcd60e51b8152908101889052602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608490fd5b865162461bcd60e51b81528083018a9052601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606490fd5b6107cb91508b3d8d116107d1576107c38183615844565b88513d86823e3d90fd5b875162461bcd60e51b81528084018b9052601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606490fd5b61182d91508b3d8d116107d1576107c38183615844565b5f6115b2565b6107f991508c8d3d106107d1576107c38183615844565b611853906157c8565b61044a57805f61152c565b50903461049f57602036600319011261049f57611879615956565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff8116801590816119b4575b60011490816119aa575b1590816119a1575b506119925767ffffffffffffffff198116600117855583611973575b506118f2615de7565b6118fa615de7565b6001600160a01b0382161561195c575061191390615c53565b61191b578280f35b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f808280f35b8451631e4fbdf760e01b8152908101869052602490fd5b68ffffffffffffffffff1916680100000000000000011784555f6118e9565b50845163f92ee8a960e01b8152fd5b9050155f6118cd565b303b1591506118c5565b8591506118bb565b503461049f576119cb366158c8565b60ff8360089493941c16956119e8610e006001891b161515615d4f565b600160f81b8216956001600160f81b03198701611c05575f80516020615eac833981519152803b1561049f57865163709c098f60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391611bf1575b50508551632fd514cd60e11b8152818101858152336020828101919091529991989190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d85790611ab991869161183357506159b8565b87875191600981145f14611bc95750611ad29114615ae8565b88611b306076895180948a611b0186840196600360fa1b88528c60218601528251928391604187019101615910565b82019060418201525f80516020615ecc8339815191526042820152466056820152036056810185520183615844565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201528391839182908490829060400103925af180156116fc579087939291611baf575b50507fdb01345c4f3b7bd8896dfe2c115602dc067bcb66e6140ac6a28555d9c228c30d93929161042d9186519485948561596c565b81929350611bbc906157c8565b61044a5790818692611b7a565b600a14159050611be4576080611bdf9114615a76565b611ad2565b610100611bdf9114615a04565b611bfa906157c8565b61081d57815f611a62565b608490602087519162461bcd60e51b8352820152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152fd5b83823461081d578160031936011261081d578051611ccb91611c8f8261580c565b600582527f352e302e30000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190615931565b0390f35b83823461081d578160031936011261081d5760209051732ed2c0473d8218e99238e6ba82a3fa50bf43f7198152f35b503461049f576020928360031936011261044a5782359060ff8260081c16611d2e61017e6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f5784516313ed41db60e31b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291611f06575b50508251632fd514cd60e11b81528481018381523360208201528190604001039086815f80516020615e8c8339815191529381855afa90811561119b578391611ee9575b5015611ea6578351868101600560fa1b81528460218301525f80516020615ecc833981519152604183015246605583015260558252611e0482615828565b61ffff19915190201661ff0084161794813b1561049f5784516346ce4e4960e11b8152908101868152336020820152909291829184919082908490829060400103925af1908115611e9b57509183917fd44a29b8a904963175fc3746c74fbb91ee1632a7e14e9a0e6be53398529acf6c93611e8c575b5081519081528486820152a151908152f35b611e95906157c8565b5f611e7a565b8451903d90823e3d90fd5b835162461bcd60e51b8152808601879052601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606490fd5b611f009150873d89116107d1576107c38183615844565b5f611dc6565b611f0f906157c8565b61044a57805f611d82565b503461049f57611f293661579d565b60ff8360089493941c1695611f4661017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651630ad2336160e41b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612151575b5050855196632fd514cd60e11b98898952602099898b8180611fec338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906120179187916107e257506159b8565b8215612107575b505086519089820190600960f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612065826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f18267ba238338c85ae081777c793518e79a4878da40902f2a0d9bc6d2be8834e94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d8579061213e9186916107ab5750615d9b565b60ff8760081c160361075d575f8061201e565b61215a906157c8565b61081d57815f611fb1565b503461049f576121743661579d565b60ff8360089493941c169561219161017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651631ade267d60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161239c575b5050855196632fd514cd60e11b98898952602099898b8180612237338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906122629187916107e257506159b8565b8215612352575b505086519089820190601360f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526122b0826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f411ff36379fe7481c69a4c1a025dcdd04aa4165c7dd55863adc2a33503a1ca7f94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906123899186916107ab5750615d9b565b60ff8760081c160361075d575f80612269565b6123a5906157c8565b61081d57815f6121fc565b503461049f576123bf3661579d565b60ff8360089493941c16956123dc61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163466ac06560e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916125e1575b5050855196632fd514cd60e11b98898952602099898b8180612482338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906124ad9187916107e257506159b8565b8215612597575b505086519089820190601160f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526124fb826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f2bee1dac90f17bc8b79a023dfb22222b8786d8f30dfabfd8e49def6388b3b88894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906125ce9186916107ab5750615d9b565b60ff8760081c160361075d575f806124b4565b6125ea906157c8565b61081d57815f612447565b503461049f57602036600319011261049f5781356001600160f81b031981169384820361044a578160f81c612632610f7f6001831b161515615ce1565b5f80516020615eac83398151915290813b1561049f5784516302cccbd160e21b81523387820190815260ff909216602083015291839183919082908490829060400103925af18015610495579082916127fe575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f1943014381116127eb578551602081019283525f80516020615ecc83398151915260408201524660548201529040607482015242609482015261ff00916126f78260b48101610309565b6fffffffffffffffffffffffffffffffff1991519020168551906020820190600d60f91b82528960218401526022830152601282526127358261580c565b61ffff1991519020169160f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af18015610495576127d7575b505081602094826127c47ff8c2522b360452dbfbd5bcbe526855aff6b9d028ee4caee8d2642a996cc290629454615d2d565b905581519081528486820152a151908152f35b6127e182916157c8565b61044a5780612792565b634e487b7160e01b845260118752602484fd5b612807906157c8565b61044a57805f612686565b83823461081d578160031936011261081d576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b503461049f576128683661579d565b60ff8360089493941c169561288561017e6001891b161515615d4f565b600160f81b958287165f80516020615eac833981519152803b156104575787516303ed3f3160e51b81523384820190815260ff8c1660208201526001600160f81b0319841660408201529091859183919082908490829060600103925af180156117c957908491612b23575b5050865197632fd514cd60e11b998a8a5260209a8a8c818061292c338d8b84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529e8f5afa908115612b19579061295a918e8992612afc575b50506159b8565b8b898c8615612a4b575b50505050508751918a830191825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526129a9826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f6474889e10e183464e682cafbc5957864fb8682dc51a102779cabc8fc2499c1e94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b8c5193845287840191825233602083015283918290819060400103915afa9081156107ff5790612a81918791612ae55750615d9b565b60ff8860081c1603612a97575f808b898c612964565b875162461bcd60e51b81528084018b9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b6107cb91508d803d106107d1576107c38183615844565b612b129250803d106107d1576107c38183615844565b5f8e612953565b8b513d89823e3d90fd5b612b2c906157c8565b61049f57825f6128f1565b503461049f57612b463661579d565b60ff8360089493941c1695612b6361017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651633968721960e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612d6e575b5050855196632fd514cd60e11b98898952602099898b8180612c09338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790612c349187916107e257506159b8565b8215612d24575b505086519089820190600160fb1b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612c82826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f9ebe62c7110336cba03426473780c0102203aeb00d3123672eba9c2bb878cb5494939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790612d5b9186916107ab5750615d9b565b60ff8760081c160361075d575f80612c3b565b612d77906157c8565b61081d57815f612bce565b503461049f57612d913661579d565b60ff8360089493941c1695612dae61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651632be8dd7960e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612fb9575b5050855196632fd514cd60e11b98898952602099898b8180612e54338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790612e7f9187916107e257506159b8565b8215612f6f575b505086519089820190600160f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612ecd826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f0989d2283d5ee26a114f8459c51f9da4cda53751648900a1b7fecc5c6952f02394939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790612fa69186916107ab5750615d9b565b60ff8760081c160361075d575f80612e86565b612fc2906157c8565b61081d57815f612e19565b503461049f578260031936011261049f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361301c578261301933615c53565b80f35b60249250519063118cdaa760e01b82523390820152fd5b833461044a578060031936011261044a5761304c615c08565b806001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461049f576130e43661579d565b60ff8360089493941c1695613101610fff6001891b161515615d4f565b600160f81b82811696908714613323575b5f80516020615eac833981519152803b1561049f57865163709c098f60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161330f575b5050855196632fd514cd60e11b98898952602099898b81806131b0338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906131db9187916107e257506159b8565b82156132c5575b505086519089820190600360fa1b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613229826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f64ec7877f22d6fdca08285a604b343d39c022789c65e3bedb5229f121bb7f3e994939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906132fc9186916107ab5750615d9b565b60ff8760081c160361075d575f806131e2565b613318906157c8565b61081d57815f613175565b600888111561311257608490602087519162461bcd60e51b8352820152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152fd5b83823461081d578160031936011261081d5751908152602090f35b503461049f576133bf3661579d565b60ff8360089493941c16956133dc61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163d692278360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916135e1575b5050855196632fd514cd60e11b98898952602099898b8180613482338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906134ad9187916107e257506159b8565b8215613597575b505086519089820190600160fc1b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526134fb826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f60922014988035600ca3a12a623206cc9ddebf14a95e0829feb779ad972a657894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906135ce9186916107ab5750615d9b565b60ff8760081c160361075d575f806134b4565b6135ea906157c8565b61081d57815f613447565b503461049f576136043661579d565b60ff8360089493941c169561362161017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163cd2bd00360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161382c575b5050855196632fd514cd60e11b98898952602099898b81806136c7338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906136f29187916107e257506159b8565b82156137e2575b505086519089820190600560f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613740826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f419268c57bdb686c5c3a209be649f9884f7c21b28195fe7c5849e62e5517131494939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906138199186916107ab5750615d9b565b60ff8760081c160361075d575f806136f9565b613835906157c8565b61081d57815f61368c565b50823461044a578060031936011261044a57506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036138ac57602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b508060031936011261049f576138cd615956565b9060243567ffffffffffffffff8111613ae8576138ed9036908501615882565b6001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115613aba575b50613aaa57613930615c08565b82516352d1902d60e01b81529084169360209182818881895afa889181613a77575b5061396e578451634c9c8ce360e01b8152808801879052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc96929591939690818103613a615750833b15613a4a5780546001600160a01b0319168217905583518792917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a2865115613a2d575050808585613a1f97519101845af4913d15613a23573d613a11613a0882615866565b92519283615844565b81528581943d92013e615e28565b5080f35b5060609250615e28565b9450945050505034613a3e57505080f35b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9091508381813d8311613aa3575b613a8f8183615844565b81010312613a9f5751905f613952565b8880fd5b503d613a85565b825163703e46dd60e11b81528590fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f613923565b8480fd5b503461049f578060031936011261049f578135613b07615786565b8251632fd514cd60e11b8152848101838152336020828101919091529692939291908190604001039087815f80516020615e8c8339815191529381855afa908115613de3578391613dc6575b5015613d835760ff8360081c16613b7261017f6001831b161515615d4f565b61017e60018660f81c1b1615613d40576001600160f81b0319858116919060f086901b168214613cfd575f80516020615eac833981519152803b15613ae8578751630cea149360e41b815233818b0190815260ff9093166020840152918591839182908490829060400103925af18015613cf357908491613cdf575b505085519088820190601760f81b825285602184015260418301525f80516020615ecc833981519152604283015246605683015260568252613c2f82615828565b61ffff19915190201661ff008560f01c161795813b1561049f5785516346ce4e4960e11b81529081018781523360208201529091839183919082908490829060400103925af1801561044d57613ccb575b505082519081526001600160f81b03199091166020820152604081018390527fce79b6444dc9b93ecddbc13b55eaecf50a20eb779fa5b59f358bd16ab82a966790806060810161042d565b613cd582916157c8565b61044a5780613c80565b613ce8906157c8565b61049f57825f613bee565b87513d86823e3d90fd5b865162461bcd60e51b81528089018a9052601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606490fd5b855162461bcd60e51b8152808801899052601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606490fd5b845162461bcd60e51b8152808701889052601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606490fd5b613ddd9150883d8a116107d1576107c38183615844565b5f613b53565b86513d85823e3d90fd5b503461049f57613dfc3661579d565b60ff8360089493941c1695613e1961017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516313f3d32960e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614024575b5050855196632fd514cd60e11b98898952602099898b8180613ebf338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790613eea9187916107e257506159b8565b8215613fda575b505086519089820190600b60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613f38826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fd42970039fe3f91ed8c5a4aea3d626defdb62b542b70d6f0dd2b56fcfac120f594939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906140119186916107ab5750615d9b565b60ff8760081c160361075d575f80613ef1565b61402d906157c8565b61081d57815f613e84565b503461049f576140473661579d565b60ff8360089493941c169561406461017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651638638282b60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614269575b5050855196632fd514cd60e11b98898952602099898b818061410a338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906141359187916107e257506159b8565b821561421f575b505086519089820190600f60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252614183826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fa0da53ac7741df5d78f645cb77e6577ba9e246906a77e17286f285a916dff70894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906142569186916107ab5750615d9b565b60ff8760081c160361075d575f8061413c565b614272906157c8565b61081d57815f6140cf565b5082903461081d5761428e3661579d565b600160f81b8116949192916001600160f81b031986016144e4576142b3841515615bbc565b60ff8360081c16966142cd61017e60018a1b161515615d4f565b5f80516020615eac833981519152803b1561049f57865163f7eaec6360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916144d0575b5050855196632fd514cd60e11b98898952602099898b818061436b338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061439691879161142457506159b8565b8215614486575b505086519089820190600360f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526143e4826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f9968f8dbde1f175af00b6630b7b30747c77be278fd2e64c281458c0d4700843194939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906144bd9186916114075750615d9b565b60ff8760081c160361075d57898061439d565b6144d9906157c8565b61081d578189614330565b845162461bcd60e51b81526020818901526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b503461049f57608036600319011261049f578135602435906001600160a01b039384831680930361478a5767ffffffffffffffff9560443587811161081d5761457f9036908401615882565b906064359260ff60f81b84169384810361049f5787519960608b019081118b8210176147775788525f80516020615e8c83398151915290818b5260209a8b8101908982528a81019233845260ff8a60081c169060f81c03614734578a51634d52c10760e01b815290518c168186015290518b166024820152905190991660448a01526064890186905260a060848a015289898061461f60a4820188615931565b038186732ed2c0473d8218e99238e6ba82a3fa50bf43f7195af198891561472a5783996146fb575b50803b1561049f5787516346ce4e4960e11b81529182018981523360208201528391839182908490829060400103925af180156146f1576146dd575b5050906146c87f777462f58dda134f765b89f211d136b25f0d06d218cb2c311f1c43f2a2392b49949392865194859485528985015260a08785015260a0840190615931565b9060608301528560808301520390a151908152f35b6146e782916157c8565b61044a5780614683565b87513d84823e3d90fd5b9098508981813d8311614723575b6147138183615844565b8101031261049f5751975f614647565b503d614709565b88513d85823e3d90fd5b8a5162461bcd60e51b81528086018e9052600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b845260418352602484fd5b8580fd5b503461049f5761479d3661579d565b60ff8360089493941c16956147ba61017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163473dceed60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916149c5575b5050855196632fd514cd60e11b98898952602099898b8180614860338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061488b9187916107e257506159b8565b821561497b575b505086519089820190600760f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526148d9826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f31a58348e92aca95ce44cfea2a1066053d8807feb5ed9bbdfe95e13a622e21f294939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906149b29186916107ab5750615d9b565b60ff8760081c160361075d575f80614892565b6149ce906157c8565b61081d57815f614825565b83823461081d578160031936011261081d57602090515f80516020615eac8339815191528152f35b503461049f57614a103661579d565b60ff8360089493941c1695614a2d610fff6001891b161515615d4f565b600160f81b82811696908714614c4f575b5f80516020615eac833981519152803b1561049f5786516399841ed760e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614c3b575b5050855196632fd514cd60e11b98898952602099898b8180614adc338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790614b079187916107e257506159b8565b8215614bf1575b505086519089820190600d60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252614b55826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fd43ba81a7c94579d65cbb7db5db8dcf366ff05bdecd1d927fcc99840c68571a594939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790614c289186916107ab5750615d9b565b60ff8760081c160361075d575f80614b0e565b614c44906157c8565b61081d57815f614aa1565b6008881115614a3e57608490602087519162461bcd60e51b8352820152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152fd5b503461049f576020928360031936011261044a5782359060ff8260081c16614cf161017f6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f57845163aa43b7f960e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291614e6b575b50508251632fd514cd60e11b81528481018381523360208201528190604001039086815f80516020615e8c8339815191529381855afa90811561119b578391614e4e575b5015611ea6578351868101601560f81b81528460218301525f80516020615ecc833981519152604183015246605583015260558252614dc782615828565b61ffff19915190201661ff0084161794813b1561049f5784516346ce4e4960e11b8152908101868152336020820152909291829184919082908490829060400103925af1908115611e9b57509183917f9a9785c912b1ce9b03afbd78573bd048c160bd5a489c02f52a3eb9703a718f2493611e8c575081519081528486820152a151908152f35b614e659150873d89116107d1576107c38183615844565b5f614d89565b614e74906157c8565b61044a57805f614d45565b5082903461081d578160031936011261081d57805190614e9e8261580c565b600c82526020938285809401947f544648454578656375746f7200000000000000000000000000000000000000008652614ed6615b5a565b600180830192919080806021614f03614eee88615866565b97614efb8c51998a615844565b808952615866565b878c019690601f1901368837870101905b614fbb575b50505096614fac949260249492611ccb9899614f33615b5a565b93614f488a519d8e9751928391890190615910565b850161103b60f11b8c820152614f688c8351938491602285019101615910565b01614f85601760f91b938460228401525180936023840190615910565b01906023820152614f9e825180938b8885019101615910565b010390810187520185615844565b51928284938452830190615931565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614fec57919082614f14565b614f19565b503461521057615000366158c8565b60ff8360089493941c169561501d610e006001891b161515615d4f565b600160f81b8216956001600160f81b03198701615214575f80516020615eac833981519152803b156152105786516399841ed760e01b81523383820190815260ff8b1660208201526001600160f81b03198a16604082015290915f9183919082908490829060600103925af18015615206576151f3575b508551632fd514cd60e11b8152818101858152336020828101919091529991989190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d857906150ea91869161183357506159b8565b87875191600981145f146151cb57506151039114615ae8565b886151326076895180948a611b0186840196600d60f81b88528c60218601528251928391604187019101615910565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201528391839182908490829060400103925af180156116fc5790879392916151b1575b50507f5b7bbda9449c32c1d56a33ee9be18d67a28f5faead25db7ab04fa217000cecf793929161042d9186519485948561596c565b819293506151be906157c8565b61044a579081869261517c565b600a141590506151e65760806151e19114615a76565b615103565b6101006151e19114615a04565b6151fe9192506157c8565b5f905f615094565b87513d5f823e3d90fd5b5f80fd5b608490602087519162461bcd60e51b8352820152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152fd5b5090346152105761528d3661579d565b939160ff8160081c16946152a961017e6001881b161515615d4f565b600160f81b8116945f80516020615eac833981519152803b1561521057855163b25fd54760e01b81523383820190815260ff8a1660208201526001600160f81b03198916604082015290915f9183919082908490829060600103925af1801561555357615544575b508451632fd514cd60e11b80825282820185815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa90811561553a5790615369915f9161551d57506159b8565b821561545e575b505085519088820190600560f91b825285602184015286604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526153b7826157f0565b61ffff19915190201661ff0084161795803b156152105785516346ce4e4960e11b81529182018781523360208201525f91839182908490829060400103925af18015615454577ff58687e1e87ebb2fe49b53f406501933e51bed3f62e278ac0bf3203a26a9e2e994939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b85513d5f823e3d90fd5b87519081528381018781523360208201528a908290819060400103818c5afa9081156155135790615495915f916154f65750615d9b565b60ff8660081c16036154a8578880615370565b855162461bcd60e51b8152808301899052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61550d91508b3d8d116107d1576107c38183615844565b8b610744565b88513d5f823e3d90fd5b61553491508c8d3d106107d1576107c38183615844565b8c610605565b89513d5f823e3d90fd5b61554d906157c8565b87615311565b86513d5f823e3d90fd5b5090346152105761556d3661579d565b939160ff8160081c169461558961017e6001881b161515615d4f565b600160f81b8116945f80516020615eac833981519152803b1561521057855162fabc1960e21b81523383820190815260ff8a1660208201526001600160f81b03198916604082015290915f9183919082908490829060600103925af1801561555357615777575b508451632fd514cd60e11b80825282820185815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa90811561553a5790615648915f9161551d57506159b8565b821561572d575b505085519088820190600760f91b825285602184015286604184015260618301525f80516020615ecc833981519152606283015246607683015260768252615696826157f0565b9051902061ffff191695803b156152105785516346ce4e4960e11b81529182018781523360208201525f91839182908490829060400103925af18015615454577f917801ccb010364b80d82085948b6ce1f7231e1e6950253ca1134a2dace3113294939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b87519081528381018781523360208201528a908290819060400103818c5afa9081156155135790615764915f916154f65750615d9b565b60ff8660081c16036154a857888061564f565b615780906157c8565b876155f0565b602435906001600160f81b03198216820361521057565b60609060031901126152105760043590602435906044356001600160f81b0319811681036152105790565b67ffffffffffffffff81116157dc57604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff8211176157dc57604052565b6040810190811067ffffffffffffffff8211176157dc57604052565b6080810190811067ffffffffffffffff8211176157dc57604052565b90601f8019910116810190811067ffffffffffffffff8211176157dc57604052565b67ffffffffffffffff81116157dc57601f01601f191660200190565b81601f820112156152105780359061589982615866565b926158a76040519485615844565b8284526020838301011161521057815f926020809301838601378301015290565b90606060031983011261521057600435916024359067ffffffffffffffff8211615210576158f891600401615882565b906044356001600160f81b0319811681036152105790565b5f5b8381106159215750505f910152565b8181015183820152602001615912565b9060209161594a81518092818552858086019101615910565b601f01601f1916010190565b600435906001600160a01b038216820361521057565b9060609261598b91969594968352608060208401526080830190615931565b6001600160f81b031990951660408201520152565b90816020910312615210575180151581036152105790565b156159bf57565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606490fd5b15615a0b57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201527f686f756c642062652032353600000000000000000000000000000000000000006064820152608490fd5b15615a7d57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201527f686f756c642062652031323800000000000000000000000000000000000000006064820152608490fd5b15615aef57565b60405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f66204279746573363420736860448201527f6f756c64206265203634000000000000000000000000000000000000000000006064820152608490fd5b6040515f615b678261580c565b600190600183526020368185013760218301825b615b86575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215615bb757919082615b7b565b615b80565b15615bc357565b60405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606490fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303615c3b57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b15615ce857565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606490fd5b5f198114615d3b5760010190565b634e487b7160e01b5f52601160045260245ffd5b15615d5657565b60405162461bcd60e51b815260206004820152601060248201527f556e737570706f727465642074797065000000000000000000000000000000006044820152606490fd5b15615da257565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615615e1657565b604051631afcd79f60e31b8152600490fd5b90615e4f5750805115615e3d57805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580615e82575b615e60575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15615e5856fe0000000000000000000000001f2f59242e4f8186e18463d8c9f1a7cc6d425f530000000000000000000000008f8e203122ba1d2d0d1982a34404005cbf94a5ab1f2f59242e4f8186e18463d8c9f1a7cc6d425f53000000000000000000000000a164736f6c6343000818000a", + "deployedBytecode": "0x604060808152600480361015610013575f80fd5b5f915f3560e01c8063052896f11461555d578063059073431461527d5780630b90dfc314614ff15780630d8e6e2c14614e7f57806313801ffa14614cc15780631927108114614a01578063275e36bf146149d95780632c7d67b71461478e5780632e817ff01461453357806336cdd31b1461427d5780633e63c50a1461403857806344ae9c5c14613ded5780634be68d2014613aec5780634f1ef286146138b957806352d1902d14613840578063666a3588146135f5578063694daf72146133b05780636a8c8eb4146133955780636be31758146130d5578063715018a61461303357806379ba509714612fcd578063816d57d314612d8257806389a4314b14612b375780638c14cc21146128595780638da5cb5b14612812578063900d294e146125f55780639675211f146123b0578063a86e9de514612165578063a87deac414611f1a578063a8b42a8914611cfe578063a8c7c2c114611ccf578063ad3cb1cc14611c6e578063bc47139a146119bc578063c4d66de81461185e578063cb3b9407146114a4578063e0c516ae146111a5578063e0c5cbb314610f7e578063e30c397814610f37578063e71746b814610d92578063ec4057dc14610b47578063eee1833c146108fc578063f2fde38b14610853578063f6859bdc1461082b578063f953e4271461050d5763fa33b7af1461020c575f80fd5b3461049f578060031936011261049f578135610226615786565b938460f81c61023d61017e6001831b161515615ce1565b821515806104e6575b156104a3575f80516020615eac83398151915290813b1561049f578451639bf5592160e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291610481575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009081545f19430143811161046e578551602081019283525f80516020615ecc833981519152604082015246605482015290406074820152426094820152906103178260b481015b03601f198101845283615844565b905190208451601b60f81b60208201908152602182018690526001600160f81b0319891660418301526fffffffffffffffffffffffffffffffff199092166042820152603281529560608701919087831067ffffffffffffffff84111761045b575081865261ffff1990875190201661ff008860f01c1617955f80516020615e8c83398151915290813b15610457576346ce4e4960e11b8352606481018890523360849091015282908290604490829084905af1801561044d57610436575b5050937f92331e27bd97df8f1490a60822d7d55e23a39dcbf856ff4ad171be686e9df97b918561040860209754615d2d565b905583519081526001600160f81b031990911660208201526040810184905280606081015b0390a151908152f35b61044082916157c8565b61044a57806103d6565b80fd5b85513d84823e3d90fd5b8380fd5b604190634e487b7160e01b5f525260245ffd5b634e487b7160e01b835260118752602483fd5b61048a906157c8565b61044a57805f61029f565b84513d84823e3d90fd5b8280fd5b835162461bcd60e51b8152602081870152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606490fd5b505f1983018381116104fa57831615610246565b634e487b7160e01b835260118652602483fd5b503461049f5761051c3661579d565b60ff8360089493941c169561053961017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516327af38ad60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610809575b5050855196632fd514cd60e11b98898952602099898b81806105df338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061060b9187916107e2575b506159b8565b8215610712575b50508651908982019084825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610655826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fca101b6655df270ab4c630a5cd2c2df7b974e16b2d53387ce9ed51591f7742ed94939261042d9288926106f8575b508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b610701906157c8565b5f6106cf565b8651903d90823e3d90fd5b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d8579061074a9186916107ab575b50615d9b565b60ff8760081c160361075d575f80610612565b865162461bcd60e51b81528083018a9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b6107cb91508c8d3d106107d1575b6107c38183615844565b8101906159a0565b5f610744565b503d6107b9565b89513d87823e3d90fd5b6107f991508d803d106107d1576107c38183615844565b5f610605565b8a513d88823e3d90fd5b610812906157c8565b61081d57815f6105a4565b5080fd5b87513d85823e3d90fd5b83823461081d578160031936011261081d57602090515f80516020615e8c8339815191528152f35b833461044a57602036600319011261044a5761086d615956565b610875615c08565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461049f5761090b3661579d565b60ff8360089493941c169561092861017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516307dbdabb60e21b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610b33575b5050855196632fd514cd60e11b98898952602099898b81806109ce338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906109f99187916107e257506159b8565b8215610ae9575b505086519089820190600960f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610a47826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fdbd92baa847015c4d6cd3a7a5baeb65aaedeb3f4598aedcadd6062107f04531894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790610b209186916107ab5750615d9b565b60ff8760081c160361075d575f80610a00565b610b3c906157c8565b61081d57815f610993565b503461049f57610b563661579d565b60ff8360089493941c1695610b7361017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651633980607d60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391610d7e575b5050855196632fd514cd60e11b98898952602099898b8180610c19338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790610c449187916107e257506159b8565b8215610d34575b505086519089820190600360f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252610c92826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fe34d43146b8cd59adb8714914fcb0a11b9c117dfe923edb15c7d929361ce11f894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790610d6b9186916107ab5750615d9b565b60ff8760081c160361075d575f80610c4b565b610d87906157c8565b61081d57815f610bde565b503461049f578060031936011261049f578135610dad615786565b938460f81c610dc46101ff6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f57845163100747ad60e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291610f23575b5050825160208101600360fb1b815283602183015260ff60f81b871660418301525f80516020615ecc833981519152604283015246605683015260568252610e5f82615828565b61ffff19915190201661ff008660f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af1801561049557610f0f575b505081519081526001600160f81b031990931660208481019190915260408401839052927f11218712ed0401394352868fe9038b5e6ccbf9724007fd2c6757618044885b3490806060810161042d565b610f1982916157c8565b61044a5780610ebf565b610f2c906157c8565b61044a57805f610e18565b83823461081d578160031936011261081d576020906001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054169051908152f35b503461049f578060031936011261049f57813567ffffffffffffffff811161045757610fad9036908401615882565b92610fb6615786565b908160f81c610fcd610e006001831b161515615d4f565b5f80516020615eac833981519152803b1561049f57845163100747ad60e01b81523387820190815260ff841660208201529091849183919082908490829060400103925af1801561119b57908391611187575b505083865191600981145f1461115f575061103b9114615ae8565b82519161ff006020840193600360fb1b85528751611060816021840160208c01615910565b81019461109e60568360ff60f81b8716988960218201525f80516020615ecc8339815191526022820152466036820152036036810185520183615844565b61ffff1991519020169160f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af180156104955761114b575b50506111386020947f1113c34f59d2144e0abd8d37fb966653a61c15142afe3c606cafbb4bbc05f485928451928392606084526060840190615931565b908783015285858301520390a151908152f35b61115582916157c8565b61044a57806110fb565b600a1415905061117a5760806111759114615a76565b61103b565b6101006111759114615a04565b611190906157c8565b61081d57815f611020565b85513d85823e3d90fd5b5082903461081d576111b63661579d565b600160f81b8116949192916001600160f81b03198601611455576111db841515615bbc565b60ff8360081c16966111f561017e60018a1b161515615d4f565b5f80516020615eac833981519152803b1561049f5786516317f83edb60e31b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391611441575b5050855196632fd514cd60e11b98898952602099898b8180611293338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906112be91879161142457506159b8565b82156113bd575b505086519089820190600160fa1b825286602184015287604184015260618301525f80516020615ecc83398151915260628301524660768301526076825261130c826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f5955bd79cf32dbacc40c6b8d59b5ed35e027bfbef26c4e9db048b41a3778e16b94939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b6113b7906157c8565b896106cf565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906113f49186916114075750615d9b565b60ff8760081c160361075d5789806112c5565b61141e91508c8d3d106107d1576107c38183615844565b8c610744565b61143b91508d803d106107d1576107c38183615844565b8d610605565b61144a906157c8565b61081d578189611258565b845162461bcd60e51b81526020818901526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b503461049f57606036600319011261049f5781356024356044359060ff8160081c16956114d9610fff6001891b161515615d4f565b5f80516020615eac833981519152803b1561081d57855163d5f0797d60e01b81523381890190815260ff8a1660208201529091839183919082908490829060400103925af180156116fc5790829161184a575b50508451632fd514cd60e11b80825287820186815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d8579061158591869161183357506159b8565b87518181528381018681523360208201528b908290819060400103818d5afa9081156107d8578591611816575b50156117d35787519081528281018681523360208201528a908290819060400103818c5afa9081156117c957906115ef9185916117b25750615d9b565b60ff8660081c1661176f5760ff8560081c160361170657855196888801601960f81b81528660218a01528460418a01528560618a01525f80516020615ecc83398151915260818a01524660958a01526095895260c089019289841067ffffffffffffffff85111761045b575082885261ffff1990895190201661ff0085161797813b15610457576346ce4e4960e11b835260c481018990523360e49091015282908290604490829084905af180156116fc576116e8575b5050916080917fcb2748038781ebdf91e7fb61259ffa009fa4d389ff38772b0784b45803b527f39385519283528783015284820152846060820152a151908152f35b6116f282916157c8565b61044a57806116a6565b86513d84823e3d90fd5b855162461bcd60e51b8152908101889052602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608490fd5b865162461bcd60e51b81528083018a9052601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606490fd5b6107cb91508b3d8d116107d1576107c38183615844565b88513d86823e3d90fd5b875162461bcd60e51b81528084018b9052601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606490fd5b61182d91508b3d8d116107d1576107c38183615844565b5f6115b2565b6107f991508c8d3d106107d1576107c38183615844565b611853906157c8565b61044a57805f61152c565b50903461049f57602036600319011261049f57611879615956565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009182549160ff83861c16159267ffffffffffffffff8116801590816119b4575b60011490816119aa575b1590816119a1575b506119925767ffffffffffffffff198116600117855583611973575b506118f2615de7565b6118fa615de7565b6001600160a01b0382161561195c575061191390615c53565b61191b578280f35b805468ff00000000000000001916905551600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f808280f35b8451631e4fbdf760e01b8152908101869052602490fd5b68ffffffffffffffffff1916680100000000000000011784555f6118e9565b50845163f92ee8a960e01b8152fd5b9050155f6118cd565b303b1591506118c5565b8591506118bb565b503461049f576119cb366158c8565b60ff8360089493941c16956119e8610e006001891b161515615d4f565b600160f81b8216956001600160f81b03198701611c05575f80516020615eac833981519152803b1561049f57865163709c098f60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391611bf1575b50508551632fd514cd60e11b8152818101858152336020828101919091529991989190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d85790611ab991869161183357506159b8565b87875191600981145f14611bc95750611ad29114615ae8565b88611b306076895180948a611b0186840196600360fa1b88528c60218601528251928391604187019101615910565b82019060418201525f80516020615ecc8339815191526042820152466056820152036056810185520183615844565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201528391839182908490829060400103925af180156116fc579087939291611baf575b50507fdb01345c4f3b7bd8896dfe2c115602dc067bcb66e6140ac6a28555d9c228c30d93929161042d9186519485948561596c565b81929350611bbc906157c8565b61044a5790818692611b7a565b600a14159050611be4576080611bdf9114615a76565b611ad2565b610100611bdf9114615a04565b611bfa906157c8565b61081d57815f611a62565b608490602087519162461bcd60e51b8352820152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152fd5b83823461081d578160031936011261081d578051611ccb91611c8f8261580c565b600582527f352e302e30000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190615931565b0390f35b83823461081d578160031936011261081d5760209051732ed2c0473d8218e99238e6ba82a3fa50bf43f7198152f35b503461049f576020928360031936011261044a5782359060ff8260081c16611d2e61017e6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f5784516313ed41db60e31b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291611f06575b50508251632fd514cd60e11b81528481018381523360208201528190604001039086815f80516020615e8c8339815191529381855afa90811561119b578391611ee9575b5015611ea6578351868101600560fa1b81528460218301525f80516020615ecc833981519152604183015246605583015260558252611e0482615828565b61ffff19915190201661ff0084161794813b1561049f5784516346ce4e4960e11b8152908101868152336020820152909291829184919082908490829060400103925af1908115611e9b57509183917fd44a29b8a904963175fc3746c74fbb91ee1632a7e14e9a0e6be53398529acf6c93611e8c575b5081519081528486820152a151908152f35b611e95906157c8565b5f611e7a565b8451903d90823e3d90fd5b835162461bcd60e51b8152808601879052601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606490fd5b611f009150873d89116107d1576107c38183615844565b5f611dc6565b611f0f906157c8565b61044a57805f611d82565b503461049f57611f293661579d565b60ff8360089493941c1695611f4661017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651630ad2336160e41b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612151575b5050855196632fd514cd60e11b98898952602099898b8180611fec338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906120179187916107e257506159b8565b8215612107575b505086519089820190600960f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612065826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f18267ba238338c85ae081777c793518e79a4878da40902f2a0d9bc6d2be8834e94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d8579061213e9186916107ab5750615d9b565b60ff8760081c160361075d575f8061201e565b61215a906157c8565b61081d57815f611fb1565b503461049f576121743661579d565b60ff8360089493941c169561219161017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651631ade267d60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161239c575b5050855196632fd514cd60e11b98898952602099898b8180612237338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906122629187916107e257506159b8565b8215612352575b505086519089820190601360f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526122b0826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f411ff36379fe7481c69a4c1a025dcdd04aa4165c7dd55863adc2a33503a1ca7f94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906123899186916107ab5750615d9b565b60ff8760081c160361075d575f80612269565b6123a5906157c8565b61081d57815f6121fc565b503461049f576123bf3661579d565b60ff8360089493941c16956123dc61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163466ac06560e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916125e1575b5050855196632fd514cd60e11b98898952602099898b8180612482338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906124ad9187916107e257506159b8565b8215612597575b505086519089820190601160f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526124fb826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f2bee1dac90f17bc8b79a023dfb22222b8786d8f30dfabfd8e49def6388b3b88894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906125ce9186916107ab5750615d9b565b60ff8760081c160361075d575f806124b4565b6125ea906157c8565b61081d57815f612447565b503461049f57602036600319011261049f5781356001600160f81b031981169384820361044a578160f81c612632610f7f6001831b161515615ce1565b5f80516020615eac83398151915290813b1561049f5784516302cccbd160e21b81523387820190815260ff909216602083015291839183919082908490829060400103925af18015610495579082916127fe575b50507fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e009182545f1943014381116127eb578551602081019283525f80516020615ecc83398151915260408201524660548201529040607482015242609482015261ff00916126f78260b48101610309565b6fffffffffffffffffffffffffffffffff1991519020168551906020820190600d60f91b82528960218401526022830152601282526127358261580c565b61ffff1991519020169160f01c1617935f80516020615e8c83398151915290813b1561049f5784516346ce4e4960e11b81529081018681523360208201529091839183919082908490829060400103925af18015610495576127d7575b505081602094826127c47ff8c2522b360452dbfbd5bcbe526855aff6b9d028ee4caee8d2642a996cc290629454615d2d565b905581519081528486820152a151908152f35b6127e182916157c8565b61044a5780612792565b634e487b7160e01b845260118752602484fd5b612807906157c8565b61044a57805f612686565b83823461081d578160031936011261081d576020906001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054169051908152f35b503461049f576128683661579d565b60ff8360089493941c169561288561017e6001891b161515615d4f565b600160f81b958287165f80516020615eac833981519152803b156104575787516303ed3f3160e51b81523384820190815260ff8c1660208201526001600160f81b0319841660408201529091859183919082908490829060600103925af180156117c957908491612b23575b5050865197632fd514cd60e11b998a8a5260209a8a8c818061292c338d8b84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529e8f5afa908115612b19579061295a918e8992612afc575b50506159b8565b8b898c8615612a4b575b50505050508751918a830191825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526129a9826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f6474889e10e183464e682cafbc5957864fb8682dc51a102779cabc8fc2499c1e94939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b8c5193845287840191825233602083015283918290819060400103915afa9081156107ff5790612a81918791612ae55750615d9b565b60ff8860081c1603612a97575f808b898c612964565b875162461bcd60e51b81528084018b9052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b6107cb91508d803d106107d1576107c38183615844565b612b129250803d106107d1576107c38183615844565b5f8e612953565b8b513d89823e3d90fd5b612b2c906157c8565b61049f57825f6128f1565b503461049f57612b463661579d565b60ff8360089493941c1695612b6361017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651633968721960e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612d6e575b5050855196632fd514cd60e11b98898952602099898b8180612c09338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790612c349187916107e257506159b8565b8215612d24575b505086519089820190600160fb1b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612c82826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f9ebe62c7110336cba03426473780c0102203aeb00d3123672eba9c2bb878cb5494939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790612d5b9186916107ab5750615d9b565b60ff8760081c160361075d575f80612c3b565b612d77906157c8565b61081d57815f612bce565b503461049f57612d913661579d565b60ff8360089493941c1695612dae61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651632be8dd7960e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391612fb9575b5050855196632fd514cd60e11b98898952602099898b8180612e54338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790612e7f9187916107e257506159b8565b8215612f6f575b505086519089820190600160f91b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252612ecd826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f0989d2283d5ee26a114f8459c51f9da4cda53751648900a1b7fecc5c6952f02394939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790612fa69186916107ab5750615d9b565b60ff8760081c160361075d575f80612e86565b612fc2906157c8565b61081d57815f612e19565b503461049f578260031936011261049f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0054160361301c578261301933615c53565b80f35b60249250519063118cdaa760e01b82523390820152fd5b833461044a578060031936011261044a5761304c615c08565b806001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461049f576130e43661579d565b60ff8360089493941c1695613101610fff6001891b161515615d4f565b600160f81b82811696908714613323575b5f80516020615eac833981519152803b1561049f57865163709c098f60e11b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161330f575b5050855196632fd514cd60e11b98898952602099898b81806131b0338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906131db9187916107e257506159b8565b82156132c5575b505086519089820190600360fa1b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613229826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f64ec7877f22d6fdca08285a604b343d39c022789c65e3bedb5229f121bb7f3e994939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906132fc9186916107ab5750615d9b565b60ff8760081c160361075d575f806131e2565b613318906157c8565b61081d57815f613175565b600888111561311257608490602087519162461bcd60e51b8352820152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152fd5b83823461081d578160031936011261081d5751908152602090f35b503461049f576133bf3661579d565b60ff8360089493941c16956133dc61017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163d692278360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916135e1575b5050855196632fd514cd60e11b98898952602099898b8180613482338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906134ad9187916107e257506159b8565b8215613597575b505086519089820190600160fc1b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526134fb826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f60922014988035600ca3a12a623206cc9ddebf14a95e0829feb779ad972a657894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906135ce9186916107ab5750615d9b565b60ff8760081c160361075d575f806134b4565b6135ea906157c8565b61081d57815f613447565b503461049f576136043661579d565b60ff8360089493941c169561362161017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163cd2bd00360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af180156108215790839161382c575b5050855196632fd514cd60e11b98898952602099898b81806136c7338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906136f29187916107e257506159b8565b82156137e2575b505086519089820190600560f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613740826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f419268c57bdb686c5c3a209be649f9884f7c21b28195fe7c5849e62e5517131494939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906138199186916107ab5750615d9b565b60ff8760081c160361075d575f806136f9565b613835906157c8565b61081d57815f61368c565b50823461044a578060031936011261044a57506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036138ac57602090517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b5163703e46dd60e11b8152fd5b508060031936011261049f576138cd615956565b9060243567ffffffffffffffff8111613ae8576138ed9036908501615882565b6001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115613aba575b50613aaa57613930615c08565b82516352d1902d60e01b81529084169360209182818881895afa889181613a77575b5061396e578451634c9c8ce360e01b8152808801879052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc96929591939690818103613a615750833b15613a4a5780546001600160a01b0319168217905583518792917fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a2865115613a2d575050808585613a1f97519101845af4913d15613a23573d613a11613a0882615866565b92519283615844565b81528581943d92013e615e28565b5080f35b5060609250615e28565b9450945050505034613a3e57505080f35b63b398979f60e01b8152fd5b8451634c9c8ce360e01b8152808401839052602490fd5b83602491875191632a87526960e21b8352820152fd5b9091508381813d8311613aa3575b613a8f8183615844565b81010312613a9f5751905f613952565b8880fd5b503d613a85565b825163703e46dd60e11b81528590fd5b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f613923565b8480fd5b503461049f578060031936011261049f578135613b07615786565b8251632fd514cd60e11b8152848101838152336020828101919091529692939291908190604001039087815f80516020615e8c8339815191529381855afa908115613de3578391613dc6575b5015613d835760ff8360081c16613b7261017f6001831b161515615d4f565b61017e60018660f81c1b1615613d40576001600160f81b0319858116919060f086901b168214613cfd575f80516020615eac833981519152803b15613ae8578751630cea149360e41b815233818b0190815260ff9093166020840152918591839182908490829060400103925af18015613cf357908491613cdf575b505085519088820190601760f81b825285602184015260418301525f80516020615ecc833981519152604283015246605683015260568252613c2f82615828565b61ffff19915190201661ff008560f01c161795813b1561049f5785516346ce4e4960e11b81529081018781523360208201529091839183919082908490829060400103925af1801561044d57613ccb575b505082519081526001600160f81b03199091166020820152604081018390527fce79b6444dc9b93ecddbc13b55eaecf50a20eb779fa5b59f358bd16ab82a966790806060810161042d565b613cd582916157c8565b61044a5780613c80565b613ce8906157c8565b61049f57825f613bee565b87513d86823e3d90fd5b865162461bcd60e51b81528089018a9052601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606490fd5b855162461bcd60e51b8152808801899052601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606490fd5b845162461bcd60e51b8152808701889052601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606490fd5b613ddd9150883d8a116107d1576107c38183615844565b5f613b53565b86513d85823e3d90fd5b503461049f57613dfc3661579d565b60ff8360089493941c1695613e1961017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f5786516313f3d32960e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614024575b5050855196632fd514cd60e11b98898952602099898b8180613ebf338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790613eea9187916107e257506159b8565b8215613fda575b505086519089820190600b60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252613f38826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fd42970039fe3f91ed8c5a4aea3d626defdb62b542b70d6f0dd2b56fcfac120f594939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906140119186916107ab5750615d9b565b60ff8760081c160361075d575f80613ef1565b61402d906157c8565b61081d57815f613e84565b503461049f576140473661579d565b60ff8360089493941c169561406461017e6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f578651638638282b60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614269575b5050855196632fd514cd60e11b98898952602099898b818061410a338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff57906141359187916107e257506159b8565b821561421f575b505086519089820190600f60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252614183826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fa0da53ac7741df5d78f645cb77e6577ba9e246906a77e17286f285a916dff70894939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906142569186916107ab5750615d9b565b60ff8760081c160361075d575f8061413c565b614272906157c8565b61081d57815f6140cf565b5082903461081d5761428e3661579d565b600160f81b8116949192916001600160f81b031986016144e4576142b3841515615bbc565b60ff8360081c16966142cd61017e60018a1b161515615d4f565b5f80516020615eac833981519152803b1561049f57865163f7eaec6360e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916144d0575b5050855196632fd514cd60e11b98898952602099898b818061436b338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061439691879161142457506159b8565b8215614486575b505086519089820190600360f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526143e4826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f9968f8dbde1f175af00b6630b7b30747c77be278fd2e64c281458c0d4700843194939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906144bd9186916114075750615d9b565b60ff8760081c160361075d57898061439d565b6144d9906157c8565b61081d578189614330565b845162461bcd60e51b81526020818901526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608490fd5b503461049f57608036600319011261049f578135602435906001600160a01b039384831680930361478a5767ffffffffffffffff9560443587811161081d5761457f9036908401615882565b906064359260ff60f81b84169384810361049f5787519960608b019081118b8210176147775788525f80516020615e8c83398151915290818b5260209a8b8101908982528a81019233845260ff8a60081c169060f81c03614734578a51634d52c10760e01b815290518c168186015290518b166024820152905190991660448a01526064890186905260a060848a015289898061461f60a4820188615931565b038186732ed2c0473d8218e99238e6ba82a3fa50bf43f7195af198891561472a5783996146fb575b50803b1561049f5787516346ce4e4960e11b81529182018981523360208201528391839182908490829060400103925af180156146f1576146dd575b5050906146c87f777462f58dda134f765b89f211d136b25f0d06d218cb2c311f1c43f2a2392b49949392865194859485528985015260a08785015260a0840190615931565b9060608301528560808301520390a151908152f35b6146e782916157c8565b61044a5780614683565b87513d84823e3d90fd5b9098508981813d8311614723575b6147138183615844565b8101031261049f5751975f614647565b503d614709565b88513d85823e3d90fd5b8a5162461bcd60e51b81528086018e9052600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606490fd5b634e487b7160e01b845260418352602484fd5b8580fd5b503461049f5761479d3661579d565b60ff8360089493941c16956147ba61017f6001891b161515615d4f565b600160f81b8216955f80516020615eac833981519152803b1561049f57865163473dceed60e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af18015610821579083916149c5575b5050855196632fd514cd60e11b98898952602099898b8180614860338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff579061488b9187916107e257506159b8565b821561497b575b505086519089820190600760f81b825286602184015287604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526148d9826157f0565b61ffff19915190201661ff0085161796803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507f31a58348e92aca95ce44cfea2a1066053d8807feb5ed9bbdfe95e13a622e21f294939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d857906149b29186916107ab5750615d9b565b60ff8760081c160361075d575f80614892565b6149ce906157c8565b61081d57815f614825565b83823461081d578160031936011261081d57602090515f80516020615eac8339815191528152f35b503461049f57614a103661579d565b60ff8360089493941c1695614a2d610fff6001891b161515615d4f565b600160f81b82811696908714614c4f575b5f80516020615eac833981519152803b1561049f5786516399841ed760e01b81523383820190815260ff8b1660208201526001600160f81b03198a1660408201529091849183919082908490829060600103925af1801561082157908391614c3b575b5050855196632fd514cd60e11b98898952602099898b8180614adc338c8a84019092916001600160a01b036020916040840195845216910152565b035f80516020615e8c8339815191529d8e5afa9081156107ff5790614b079187916107e257506159b8565b8215614bf1575b505086519089820190600d60f81b825286602184015287604184015260618301525f80516020615ecc833981519152606283015246607683015260768252614b55826157f0565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201529192918291849182908490829060400103925af190811561070757507fd43ba81a7c94579d65cbb7db5db8dcf366ff05bdecd1d927fcc99840c68571a594939261042d9288926106f857508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b88519081528381018881523360208201528b908290819060400103818d5afa9081156107d85790614c289186916107ab5750615d9b565b60ff8760081c160361075d575f80614b0e565b614c44906157c8565b61081d57815f614aa1565b6008881115614a3e57608490602087519162461bcd60e51b8352820152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152fd5b503461049f576020928360031936011261044a5782359060ff8260081c16614cf161017f6001831b161515615d4f565b5f80516020615eac83398151915290813b1561049f57845163aa43b7f960e01b81523387820190815260ff909216602083015291839183919082908490829060400103925af1801561049557908291614e6b575b50508251632fd514cd60e11b81528481018381523360208201528190604001039086815f80516020615e8c8339815191529381855afa90811561119b578391614e4e575b5015611ea6578351868101601560f81b81528460218301525f80516020615ecc833981519152604183015246605583015260558252614dc782615828565b61ffff19915190201661ff0084161794813b1561049f5784516346ce4e4960e11b8152908101868152336020820152909291829184919082908490829060400103925af1908115611e9b57509183917f9a9785c912b1ce9b03afbd78573bd048c160bd5a489c02f52a3eb9703a718f2493611e8c575081519081528486820152a151908152f35b614e659150873d89116107d1576107c38183615844565b5f614d89565b614e74906157c8565b61044a57805f614d45565b5082903461081d578160031936011261081d57805190614e9e8261580c565b600c82526020938285809401947f544648454578656375746f7200000000000000000000000000000000000000008652614ed6615b5a565b600180830192919080806021614f03614eee88615866565b97614efb8c51998a615844565b808952615866565b878c019690601f1901368837870101905b614fbb575b50505096614fac949260249492611ccb9899614f33615b5a565b93614f488a519d8e9751928391890190615910565b850161103b60f11b8c820152614f688c8351938491602285019101615910565b01614f85601760f91b938460228401525180936023840190615910565b01906023820152614f9e825180938b8885019101615910565b010390810187520185615844565b51928284938452830190615931565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614fec57919082614f14565b614f19565b503461521057615000366158c8565b60ff8360089493941c169561501d610e006001891b161515615d4f565b600160f81b8216956001600160f81b03198701615214575f80516020615eac833981519152803b156152105786516399841ed760e01b81523383820190815260ff8b1660208201526001600160f81b03198a16604082015290915f9183919082908490829060600103925af18015615206576151f3575b508551632fd514cd60e11b8152818101858152336020828101919091529991989190899060400103988a815f80516020615e8c8339815191529b818d5afa9081156107d857906150ea91869161183357506159b8565b87875191600981145f146151cb57506151039114615ae8565b886151326076895180948a611b0186840196600d60f81b88528c60218601528251928391604187019101615910565b9051902061ffff191696803b1561049f5786516346ce4e4960e11b81529182018881523360208201528391839182908490829060400103925af180156116fc5790879392916151b1575b50507f5b7bbda9449c32c1d56a33ee9be18d67a28f5faead25db7ab04fa217000cecf793929161042d9186519485948561596c565b819293506151be906157c8565b61044a579081869261517c565b600a141590506151e65760806151e19114615a76565b615103565b6101006151e19114615a04565b6151fe9192506157c8565b5f905f615094565b87513d5f823e3d90fd5b5f80fd5b608490602087519162461bcd60e51b8352820152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152fd5b5090346152105761528d3661579d565b939160ff8160081c16946152a961017e6001881b161515615d4f565b600160f81b8116945f80516020615eac833981519152803b1561521057855163b25fd54760e01b81523383820190815260ff8a1660208201526001600160f81b03198916604082015290915f9183919082908490829060600103925af1801561555357615544575b508451632fd514cd60e11b80825282820185815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa90811561553a5790615369915f9161551d57506159b8565b821561545e575b505085519088820190600560f91b825285602184015286604184015260618301525f80516020615ecc8339815191526062830152466076830152607682526153b7826157f0565b61ffff19915190201661ff0084161795803b156152105785516346ce4e4960e11b81529182018781523360208201525f91839182908490829060400103925af18015615454577ff58687e1e87ebb2fe49b53f406501933e51bed3f62e278ac0bf3203a26a9e2e994939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b85513d5f823e3d90fd5b87519081528381018781523360208201528a908290819060400103818c5afa9081156155135790615495915f916154f65750615d9b565b60ff8660081c16036154a8578880615370565b855162461bcd60e51b8152808301899052602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608490fd5b61550d91508b3d8d116107d1576107c38183615844565b8b610744565b88513d5f823e3d90fd5b61553491508c8d3d106107d1576107c38183615844565b8c610605565b89513d5f823e3d90fd5b61554d906157c8565b87615311565b86513d5f823e3d90fd5b5090346152105761556d3661579d565b939160ff8160081c169461558961017e6001881b161515615d4f565b600160f81b8116945f80516020615eac833981519152803b1561521057855162fabc1960e21b81523383820190815260ff8a1660208201526001600160f81b03198916604082015290915f9183919082908490829060600103925af1801561555357615777575b508451632fd514cd60e11b80825282820185815233602082810191909152999298929190899060400103988a815f80516020615e8c8339815191529b818d5afa90811561553a5790615648915f9161551d57506159b8565b821561572d575b505085519088820190600760f91b825285602184015286604184015260618301525f80516020615ecc833981519152606283015246607683015260768252615696826157f0565b9051902061ffff191695803b156152105785516346ce4e4960e11b81529182018781523360208201525f91839182908490829060400103925af18015615454577f917801ccb010364b80d82085948b6ce1f7231e1e6950253ca1134a2dace3113294939261042d9288926113ae57508651948594859094939260609260808301968352602083015260ff60f81b1660408201520152565b87519081528381018781523360208201528a908290819060400103818c5afa9081156155135790615764915f916154f65750615d9b565b60ff8660081c16036154a857888061564f565b615780906157c8565b876155f0565b602435906001600160f81b03198216820361521057565b60609060031901126152105760043590602435906044356001600160f81b0319811681036152105790565b67ffffffffffffffff81116157dc57604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff8211176157dc57604052565b6040810190811067ffffffffffffffff8211176157dc57604052565b6080810190811067ffffffffffffffff8211176157dc57604052565b90601f8019910116810190811067ffffffffffffffff8211176157dc57604052565b67ffffffffffffffff81116157dc57601f01601f191660200190565b81601f820112156152105780359061589982615866565b926158a76040519485615844565b8284526020838301011161521057815f926020809301838601378301015290565b90606060031983011261521057600435916024359067ffffffffffffffff8211615210576158f891600401615882565b906044356001600160f81b0319811681036152105790565b5f5b8381106159215750505f910152565b8181015183820152602001615912565b9060209161594a81518092818552858086019101615910565b601f01601f1916010190565b600435906001600160a01b038216820361521057565b9060609261598b91969594968352608060208401526080830190615931565b6001600160f81b031990951660408201520152565b90816020910312615210575180151581036152105790565b156159bf57565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606490fd5b15615a0b57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201527f686f756c642062652032353600000000000000000000000000000000000000006064820152608490fd5b15615a7d57565b60405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201527f686f756c642062652031323800000000000000000000000000000000000000006064820152608490fd5b15615aef57565b60405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f66204279746573363420736860448201527f6f756c64206265203634000000000000000000000000000000000000000000006064820152608490fd5b6040515f615b678261580c565b600190600183526020368185013760218301825b615b86575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215615bb757919082615b7b565b615b80565b15615bc357565b60405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606490fd5b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303615c3b57565b60405163118cdaa760e01b8152336004820152602490fd5b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b15615ce857565b60405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606490fd5b5f198114615d3b5760010190565b634e487b7160e01b5f52601160045260245ffd5b15615d5657565b60405162461bcd60e51b815260206004820152601060248201527f556e737570706f727465642074797065000000000000000000000000000000006044820152606490fd5b15615da257565b60405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606490fd5b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615615e1657565b604051631afcd79f60e31b8152600490fd5b90615e4f5750805115615e3d57805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580615e82575b615e60575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15615e5856fe0000000000000000000000001f2f59242e4f8186e18463d8c9f1a7cc6d425f530000000000000000000000008f8e203122ba1d2d0d1982a34404005cbf94a5ab1f2f59242e4f8186e18463d8c9f1a7cc6d425f53000000000000000000000000a164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.dbg.json b/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.dbg.json new file mode 100644 index 00000000..113ac142 --- /dev/null +++ b/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/0ce0ba0aa623a0081638f8fd6c3133d1.json" +} diff --git a/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.json b/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.json new file mode 100644 index 00000000..869dce02 --- /dev/null +++ b/contracts/artifacts/gateway/GatewayCaller.sol/GatewayCaller.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "GatewayCaller", + "sourceName": "gateway/GatewayCaller.sol", + "abi": [], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.dbg.json b/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.dbg.json new file mode 100644 index 00000000..113ac142 --- /dev/null +++ b/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/0ce0ba0aa623a0081638f8fd6c3133d1.json" +} diff --git a/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.json b/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.json new file mode 100644 index 00000000..fd3982ef --- /dev/null +++ b/contracts/artifacts/gateway/GatewayContract.sol/GatewayContract.json @@ -0,0 +1,567 @@ +{ + "_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": "bytes", + "name": "input", + "type": "bytes" + } + ], + "name": "removeOffset", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "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": "0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b604051611a5690816100d18239608051818181610d880152610e2a0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f8080610059565b63f92ee8a960e01b8152600490fd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630d8e6e2c146114c7575080632538d86d146114aa57806333ba72a51461145f57806335a30d97146113be5780634c0d927714610fde5780634f1ef28614610dea57806352d1902d14610d6e578063541d554814610d0c57806360f0a5ac14610bf1578063651161e514610bc3578063715018a614610b2357806379ba509714610abf5780638ada066e14610a835780638da5cb5b14610a3e578063ad3cb1cc146109dd578063b9244e1d1461045e578063c4d66de814610305578063dd39f00d146101e8578063e30c3978146101a35763f2fde38b146100f8575f80fd5b3461019f57602036600319011261019f576101116116f9565b6101196118e4565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b3461019f575f36600319011261019f5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461019f57602036600319011261019f576102016116f9565b6102096118e4565b60ff610245826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166102c0578061028e6001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19166001179055167fd68caa126e02d8ca92285deaa53a0d5d4f692e587b00422ce504661cc74361bc5f80a2005b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c72656164792072656c617965720000000000006044820152606490fd5b3461019f57602036600319011261019f5761031e6116f9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16159167ffffffffffffffff811680159081610456575b600114908161044c575b159081610443575b506104315767ffffffffffffffff198116600117845582610412575b506103976119a5565b61039f6119a5565b6001600160a01b038116156103fa576103b790611917565b6103bd57005b68ff00000000000000001981541690557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b604051631e4fbdf760e01b81525f6004820152602490fd5b68ffffffffffffffffff1916680100000000000000011783558361038e565b60405163f92ee8a960e01b8152600490fd5b90501585610372565b303b15915061036a565b849150610360565b60031960603682011261019f5767ffffffffffffffff6004356024803583811161019f576104909036906004016116b3565b92604480359482861161019f573660238701121561019f578560040135928084116109ca578360051b96602097604051956104cd8a830188611675565b865286898701918301019136831161019f57878101915b8383106109a4575050505060ff61052b336001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561096157855f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0297888852876080876105c460405f20946105b46105a5604051978896879663dd66628760e01b8852731f2f59242e4f8186e18463d8c9f1a7cc6d425f53600489015287015260848601906117bc565b82858203018b86015289611634565b90838203016064840152896117f7565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1908115610956575f91610920575b50156108d357855f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa039788885260ff60405f20541661089057865f52875260405f20936040519560c087018781108482111761087c578060405260bf1988610655838a6117bc565b03016106619082611675565b87526001860154936001600160a01b03958a890195878116875263ffffffff60e01b918260408c019260401b1682528a60028b01549a606082019b8c5260038101546080819301526004015460ff169b60a0019b15158c52421161083a5750511697604051928b8401998a528a818501528084526060840195848710908711176108275750846107357fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd99956107568e5f9b978f9e9a9782978e9d996040525115159b608083019687918451928391611613565b820161074a8251809386608085019101611613565b01038086520184611675565b82976107ac575b50505050511690518883519301915af1610775611853565b90610793604051928392151583526040888401526040830190611634565b0390a25f525260405f20600160ff198254161790555f80f35b6107fd949750906107ea6107d76107e561081d969594604051928391888084015260408301906117f7565b03601f198101835282611675565b611720565b9060405195869351809286860190611613565b820161081182518093868085019101611613565b01038084520182611675565b92898c808061075d565b634e487b7160e01b5f9081526041600452fd5b8c7f546f6f206c6174650000000000000000000000000000000000000000000000006064926008886040519462461bcd60e51b86526004860152840152820152fd5b50634e487b7160e01b5f9081526041600452fd5b60405162461bcd60e51b815260048101899052601c818801527f5265717565737420697320616c72656164792066756c66696c6c65640000000081860152606490fd5b60405162461bcd60e51b8152600481018890526021818701527f4b4d53207369676e617475726520766572696669636174696f6e206661696c6581850152601960fa1b6064820152608490fd5b90508781813d831161094f575b6109378183611675565b8101031261019f5751801515810361019f57896105ec565b503d61092d565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260048101889052600b818701527f4e6f742072656c6179657200000000000000000000000000000000000000000081850152606490fd5b823585811161019f578b916109bf83928c36918701016116b3565b8152019201916104e4565b84634e487b7160e01b5f5260416004525ffd5b3461019f575f36600319011261019f57610a3a6040516109fc81611659565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611634565b0390f35b3461019f575f36600319011261019f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461019f575f36600319011261019f5760207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054604051908152f35b3461019f575f36600319011261019f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00541603610b0b57610b0933611917565b005b60405163118cdaa760e01b8152336004820152602490fd5b3461019f575f36600319011261019f57610b3b6118e4565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461019f575f36600319011261019f576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b3461019f57602036600319011261019f57610c0a6116f9565b610c126118e4565b60ff610c4e826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b541615610cc75780610c986001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19169055167ff29639ce9f9f4d0a646c7c99291b0b1d3ca3a017b8f543d03d79d9f6fc4c58245f80a2005b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f7420612072656c6179657200000000000000006044820152606490fd5b3461019f57602036600319011261019f57602060ff610d62610d2c6116f9565b6001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166040519015158152f35b3461019f575f36600319011261019f576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610dd85760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b60405163703e46dd60e11b8152600490fd5b604036600319011261019f57610dfe6116f9565b60243567ffffffffffffffff811161019f57610e1e9036906004016116b3565b906001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115610fb0575b50610dd857610e626118e4565b8116906040516352d1902d60e01b8152602081600481865afa5f9181610f7c575b50610ea157604051634c9c8ce360e01b815260048101849052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc92919290818103610f645750823b15610f4b57816001600160a01b0319825416179055604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115610f3257505f80836020610b0995519101845af4610f2c611853565b916119e6565b91505034610f3c57005b63b398979f60e01b8152600490fd5b604051634c9c8ce360e01b815260048101839052602490fd5b60249060405190632a87526960e21b82526004820152fd5b9091506020813d602011610fa8575b81610f9860209383611675565b8101031261019f57519085610e83565b3d9150610f8b565b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141584610e55565b3461019f5760a036600319011261019f5767ffffffffffffffff806004351161019f5736602360043501121561019f57600435600401351161019f573660246004356004013560051b60043501011161019f576024357fffffffff000000000000000000000000000000000000000000000000000000008116900361019f57608435801515810361019f5742606435111561136e576201518042018042116112ad5760643511611329577f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa005490815f5260207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f20905f5b6004356004013581106112c157505080600160049201805477ffffffff000000000000000000000000000000000000000060243560401c16907fffffffffffffffff0000000000000000000000000000000000000000000000007fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff3316911617179055604435600282015560643560038201550160ff1981541660ff831515161790556040519060c082526004356004013560c08301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600435600401351161019f5782917f2dc9f5cb271a872eb89f488a1d216ded8a5b96226ca01f8d3128e028ae5459f8916004356004013560051b60246004350160e08401373360208301526024357fffffffff0000000000000000000000000000000000000000000000000000000016604083015260443560608301526064356080830152151560a082015260048035013560051b810181900360e00190a27f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054905f1982146112ad576001602092017f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0055604051908152f35b634e487b7160e01b5f52601160045260245ffd5b82549068010000000000000000821015611315576001820180855582101561130157600191845f5260248260051b60043501013590845f200155016110db565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152601f60248201527f6d617854696d657374616d70206578636565646564204d41585f44454c4159006044820152606490fd5b60405162461bcd60e51b815260206004820152602260248201527f6d617854696d657374616d70206d757374206265206120667574757265206461604482015261746560f01b6064820152608490fd5b3461019f57602036600319011261019f576004355f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260ff60405f2054168015611414575b6020906040519015158152f35b507f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa026020526020600360405f2001548042119081611455575b509050611407565b905015158261144d565b3461019f57602036600319011261019f5760043567ffffffffffffffff811161019f576114966107e5610a3a9236906004016116b3565b604051918291602083526020830190611634565b3461019f575f36600319011261019f576020604051620151808152f35b3461019f575f36600319011261019f576114e081611659565b600f815260208082017f47617465776179436f6e747261637400000000000000000000000000000000008152611514611882565b604051906001908161152584611659565b60018452858401928636853760218501825b6115dd575b611565886115c960248c8b8b8b8b611552611882565b93604051998a965180928b890190611613565b850161103b60f11b89820152611584825180938b602285019101611613565b016115a1601760f91b938460228401525180936023840190611613565b019060238201526115ba82518093888785019101611613565b01036004810185520183611675565b610a3a604051928284938452830190611634565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530491821561160e57919082611537565b61153c565b5f5b8381106116245750505f910152565b8181015183820152602001611615565b9060209161164d81518092818552858086019101611613565b601f01601f1916010190565b6040810190811067ffffffffffffffff82111761131557604052565b90601f8019910116810190811067ffffffffffffffff82111761131557604052565b67ffffffffffffffff811161131557601f01601f191660200190565b81601f8201121561019f578035906116ca82611697565b926116d86040519485611675565b8284526020838301011161019f57815f926020809301838601378301015290565b600435906001600160a01b038216820361019f57565b908151811015611301570160200190565b8051601f1991908281019081116112ad5761173a81611697565b926117486040519485611675565b81845261175482611697565b6020910136858301375f5b82811061176d575050505090565b818101908181116112ad576001917fff00000000000000000000000000000000000000000000000000000000000000906117a7908761170f565b51165f1a6117b5828861170f565b530161175f565b9081548082526020809201925f5260205f20915f905b8282106117e0575050505090565b8354855293840193600193840193909101906117d2565b90808251908181526020809101926020808460051b8301019501935f915b8483106118255750505050505090565b9091929394958480611843600193601f198682030187528a51611634565b9801930193019194939290611815565b3d1561187d573d9061186482611697565b916118726040519384611675565b82523d5f602084013e565b606090565b6040515f61188f82611659565b600190600183526020368185013760218301825b6118ae575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156118df579190826118a3565b6118a8565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303610b0b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156119d457565b604051631afcd79f60e31b8152600490fd5b90611a0d57508051156119fb57805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580611a40575b611a1e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611a1656fea164736f6c6343000818000a", + "deployedBytecode": "0x6080806040526004361015610012575f80fd5b5f3560e01c9081630d8e6e2c146114c7575080632538d86d146114aa57806333ba72a51461145f57806335a30d97146113be5780634c0d927714610fde5780634f1ef28614610dea57806352d1902d14610d6e578063541d554814610d0c57806360f0a5ac14610bf1578063651161e514610bc3578063715018a614610b2357806379ba509714610abf5780638ada066e14610a835780638da5cb5b14610a3e578063ad3cb1cc146109dd578063b9244e1d1461045e578063c4d66de814610305578063dd39f00d146101e8578063e30c3978146101a35763f2fde38b146100f8575f80fd5b3461019f57602036600319011261019f576101116116f9565b6101196118e4565b6001600160a01b03809116907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00826001600160a01b03198254161790557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227005f80a3005b5f80fd5b3461019f575f36600319011261019f5760206001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c005416604051908152f35b3461019f57602036600319011261019f576102016116f9565b6102096118e4565b60ff610245826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166102c0578061028e6001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19166001179055167fd68caa126e02d8ca92285deaa53a0d5d4f692e587b00422ce504661cc74361bc5f80a2005b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c72656164792072656c617965720000000000006044820152606490fd5b3461019f57602036600319011261019f5761031e6116f9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16159167ffffffffffffffff811680159081610456575b600114908161044c575b159081610443575b506104315767ffffffffffffffff198116600117845582610412575b506103976119a5565b61039f6119a5565b6001600160a01b038116156103fa576103b790611917565b6103bd57005b68ff00000000000000001981541690557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b604051631e4fbdf760e01b81525f6004820152602490fd5b68ffffffffffffffffff1916680100000000000000011783558361038e565b60405163f92ee8a960e01b8152600490fd5b90501585610372565b303b15915061036a565b849150610360565b60031960603682011261019f5767ffffffffffffffff6004356024803583811161019f576104909036906004016116b3565b92604480359482861161019f573660238701121561019f578560040135928084116109ca578360051b96602097604051956104cd8a830188611675565b865286898701918301019136831161019f57878101915b8383106109a4575050505060ff61052b336001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54161561096157855f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0297888852876080876105c460405f20946105b46105a5604051978896879663dd66628760e01b8852731f2f59242e4f8186e18463d8c9f1a7cc6d425f53600489015287015260848601906117bc565b82858203018b86015289611634565b90838203016064840152896117f7565b03815f730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0555af1908115610956575f91610920575b50156108d357855f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa039788885260ff60405f20541661089057865f52875260405f20936040519560c087018781108482111761087c578060405260bf1988610655838a6117bc565b03016106619082611675565b87526001860154936001600160a01b03958a890195878116875263ffffffff60e01b918260408c019260401b1682528a60028b01549a606082019b8c5260038101546080819301526004015460ff169b60a0019b15158c52421161083a5750511697604051928b8401998a528a818501528084526060840195848710908711176108275750846107357fb0f2a12a0cc059295d0e43aaf8b9eebb32b58c03c68f5406fbf345c3a226bedd99956107568e5f9b978f9e9a9782978e9d996040525115159b608083019687918451928391611613565b820161074a8251809386608085019101611613565b01038086520184611675565b82976107ac575b50505050511690518883519301915af1610775611853565b90610793604051928392151583526040888401526040830190611634565b0390a25f525260405f20600160ff198254161790555f80f35b6107fd949750906107ea6107d76107e561081d969594604051928391888084015260408301906117f7565b03601f198101835282611675565b611720565b9060405195869351809286860190611613565b820161081182518093868085019101611613565b01038084520182611675565b92898c808061075d565b634e487b7160e01b5f9081526041600452fd5b8c7f546f6f206c6174650000000000000000000000000000000000000000000000006064926008886040519462461bcd60e51b86526004860152840152820152fd5b50634e487b7160e01b5f9081526041600452fd5b60405162461bcd60e51b815260048101899052601c818801527f5265717565737420697320616c72656164792066756c66696c6c65640000000081860152606490fd5b60405162461bcd60e51b8152600481018890526021818701527f4b4d53207369676e617475726520766572696669636174696f6e206661696c6581850152601960fa1b6064820152608490fd5b90508781813d831161094f575b6109378183611675565b8101031261019f5751801515810361019f57896105ec565b503d61092d565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260048101889052600b818701527f4e6f742072656c6179657200000000000000000000000000000000000000000081850152606490fd5b823585811161019f578b916109bf83928c36918701016116b3565b8152019201916104e4565b84634e487b7160e01b5f5260416004525ffd5b3461019f575f36600319011261019f57610a3a6040516109fc81611659565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611634565b0390f35b3461019f575f36600319011261019f5760206001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461019f575f36600319011261019f5760207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054604051908152f35b3461019f575f36600319011261019f57336001600160a01b037f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00541603610b0b57610b0933611917565b005b60405163118cdaa760e01b8152336004820152602490fd5b3461019f575f36600319011261019f57610b3b6118e4565b5f6001600160a01b036001600160a01b03197f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008181541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080549182169055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461019f575f36600319011261019f576020604051730b51b21cf3e0cec571b5fa7fd7c1fcf372fcb0558152f35b3461019f57602036600319011261019f57610c0a6116f9565b610c126118e4565b60ff610c4e826001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b541615610cc75780610c986001600160a01b03926001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b805460ff19169055167ff29639ce9f9f4d0a646c7c99291b0b1d3ca3a017b8f543d03d79d9f6fc4c58245f80a2005b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f7420612072656c6179657200000000000000006044820152606490fd5b3461019f57602036600319011261019f57602060ff610d62610d2c6116f9565b6001600160a01b03165f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0160205260405f2090565b54166040519015158152f35b3461019f575f36600319011261019f576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610dd85760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b60405163703e46dd60e11b8152600490fd5b604036600319011261019f57610dfe6116f9565b60243567ffffffffffffffff811161019f57610e1e9036906004016116b3565b906001600160a01b03807f000000000000000000000000000000000000000000000000000000000000000016803014908115610fb0575b50610dd857610e626118e4565b8116906040516352d1902d60e01b8152602081600481865afa5f9181610f7c575b50610ea157604051634c9c8ce360e01b815260048101849052602490fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc92919290818103610f645750823b15610f4b57816001600160a01b0319825416179055604051907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2825115610f3257505f80836020610b0995519101845af4610f2c611853565b916119e6565b91505034610f3c57005b63b398979f60e01b8152600490fd5b604051634c9c8ce360e01b815260048101839052602490fd5b60249060405190632a87526960e21b82526004820152fd5b9091506020813d602011610fa8575b81610f9860209383611675565b8101031261019f57519085610e83565b3d9150610f8b565b9050817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141584610e55565b3461019f5760a036600319011261019f5767ffffffffffffffff806004351161019f5736602360043501121561019f57600435600401351161019f573660246004356004013560051b60043501011161019f576024357fffffffff000000000000000000000000000000000000000000000000000000008116900361019f57608435801515810361019f5742606435111561136e576201518042018042116112ad5760643511611329577f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa005490815f5260207f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0260205260405f20905f5b6004356004013581106112c157505080600160049201805477ffffffff000000000000000000000000000000000000000060243560401c16907fffffffffffffffff0000000000000000000000000000000000000000000000007fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff3316911617179055604435600282015560643560038201550160ff1981541660ff831515161790556040519060c082526004356004013560c08301527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600435600401351161019f5782917f2dc9f5cb271a872eb89f488a1d216ded8a5b96226ca01f8d3128e028ae5459f8916004356004013560051b60246004350160e08401373360208301526024357fffffffff0000000000000000000000000000000000000000000000000000000016604083015260443560608301526064356080830152151560a082015260048035013560051b810181900360e00190a27f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0054905f1982146112ad576001602092017f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0055604051908152f35b634e487b7160e01b5f52601160045260245ffd5b82549068010000000000000000821015611315576001820180855582101561130157600191845f5260248260051b60043501013590845f200155016110db565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152601f60248201527f6d617854696d657374616d70206578636565646564204d41585f44454c4159006044820152606490fd5b60405162461bcd60e51b815260206004820152602260248201527f6d617854696d657374616d70206d757374206265206120667574757265206461604482015261746560f01b6064820152608490fd5b3461019f57602036600319011261019f576004355f527f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa0360205260ff60405f2054168015611414575b6020906040519015158152f35b507f2f81b8bba57448689ab73c47570e3de1ee7f779a62f121c9631b35b3eda2aa026020526020600360405f2001548042119081611455575b509050611407565b905015158261144d565b3461019f57602036600319011261019f5760043567ffffffffffffffff811161019f576114966107e5610a3a9236906004016116b3565b604051918291602083526020830190611634565b3461019f575f36600319011261019f576020604051620151808152f35b3461019f575f36600319011261019f576114e081611659565b600f815260208082017f47617465776179436f6e747261637400000000000000000000000000000000008152611514611882565b604051906001908161152584611659565b60018452858401928636853760218501825b6115dd575b611565886115c960248c8b8b8b8b611552611882565b93604051998a965180928b890190611613565b850161103b60f11b89820152611584825180938b602285019101611613565b016115a1601760f91b938460228401525180936023840190611613565b019060238201526115ba82518093888785019101611613565b01036004810185520183611675565b610a3a604051928284938452830190611634565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a83530491821561160e57919082611537565b61153c565b5f5b8381106116245750505f910152565b8181015183820152602001611615565b9060209161164d81518092818552858086019101611613565b601f01601f1916010190565b6040810190811067ffffffffffffffff82111761131557604052565b90601f8019910116810190811067ffffffffffffffff82111761131557604052565b67ffffffffffffffff811161131557601f01601f191660200190565b81601f8201121561019f578035906116ca82611697565b926116d86040519485611675565b8284526020838301011161019f57815f926020809301838601378301015290565b600435906001600160a01b038216820361019f57565b908151811015611301570160200190565b8051601f1991908281019081116112ad5761173a81611697565b926117486040519485611675565b81845261175482611697565b6020910136858301375f5b82811061176d575050505090565b818101908181116112ad576001917fff00000000000000000000000000000000000000000000000000000000000000906117a7908761170f565b51165f1a6117b5828861170f565b530161175f565b9081548082526020809201925f5260205f20915f905b8282106117e0575050505090565b8354855293840193600193840193909101906117d2565b90808251908181526020809101926020808460051b8301019501935f915b8483106118255750505050505090565b9091929394958480611843600193601f198682030187528a51611634565b9801930193019194939290611815565b3d1561187d573d9061186482611697565b916118726040519384611675565b82523d5f602084013e565b606090565b6040515f61188f82611659565b600190600183526020368185013760218301825b6118ae575b50505090565b5f190190600a906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156118df579190826118a3565b6118a8565b6001600160a01b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303610b0b57565b6001600160a01b0319907f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c008281541690557f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993008054906001600160a01b0380931680948316179055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156119d457565b604051631afcd79f60e31b8152600490fd5b90611a0d57508051156119fb57805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580611a40575b611a1e575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611a1656fea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.dbg.json b/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.dbg.json new file mode 100644 index 00000000..113ac142 --- /dev/null +++ b/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/0ce0ba0aa623a0081638f8fd6c3133d1.json" +} diff --git a/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.json b/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.json new file mode 100644 index 00000000..64ca5ccb --- /dev/null +++ b/contracts/artifacts/gateway/IKMSVerifier.sol/IKMSVerifier.json @@ -0,0 +1,45 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IKMSVerifier", + "sourceName": "gateway/IKMSVerifier.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "aclAddress", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "handlesList", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "decryptedResult", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "name": "verifyDecryptionEIP712KMSSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.dbg.json b/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.dbg.json new file mode 100644 index 00000000..5a316dbc --- /dev/null +++ b/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../build-info/0ce0ba0aa623a0081638f8fd6c3133d1.json" +} diff --git a/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.json b/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.json new file mode 100644 index 00000000..23576d0d --- /dev/null +++ b/contracts/artifacts/gateway/lib/Gateway.sol/Gateway.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Gateway", + "sourceName": "gateway/lib/Gateway.sol", + "abi": [], + "bytecode": "0x6080806040523460175760109081601c823930815050f35b5f80fdfe5f80fdfea164736f6c6343000818000a", + "deployedBytecode": "0x5f80fdfea164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.dbg.json b/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.dbg.json new file mode 100644 index 00000000..5a316dbc --- /dev/null +++ b/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../build-info/0ce0ba0aa623a0081638f8fd6c3133d1.json" +} diff --git a/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.json b/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.json new file mode 100644 index 00000000..60e8217a --- /dev/null +++ b/contracts/artifacts/gateway/lib/Gateway.sol/IGatewayContract.json @@ -0,0 +1,50 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "IGatewayContract", + "sourceName": "gateway/lib/Gateway.sol", + "abi": [ + { + "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": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +}