diff --git a/app/App.tsx b/app/App.tsx index 09ded2fbd..ece131243 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -14,22 +14,17 @@ import { DEFAULT_DOE } from '@env'; import { PassportData } from '../common/src/utils/types'; -import { AWS_ENDPOINT, MAX_DATAHASHES_LEN } from '../common/src/constants/constants'; +import { revealBitmapFromMapping } from '../common/src/utils/revealBitmap'; +import { jmrtdToStandardName } from '../common/src/utils/formatNames'; +import { generateCircuitInputs } from '../common/src/utils/generateInputs'; +import { AWS_ENDPOINT } from '../common/src/constants/constants'; import { - hash, - toUnsignedByte, - bytesToBigDecimal, - formatMrz, - splitToWords, - hexStringToSignedIntArray, formatProofIOS, formatInputsIOS } from '../common/src/utils/utils'; import { samplePassportData } from '../common/src/utils/passportDataStatic'; -import { sha256Pad } from '../common/src/utils/sha256Pad'; - import "@ethersproject/shims" -import { ethers, ZeroAddress } from "ethers"; +import { ethers } from "ethers"; import axios from 'axios'; import groth16ExportSolidityCallData from './utils/snarkjs'; import contractAddresses from "./deployments/addresses.json" @@ -40,19 +35,10 @@ import forge from 'node-forge'; import { Buffer } from 'buffer'; import { YStack } from 'tamagui'; global.Buffer = Buffer; +import pubkeys from '../common/pubkeys/publicKeysParsed.json'; console.log('DEFAULT_PNUMBER', DEFAULT_PNUMBER); -const attributeToPosition = { - issuing_state: [2, 5], - name: [5, 44], - passport_number: [44, 52], - nationality: [54, 57], - date_of_birth: [57, 63], - gender: [64, 65], - expiry_date: [65, 71], -} - function App(): JSX.Element { const [passportNumber, setPassportNumber] = useState(DEFAULT_PNUMBER ?? ""); const [dateOfBirth, setDateOfBirth] = useState(DEFAULT_DOB ?? ''); @@ -148,7 +134,6 @@ function App(): JSX.Element { const cert = forge.pki.certificateFromPem(pem); const publicKey = cert.publicKey; - console.log('publicKey', publicKey) const modulus = (publicKey as any).n.toString(10); @@ -175,9 +160,9 @@ function App(): JSX.Element { console.log('mrz', passportData.mrz); console.log('signatureAlgorithm', passportData.signatureAlgorithm); console.log('pubKey', passportData.pubKey); - console.log('dataGroupHashes', passportData.dataGroupHashes); - console.log('eContent', passportData.eContent); - console.log('encryptedDigest', passportData.encryptedDigest); + console.log('dataGroupHashes', [...passportData.dataGroupHashes.slice(0, 10), '...']); + console.log('eContent', [...passportData.eContent.slice(0, 10), '...']); + console.log('encryptedDigest', [...passportData.encryptedDigest.slice(0, 10), '...']); console.log("photoBase64", passportData.photoBase64.substring(0, 100) + '...') setPassportData(passportData); @@ -204,7 +189,7 @@ function App(): JSX.Element { const passportData: PassportData = { mrz: mrz.replace(/\n/g, ''), - signatureAlgorithm: signatureAlgorithm, + signatureAlgorithm: jmrtdToStandardName(signatureAlgorithm), pubKey: { modulus: modulus, curveName: curveName, @@ -293,69 +278,38 @@ function App(): JSX.Element { } const handleProve = async (path: string) => { - setStep(Steps.GENERATING_PROOF); if (passportData === null) { console.log('passport data is null'); return; } - + setStep(Steps.GENERATING_PROOF); setGeneratingProof(true) await new Promise(resolve => setTimeout(resolve, 10)); - // 1. TODO check signature to make sure the proof will work + // TODO check circuit to make sure the proof will work - // 2. Format all the data as inputs for the circuit - const formattedMrz = formatMrz(passportData.mrz); + const reveal_bitmap = revealBitmapFromMapping(disclosure); - const reveal_bitmap = Array.from({ length: 88 }, (_) => '0'); - - for (const attribute in disclosure) { - if (disclosure[attribute as keyof typeof disclosure]) { - const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; - for (let i = start; i <= end; i++) { - reveal_bitmap[i] = '1'; - } - } - } - - // if (!["SHA256withRSA", "sha256WithRSAEncryption"].includes(passportData.signatureAlgorithm)) { + // if (!["sha256WithRSAEncryption"].includes(passportData.signatureAlgorithm)) { // console.log(`${passportData.signatureAlgorithm} not supported for proof right now.`); // setError(`${passportData.signatureAlgorithm} not supported for proof right now.`); // return; // } - console.log('passportData.dataGroupHashes', passportData.dataGroupHashes); - - const dataGroupHashesUint8Array = new Uint8Array(passportData.dataGroupHashes); - - console.log('dataGroupHashesUint8Array', dataGroupHashesUint8Array); - - const [messagePadded, messagePaddedLen] = sha256Pad( - dataGroupHashesUint8Array, - MAX_DATAHASHES_LEN + const inputs = generateCircuitInputs( + passportData, + pubkeys as string[], + reveal_bitmap, + address ); - console.log('messagePadded', messagePadded); - const inputs = { - mrz: Array.from(formattedMrz).map(byte => String(byte)), - reveal_bitmap: reveal_bitmap.map(byte => String(byte)), - dataHashes: Array.from(messagePadded).map((x) => (x as number).toString()), - datahashes_padded_length: messagePaddedLen.toString(), - eContentBytes: Array.from(passportData.eContent.map(toUnsignedByte)).map(byte => String(byte)), - signature: splitToWords( - BigInt(bytesToBigDecimal(passportData.encryptedDigest)), - BigInt(64), - BigInt(32) - ), - pubkey: splitToWords( - BigInt(passportData.pubKey.modulus as string), - BigInt(64), - BigInt(32) - ), - address, - } - - console.log('inputs', inputs) + Object.keys(inputs).forEach((key) => { + if (Array.isArray(inputs[key as keyof typeof inputs])) { + console.log(key, inputs[key as keyof typeof inputs].slice(0, 10), '...'); + } else { + console.log(key, inputs[key as keyof typeof inputs]); + } + }); const start = Date.now(); if (Platform.OS === 'android') { @@ -410,7 +364,9 @@ function App(): JSX.Element { const response = await NativeModules.Prover.runProveAction({ ...inputs, datahashes_padded_length: [inputs.datahashes_padded_length.toString()], // wrap everything in arrays for bindings - address: [BigInt(address).toString()] + signatureAlgorithm: [inputs.signatureAlgorithm], + root: [inputs.root], + address: [BigInt(address).toString()], }) console.log('proof response:', response) const parsedResponse = JSON.parse(response) diff --git a/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderModule.kt b/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderModule.kt index f620f7255..37024cf9f 100644 --- a/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderModule.kt +++ b/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderModule.kt @@ -639,7 +639,11 @@ class RNPassportReaderModule(private val reactContext: ReactApplicationContext) datahashes_padded_length: String, eContentBytes: List, signature: List, + signature_algorithm: String, pubkey: List, + path_indices: List, + siblings: List, + root: String, address: String, zkeypath: String ): String @@ -654,7 +658,11 @@ class RNPassportReaderModule(private val reactContext: ReactApplicationContext) val datahashes_padded_length = inputs.getString("datahashes_padded_length") ?: "" val e_content_bytes = inputs.getArray("eContentBytes")?.toArrayList()?.map { it as String } ?: listOf() val signature = inputs.getArray("signature")?.toArrayList()?.map { it as String } ?: listOf() + val signature_algorithm = inputs.getString("signatureAlgorithm") ?: "" val pubkey = inputs.getArray("pubkey")?.toArrayList()?.map { it as String } ?: listOf() + val path_indices = inputs.getArray("pathIndices")?.toArrayList()?.map { it as String } ?: listOf() + val siblings = inputs.getArray("siblings")?.toArrayList()?.map { it as String } ?: listOf() + val root = inputs.getString("root") ?: "" val address = inputs.getString("address") ?: "" val resultFromProof = provePassport( @@ -664,7 +672,11 @@ class RNPassportReaderModule(private val reactContext: ReactApplicationContext) datahashes_padded_length, e_content_bytes, signature, + signature_algorithm, pubkey, + path_indices, + siblings, + root, address, zkeypath ) diff --git a/app/ark-circom-passport/src/passport.rs b/app/ark-circom-passport/src/passport.rs index 41e049a09..f8f828b55 100644 --- a/app/ark-circom-passport/src/passport.rs +++ b/app/ark-circom-passport/src/passport.rs @@ -104,7 +104,11 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( datahashes_padded_length: JString, e_content_bytes: JObject, signature: JObject, + signature_algorithm: JString, pubkey: JObject, + path_indices: JObject, + siblings: JObject, + root: JString, address: JString, zkeypath: JString, ) -> jstring { @@ -117,7 +121,11 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( datahashes_padded_length: JString, e_content_bytes: JObject, signature: JObject, + signature_algorithm: JString, pubkey: JObject, + path_indices: JObject, + siblings: JObject, + root: JString, address: JString, zkeypath: JString, env: JNIEnv @@ -137,6 +145,11 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( let e_content_bytes_vec: Vec = java_arraylist_to_rust_vec(&env, e_content_bytes)?; let signature_vec: Vec = java_arraylist_to_rust_vec(&env, signature)?; let pubkey_vec: Vec = java_arraylist_to_rust_vec(&env, pubkey)?; + let path_indices_vec: Vec = java_arraylist_to_rust_vec(&env, path_indices)?; + let siblings_vec: Vec = java_arraylist_to_rust_vec(&env, siblings)?; + + let signature_algorithm_str: String = env.get_string(signature_algorithm)?.into(); + let root_str: String = env.get_string(root)?.into(); let address_str: String = env.get_string(address)?.into(); let datahashes_padded_length_str: String = env.get_string(datahashes_padded_length)?.into(); @@ -145,7 +158,11 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( log::error!("PROOF OF PASSPORT ---- data_hashes_vec {:?}", data_hashes_vec); log::error!("PROOF OF PASSPORT ---- e_content_bytes_vec {:?}", e_content_bytes_vec); log::error!("PROOF OF PASSPORT ---- signature_vec {:?}", signature_vec); + log::error!("PROOF OF PASSPORT ---- signature_algorithm_str {:?}", signature_algorithm_str); log::error!("PROOF OF PASSPORT ---- pubkey_vec {:?}", pubkey_vec); + log::error!("PROOF OF PASSPORT ---- path_indices_vec {:?}", path_indices_vec); + log::error!("PROOF OF PASSPORT ---- siblings_vec {:?}", siblings_vec); + log::error!("PROOF OF PASSPORT ---- root_str {:?}", root_str); log::error!("PROOF OF PASSPORT ---- address_str {:?}", address_str); log::error!("PROOF OF PASSPORT ---- datahashes_padded_length_str {:?}", datahashes_padded_length_str); @@ -162,13 +179,22 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( parse_and_insert(&mut inputs, "eContentBytes", e_content_bytes_vec.iter().map(AsRef::as_ref).collect()); parse_and_insert(&mut inputs, "signature", signature_vec.iter().map(AsRef::as_ref).collect()); parse_and_insert(&mut inputs, "pubkey", pubkey_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "pathIndices", path_indices_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "siblings", siblings_vec.iter().map(AsRef::as_ref).collect()); let address_bigint = BigInt::from_bytes_be(Sign::Plus, &decode(&address_str[2..])?); inputs.insert("address".to_string(), vec![address_bigint]); + let datahashes_padded_length_i32 = datahashes_padded_length_str.parse::().expect("Failed to parse datahashes_padded_length to i32"); let datahashes_padded_length_bigint = BigInt::from(datahashes_padded_length_i32); inputs.insert("datahashes_padded_length".to_string(), vec![datahashes_padded_length_bigint]); + let signature_algorithm_i32 = signature_algorithm_str.parse::().expect("Failed to parse signature_algorithm_str to i32"); + let signature_algorithm_bigint = BigInt::from(signature_algorithm_i32); + inputs.insert("signature_algorithm".to_string(), vec![signature_algorithm_bigint]); + let root_bigint = BigInt::parse_bytes(root_str.as_bytes(), 10).unwrap(); + inputs.insert("root".to_string(), vec![root_bigint]); + println!("generating witness..."); let now = Instant::now(); let full_assignment = witness_calculator() @@ -269,7 +295,11 @@ pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( datahashes_padded_length, e_content_bytes, signature, + signature_algorithm, pubkey, + path_indices, + siblings, + root, address, zkeypath, env diff --git a/app/deployments/Groth16Verifier.json b/app/deployments/Groth16Verifier.json index 04390941b..96d791602 100644 --- a/app/deployments/Groth16Verifier.json +++ b/app/deployments/Groth16Verifier.json @@ -21,9 +21,9 @@ "type": "uint256[2]" }, { - "internalType": "uint256[16]", + "internalType": "uint256[6]", "name": "_pubSignals", - "type": "uint256[16]" + "type": "uint256[6]" } ], "name": "verifyProof", @@ -38,8 +38,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610b92806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c82febf514610030575b600080fd5b61004a60048036038101906100459190610abd565b610060565b6040516100579190610b41565b60405180910390f35b6000610945565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f1b5297260a965e84a18d4dcf67193ad9e5941e482e37d7a8c7124d19cea4f9b681527f13c4b609a458c723aa589ba3c51402e56e1eda7dc441ca83dbdd19543723460660208201526101a960008801357f22e24ced226fa2349cf768b6062c63d1c7310d954103d97608ba5d262dc3f9bc7f078026109604dc9cc18c37cc6ed83eb7a70f13e7b4a9f8b0529eb1b3a41ec9af8461009b565b6101f960208801357f1edb8d1b18377311ee0bef60e924e10a390247796b2592a0cbefa4e72ff8e2397f11e84fa4deb75a055bb9f01718a7f2f3e6817b21665d91decb5d9603b34dbe4a8461009b565b61024960408801357f2d03f97c82badc052d3f6bac221fa849fd8b4ab31776c3d3d320cb7a3f4036277f0f2eaa802ea8461881b4e403e2190c7232d85be1ebf6b391b12af3386647faaa8461009b565b61029960608801357f2687b2cf6fe1e61e0aab297629979b84e28ced6fddab29e055a5dfdaa81748167f114a1c8d2bc9cd353176d5e2d31d6944082bc34a6919d97d70689f4f9035ff398461009b565b6102e960808801357f26fc44745f6026ef7b2bc4ad7381009ea3b11aa6ac3e1e55c00e86abe4b21a8a7f14a00c66e27d3b381415195e754790dcc7246351fd4e7864ec94f468e184479b8461009b565b61033960a08801357f2757022e408976c392d5f09144918cae891f6adaa48d3f7fea4b167a8ed660c37f21a35e76b36c984e0aa70a0b2906b33caa9e6ed21d1b482b38670330bead2b4f8461009b565b61038960c08801357f2598bf32ef243200119aa2de8f9c6d5da1f7d469f481d111a3bdfcc67b11ac0e7f2454700f9a45267241a07e4e111e1ca58e0de630d88c82eee08ca7db1304e6d38461009b565b6103d960e08801357f1917385492376f04b4ba5df39c7ae83b2f2795b6e3d38089a821134b9fffc0aa7f24a0125521b665b8aba672dc06d9409b366cc6a6976a8dce86dacdf06fba93818461009b565b61042a6101008801357f26fa95b7e183a02dfa53eb8bc6ad1d11d7f02122007ba1dd7ac79c1c68c0ce6e7f2d2c82b07eed82c21e410ff0049caf8f55fc9ca5341a8f7d0f4fa00ae3a221fe8461009b565b61047b6101208801357f0c53b9d4bdc2b772b01212fe199527ef035d5e6107f3d3bb7066a4667cdbe2277f0c99f764809dd733e0174e0c82bb40c898e8d9072fa09c1efe0309c809ab87c98461009b565b6104cc6101408801357f1d653e30b436c89bdd309f274fcc379fc963bb1ecb9ff4a965558fb9c1893fee7f1086adc4fbf74d59d3d2ee4a17e6121f5c4824e80bdb7b33446702c4eb61595c8461009b565b61051d6101608801357f069e71d914e4ca5c02f03fa47aae07c6d78914e6bcbf049bda635e616e76e63e7f0fc0d693011bbca035251d088e9e8877569732e38fa4b73a3a7542610e3f24978461009b565b61056e6101808801357f105f439891955b8038c4c9dde2b4d89e007c5119bff9986d4beae2850e083d0c7f1cf8b02a9355355f2dd71cf05d87cc6748e7995557551cc497f924934feee4a88461009b565b6105bf6101a08801357f0e4184e890a4207ff4a9489776be98a66417139e025c9f9c73e0d8a054211fe67f140da169490a13b378a2376b9600fba4dcfe5113c85d43e41224e7c6713fce178461009b565b6106106101c08801357f1f00d8d21551d78019bc29e7a17f41ac1f8a5a5c4633ddb7e765a13f724cb1717f2a42dfcd2d10b903edffa8eaf50b46293419539b7380c3c03a773ba80c059b3c8461009b565b6106616101e08801357f1ede3b977af183af4e515d978949ff53699f8873649fd951819ca10833bd6f0d7f0716114c41addfcbf08d5f47cbe0386ee9c53ac85eb47c7452c7f569611aaee48461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f2392ccf930a9032ba5366da2f5704b3214811e1fc86c1fb9111f7ac47f561e276102808301527f077d98a0fd02d1142a6e34ac778297d38f3a4b06c28f7ccb3db4887e23604a106102a08301527f10ff7f7e68142579d8af04ff5721536e19f528a66f1061058d0ec48b62bb53df6102c08301527f2bb162e21fec7a262f302950b2483fed74094b47e0d74e9b9d14fde65bbbdcda6102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b604051610380810160405261095d6000840135610067565b61096a6020840135610067565b6109776040840135610067565b6109846060840135610067565b6109916080840135610067565b61099e60a0840135610067565b6109ab60c0840135610067565b6109b860e0840135610067565b6109c6610100840135610067565b6109d4610120840135610067565b6109e2610140840135610067565b6109f0610160840135610067565b6109fe610180840135610067565b610a0c6101a0840135610067565b610a1a6101c0840135610067565b610a286101e0840135610067565b610a36610200840135610067565b610a43818486888a610106565b8060005260206000f35b600080fd5b600080fd5b600081905082602060020282011115610a7357610a72610a52565b5b92915050565b600081905082604060020282011115610a9557610a94610a52565b5b92915050565b600081905082602060100282011115610ab757610ab6610a52565b5b92915050565b6000806000806103008587031215610ad857610ad7610a4d565b5b6000610ae687828801610a57565b9450506040610af787828801610a79565b93505060c0610b0887828801610a57565b925050610100610b1a87828801610a9b565b91505092959194509250565b60008115159050919050565b610b3b81610b26565b82525050565b6000602082019050610b566000830184610b32565b9291505056fea2646970667358221220fd86152433b0a9a998cac3dd9115fb57db6878af5f9f951517f3218ae64e721064736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c82febf514610030575b600080fd5b61004a60048036038101906100459190610abd565b610060565b6040516100579190610b41565b60405180910390f35b6000610945565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f1b5297260a965e84a18d4dcf67193ad9e5941e482e37d7a8c7124d19cea4f9b681527f13c4b609a458c723aa589ba3c51402e56e1eda7dc441ca83dbdd19543723460660208201526101a960008801357f22e24ced226fa2349cf768b6062c63d1c7310d954103d97608ba5d262dc3f9bc7f078026109604dc9cc18c37cc6ed83eb7a70f13e7b4a9f8b0529eb1b3a41ec9af8461009b565b6101f960208801357f1edb8d1b18377311ee0bef60e924e10a390247796b2592a0cbefa4e72ff8e2397f11e84fa4deb75a055bb9f01718a7f2f3e6817b21665d91decb5d9603b34dbe4a8461009b565b61024960408801357f2d03f97c82badc052d3f6bac221fa849fd8b4ab31776c3d3d320cb7a3f4036277f0f2eaa802ea8461881b4e403e2190c7232d85be1ebf6b391b12af3386647faaa8461009b565b61029960608801357f2687b2cf6fe1e61e0aab297629979b84e28ced6fddab29e055a5dfdaa81748167f114a1c8d2bc9cd353176d5e2d31d6944082bc34a6919d97d70689f4f9035ff398461009b565b6102e960808801357f26fc44745f6026ef7b2bc4ad7381009ea3b11aa6ac3e1e55c00e86abe4b21a8a7f14a00c66e27d3b381415195e754790dcc7246351fd4e7864ec94f468e184479b8461009b565b61033960a08801357f2757022e408976c392d5f09144918cae891f6adaa48d3f7fea4b167a8ed660c37f21a35e76b36c984e0aa70a0b2906b33caa9e6ed21d1b482b38670330bead2b4f8461009b565b61038960c08801357f2598bf32ef243200119aa2de8f9c6d5da1f7d469f481d111a3bdfcc67b11ac0e7f2454700f9a45267241a07e4e111e1ca58e0de630d88c82eee08ca7db1304e6d38461009b565b6103d960e08801357f1917385492376f04b4ba5df39c7ae83b2f2795b6e3d38089a821134b9fffc0aa7f24a0125521b665b8aba672dc06d9409b366cc6a6976a8dce86dacdf06fba93818461009b565b61042a6101008801357f26fa95b7e183a02dfa53eb8bc6ad1d11d7f02122007ba1dd7ac79c1c68c0ce6e7f2d2c82b07eed82c21e410ff0049caf8f55fc9ca5341a8f7d0f4fa00ae3a221fe8461009b565b61047b6101208801357f0c53b9d4bdc2b772b01212fe199527ef035d5e6107f3d3bb7066a4667cdbe2277f0c99f764809dd733e0174e0c82bb40c898e8d9072fa09c1efe0309c809ab87c98461009b565b6104cc6101408801357f1d653e30b436c89bdd309f274fcc379fc963bb1ecb9ff4a965558fb9c1893fee7f1086adc4fbf74d59d3d2ee4a17e6121f5c4824e80bdb7b33446702c4eb61595c8461009b565b61051d6101608801357f069e71d914e4ca5c02f03fa47aae07c6d78914e6bcbf049bda635e616e76e63e7f0fc0d693011bbca035251d088e9e8877569732e38fa4b73a3a7542610e3f24978461009b565b61056e6101808801357f105f439891955b8038c4c9dde2b4d89e007c5119bff9986d4beae2850e083d0c7f1cf8b02a9355355f2dd71cf05d87cc6748e7995557551cc497f924934feee4a88461009b565b6105bf6101a08801357f0e4184e890a4207ff4a9489776be98a66417139e025c9f9c73e0d8a054211fe67f140da169490a13b378a2376b9600fba4dcfe5113c85d43e41224e7c6713fce178461009b565b6106106101c08801357f1f00d8d21551d78019bc29e7a17f41ac1f8a5a5c4633ddb7e765a13f724cb1717f2a42dfcd2d10b903edffa8eaf50b46293419539b7380c3c03a773ba80c059b3c8461009b565b6106616101e08801357f1ede3b977af183af4e515d978949ff53699f8873649fd951819ca10833bd6f0d7f0716114c41addfcbf08d5f47cbe0386ee9c53ac85eb47c7452c7f569611aaee48461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f2392ccf930a9032ba5366da2f5704b3214811e1fc86c1fb9111f7ac47f561e276102808301527f077d98a0fd02d1142a6e34ac778297d38f3a4b06c28f7ccb3db4887e23604a106102a08301527f10ff7f7e68142579d8af04ff5721536e19f528a66f1061058d0ec48b62bb53df6102c08301527f2bb162e21fec7a262f302950b2483fed74094b47e0d74e9b9d14fde65bbbdcda6102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b604051610380810160405261095d6000840135610067565b61096a6020840135610067565b6109776040840135610067565b6109846060840135610067565b6109916080840135610067565b61099e60a0840135610067565b6109ab60c0840135610067565b6109b860e0840135610067565b6109c6610100840135610067565b6109d4610120840135610067565b6109e2610140840135610067565b6109f0610160840135610067565b6109fe610180840135610067565b610a0c6101a0840135610067565b610a1a6101c0840135610067565b610a286101e0840135610067565b610a36610200840135610067565b610a43818486888a610106565b8060005260206000f35b600080fd5b600080fd5b600081905082602060020282011115610a7357610a72610a52565b5b92915050565b600081905082604060020282011115610a9557610a94610a52565b5b92915050565b600081905082602060100282011115610ab757610ab6610a52565b5b92915050565b6000806000806103008587031215610ad857610ad7610a4d565b5b6000610ae687828801610a57565b9450506040610af787828801610a79565b93505060c0610b0887828801610a57565b925050610100610b1a87828801610a9b565b91505092959194509250565b60008115159050919050565b610b3b81610b26565b82525050565b6000602082019050610b566000830184610b32565b9291505056fea2646970667358221220fd86152433b0a9a998cac3dd9115fb57db6878af5f9f951517f3218ae64e721064736f6c63430008120033", + "bytecode": "0x608060405234801561001057600080fd5b506107df806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f398789b14610030575b600080fd5b61004a6004803603810190610045919061070a565b610060565b604051610057919061078e565b60405180910390f35b600061061d565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f1973951e3206379f4b6cb9ed31fd07e9addd1ce68ab96ad19772c7d0158cba9c81527f2d6c822a71336962fd88a2bcfa2fae9728d345b1f8ac02ef42e6732363fb16fa60208201526101a960008801357f1c4ff48dd08344e7d8ec93176ac4b4a89c3007053fa3762c07c59db1e7c8224f7f0af2a778dd1b8e999ceedf5a3b70df4ca2b6b49b25ab2a7c9946ad6a9286b0d18461009b565b6101f960208801357f2df91f17d37221f3be246a89e8ffe13b9ccc0afdcf80d5fcd343a347ad34b6fa7f2382d5ad4ebe78eeacc64bfebf7ca7e04154e5d09f7dd947d1e96db07e844c4b8461009b565b61024960408801357f06a4be12318195066a5b96da729b895ffb35d15f0da863bc589ad87dc92a59b37f25c6c85b5e06226e16bf0ce04b41e24a9e70443959a839e140381ee36b4973498461009b565b61029960608801357f0898eec5cc579d3a7213b2b38afaaf269613f60f231f788ffa2499be402c23757f18eb6d35340d98950203d516789960e1cbebd23d7fcef9836185fedc73c607088461009b565b6102e960808801357f05c16a0090bf91c1f53f7bd71a0016b99fb8ece9f11b5413a8916a89efc903407f1acc863422c39f57de8944287a183732c41d986e2da7298415f5157351852aaf8461009b565b61033960a08801357f2332aaf5f84f1f039f292c20fa042012f30899bafa18afbaf85f96385cbe0e617f258b4482fa5d1c1267315e5f6bbc023dc6a8fc810ab8a419b787949efcc1a9868461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f30608196799b6fa0d373d1fe070fc3b504cbdf5c9bbeea0931ba648d31dd6c5b6102808301527f2d6f9b13aa87bf4aa8771e8fa1434c8b11c48e307a238977b2e3e5ad61be9a316102a08301527f14a01ba3d8d9b9e795b2abdc8ce9956d09f7d9c281cc3161aecf7cbafdc37bcf6102c08301527f2ac9260bd42ea4ff2cf4275077bff605956e781d183ad179258a9b841f81dbd56102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b60405161038081016040526106356000840135610067565b6106426020840135610067565b61064f6040840135610067565b61065c6060840135610067565b6106696080840135610067565b61067660a0840135610067565b61068360c0840135610067565b610690818486888a610106565b8060005260206000f35b600080fd5b600080fd5b6000819050826020600202820111156106c0576106bf61069f565b5b92915050565b6000819050826040600202820111156106e2576106e161069f565b5b92915050565b6000819050826020600602820111156107045761070361069f565b5b92915050565b6000806000806101c085870312156107255761072461069a565b5b6000610733878288016106a4565b9450506040610744878288016106c6565b93505060c0610755878288016106a4565b925050610100610767878288016106e8565b91505092959194509250565b60008115159050919050565b61078881610773565b82525050565b60006020820190506107a3600083018461077f565b9291505056fea2646970667358221220978338d3b7e7eb263f7e42984027d49d99a206cc70383f0a45b20c0c7ab12d5364736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f398789b14610030575b600080fd5b61004a6004803603810190610045919061070a565b610060565b604051610057919061078e565b60405180910390f35b600061061d565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f1973951e3206379f4b6cb9ed31fd07e9addd1ce68ab96ad19772c7d0158cba9c81527f2d6c822a71336962fd88a2bcfa2fae9728d345b1f8ac02ef42e6732363fb16fa60208201526101a960008801357f1c4ff48dd08344e7d8ec93176ac4b4a89c3007053fa3762c07c59db1e7c8224f7f0af2a778dd1b8e999ceedf5a3b70df4ca2b6b49b25ab2a7c9946ad6a9286b0d18461009b565b6101f960208801357f2df91f17d37221f3be246a89e8ffe13b9ccc0afdcf80d5fcd343a347ad34b6fa7f2382d5ad4ebe78eeacc64bfebf7ca7e04154e5d09f7dd947d1e96db07e844c4b8461009b565b61024960408801357f06a4be12318195066a5b96da729b895ffb35d15f0da863bc589ad87dc92a59b37f25c6c85b5e06226e16bf0ce04b41e24a9e70443959a839e140381ee36b4973498461009b565b61029960608801357f0898eec5cc579d3a7213b2b38afaaf269613f60f231f788ffa2499be402c23757f18eb6d35340d98950203d516789960e1cbebd23d7fcef9836185fedc73c607088461009b565b6102e960808801357f05c16a0090bf91c1f53f7bd71a0016b99fb8ece9f11b5413a8916a89efc903407f1acc863422c39f57de8944287a183732c41d986e2da7298415f5157351852aaf8461009b565b61033960a08801357f2332aaf5f84f1f039f292c20fa042012f30899bafa18afbaf85f96385cbe0e617f258b4482fa5d1c1267315e5f6bbc023dc6a8fc810ab8a419b787949efcc1a9868461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f30608196799b6fa0d373d1fe070fc3b504cbdf5c9bbeea0931ba648d31dd6c5b6102808301527f2d6f9b13aa87bf4aa8771e8fa1434c8b11c48e307a238977b2e3e5ad61be9a316102a08301527f14a01ba3d8d9b9e795b2abdc8ce9956d09f7d9c281cc3161aecf7cbafdc37bcf6102c08301527f2ac9260bd42ea4ff2cf4275077bff605956e781d183ad179258a9b841f81dbd56102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b60405161038081016040526106356000840135610067565b6106426020840135610067565b61064f6040840135610067565b61065c6060840135610067565b6106696080840135610067565b61067660a0840135610067565b61068360c0840135610067565b610690818486888a610106565b8060005260206000f35b600080fd5b600080fd5b6000819050826020600202820111156106c0576106bf61069f565b5b92915050565b6000819050826040600202820111156106e2576106e161069f565b5b92915050565b6000819050826020600602820111156107045761070361069f565b5b92915050565b6000806000806101c085870312156107255761072461069a565b5b6000610733878288016106a4565b9450506040610744878288016106c6565b93505060c0610755878288016106a4565b925050610100610767878288016106e8565b91505092959194509250565b60008115159050919050565b61078881610773565b82525050565b60006020820190506107a3600083018461077f565b9291505056fea2646970667358221220978338d3b7e7eb263f7e42984027d49d99a206cc70383f0a45b20c0c7ab12d5364736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/app/deployments/ProofOfPassport.json b/app/deployments/ProofOfPassport.json index a7034b789..67ceecb55 100644 --- a/app/deployments/ProofOfPassport.json +++ b/app/deployments/ProofOfPassport.json @@ -14,6 +14,11 @@ "internalType": "contract Formatter", "name": "f", "type": "address" + }, + { + "internalType": "contract Registry", + "name": "r", + "type": "address" } ], "stateMutability": "nonpayable", @@ -184,19 +189,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "cscaPubkey", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -309,9 +301,9 @@ "type": "uint256[2]" }, { - "internalType": "uint256[16]", + "internalType": "uint256[6]", "name": "inputs", - "type": "uint256[16]" + "type": "uint256[6]" } ], "name": "mint", @@ -383,6 +375,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "registry", + "outputs": [ + { + "internalType": "contract Registry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "renounceOwnership", @@ -462,22 +467,9 @@ { "inputs": [ { - "internalType": "address", - "name": "_CSCApubKey", - "type": "address" - } - ], - "name": "setCSCApubKey", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256[16]", + "internalType": "uint256[6]", "name": "input", - "type": "uint256[16]" + "type": "uint256[6]" } ], "name": "sliceFirstThree", @@ -648,8 +640,8 @@ "type": "function" } ], - "bytecode": "0x60a06040526000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b5060405162006ad838038062006ad88339818101604052810190620000799190620009d1565b6040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152506040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152508160009081620000f6919062000c92565b50806001908162000108919062000c92565b5050506200012b6200011f620001c960201b60201c565b620001d160201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b06200029760201b60201c565b620001c133620007bd60201b60201c565b505062000e94565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600e60405180608001604052806040518060400160405280600d81526020017f69737375696e675f7374617465000000000000000000000000000000000000008152508152602001600281526020016004815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000332919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600481526020017f6e616d6500000000000000000000000000000000000000000000000000000000815250815260200160058152602001602b8152602001600181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620003ee919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600f81526020017f70617373706f72745f6e756d62657200000000000000000000000000000000008152508152602001602c815260200160348152602001600281525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620004aa919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6e6174696f6e616c6974790000000000000000000000000000000000000000008152508152602001603681526020016038815260200160038152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000566919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600d81526020017f646174655f6f665f626972746800000000000000000000000000000000000000815250815260200160398152602001603e815260200160048152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000622919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600681526020017f67656e646572000000000000000000000000000000000000000000000000000081525081526020016040815260200160408152602001600581525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620006de919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6578706972795f64617465000000000000000000000000000000000000000000815250815260200160418152602001604681526020016006815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000190816200079a919062000c92565b506020820151816001015560408201518160020155606082015181600301555050565b620007cd6200085360201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008369062000e00565b60405180910390fd5b6200085081620001d160201b60201c565b50565b62000863620001c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000889620008e460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d99062000e72565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009408262000913565b9050919050565b6000620009548262000933565b9050919050565b620009668162000947565b81146200097257600080fd5b50565b60008151905062000986816200095b565b92915050565b6000620009998262000933565b9050919050565b620009ab816200098c565b8114620009b757600080fd5b50565b600081519050620009cb81620009a0565b92915050565b60008060408385031215620009eb57620009ea6200090e565b5b6000620009fb8582860162000975565b925050602062000a0e85828601620009ba565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a9a57607f821691505b60208210810362000ab05762000aaf62000a52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000adb565b62000b26868362000adb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b7362000b6d62000b678462000b3e565b62000b48565b62000b3e565b9050919050565b6000819050919050565b62000b8f8362000b52565b62000ba762000b9e8262000b7a565b84845462000ae8565b825550505050565b600090565b62000bbe62000baf565b62000bcb81848462000b84565b505050565b5b8181101562000bf35762000be760008262000bb4565b60018101905062000bd1565b5050565b601f82111562000c425762000c0c8162000ab6565b62000c178462000acb565b8101602085101562000c27578190505b62000c3f62000c368562000acb565b83018262000bd0565b50505b505050565b600082821c905092915050565b600062000c676000198460080262000c47565b1980831691505092915050565b600062000c82838362000c54565b9150826002028217905092915050565b62000c9d8262000a18565b67ffffffffffffffff81111562000cb95762000cb862000a23565b5b62000cc5825462000a81565b62000cd282828562000bf7565b600060209050601f83116001811462000d0a576000841562000cf5578287015190505b62000d01858262000c74565b86555062000d71565b601f19841662000d1a8662000ab6565b60005b8281101562000d445784890151825560018201915060208501945060208101905062000d1d565b8683101562000d64578489015162000d60601f89168262000c54565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000de860268362000d79565b915062000df58262000d8a565b604082019050919050565b6000602082019050818103600083015262000e1b8162000dd9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e5a60208362000d79565b915062000e678262000e22565b602082019050919050565b6000602082019050818103600083015262000e8d8162000e4b565b9050919050565b608051615c2162000eb7600039600081816108db01526114ee0152615c216000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c87b56dd116100a2578063dc54daf011610071578063dc54daf014610569578063e985e9c514610599578063eba11e05146105c9578063f2fde38b146105e7576101cf565b8063c87b56dd146104bd578063d21e82ab146104ed578063d4d9c00f1461051d578063d9548e5314610539576101cf565b806395d89b41116100de57806395d89b4114610434578063a22cb46514610452578063b04e3a3b1461046e578063b88d4fde146104a1576101cf565b8063715018a6146103dc57806376e6a447146103e65780638da5cb5b14610416576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce71461033057806354f96d52146103605780636352211e1461037c57806370a08231146103ac576101cf565b80632f745c59146102c65780633a41515f146102f657806342842e0e14610314576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632b7ac3f3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e991906134d8565b610603565b6040516101fb9190613520565b60405180910390f35b61020c61067d565b60405161021991906135cb565b60405180910390f35b61023c60048036038101906102379190613623565b61070f565b6040516102499190613691565b60405180910390f35b61026c600480360381019061026791906136d8565b610755565b005b61027661086c565b6040516102839190613727565b60405180910390f35b6102a660048036038101906102a19190613742565b610879565b005b6102b06108d9565b6040516102bd91906137f4565b60405180910390f35b6102e060048036038101906102db91906136d8565b6108fd565b6040516102ed9190613727565b60405180910390f35b6102fe6109a2565b60405161030b9190613830565b60405180910390f35b61032e60048036038101906103299190613742565b6109c8565b005b61034a60048036038101906103459190613623565b6109e8565b6040516103579190613727565b60405180910390f35b61037a6004803603810190610375919061384b565b610a59565b005b61039660048036038101906103919190613623565b610aa5565b6040516103a39190613691565b60405180910390f35b6103c660048036038101906103c1919061384b565b610b2b565b6040516103d39190613727565b60405180910390f35b6103e4610be2565b005b61040060048036038101906103fb91906139ae565b610bf6565b60405161040d9190613a87565b60405180910390f35b61041e610c63565b60405161042b9190613691565b60405180910390f35b61043c610c8d565b60405161044991906135cb565b60405180910390f35b61046c60048036038101906104679190613ace565b610d1f565b005b61048860048036038101906104839190613623565b610d35565b6040516104989493929190613b0e565b60405180910390f35b6104bb60048036038101906104b69190613c0f565b610dfd565b005b6104d760048036038101906104d29190613623565b610e5f565b6040516104e491906135cb565b60405180910390f35b61050760048036038101906105029190613623565b6114cc565b6040516105149190613520565b60405180910390f35b61053760048036038101906105329190613df4565b6114ec565b005b610553600480360381019061054e9190613623565b611971565b6040516105609190613520565b60405180910390f35b610583600480360381019061057e9190613f0e565b611b23565b6040516105909190613f90565b60405180910390f35b6105b360048036038101906105ae9190613fb2565b611c83565b6040516105c09190613520565b60405180910390f35b6105d1611d17565b6040516105de9190613691565b60405180910390f35b61060160048036038101906105fc919061384b565b611d3d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610676575061067582611dc0565b5b9050919050565b60606000805461068c90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546106b890614021565b80156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b5050505050905090565b600061071a82611ea2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076082610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c7906140c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ef611eed565b73ffffffffffffffffffffffffffffffffffffffff16148061081e575061081d81610818611eed565b611c83565b5b61085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490614156565b60405180910390fd5b6108678383611ef5565b505050565b6000600880549050905090565b61088a610884611eed565b82611fae565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c0906141e8565b60405180910390fd5b6108d4838383612043565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061090883610b2b565b8210610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061427a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e383838360405180602001604052806000815250610dfd565b505050565b60006109f261086c565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a9061430c565b60405180910390fd5b60088281548110610a4757610a4661432c565b5b90600052602060002001549050919050565b610a6161233c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ab1836123ba565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906143a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290614439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bea61233c565b610bf460006123f7565b565b610bfe61344a565b610c0661344a565b60005b6003811015610c5957838160108110610c2557610c2461432c565b5b6020020151828260038110610c3d57610c3c61432c565b5b6020020181815250508080610c5190614488565b915050610c09565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c9c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc890614021565b8015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050905090565b610d31610d2a611eed565b83836124bd565b5050565b600e8181548110610d4557600080fd5b9060005260206000209060040201600091509050806000018054610d6890614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614021565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b5050505050908060010154908060020154908060030154905084565b610e0e610e08611eed565b83611fae565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906141e8565b60405180910390fd5b610e5984848484612629565b50505050565b6060610e6a82612685565b610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614542565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015610f88578382018054610efb90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614021565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081526020019060010190610ee5565b50505050815250509050610fed6040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e555249000000000000008152508260000151600060078110610fe357610fe261432c565b5b60200201516126c6565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106110465761104561432c565b5b60200201516040518263ffffffff1660e01b815260040161106791906135cb565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614603565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed856000015160006007811061110d5761110c61432c565b5b60200201516040518263ffffffff1660e01b815260040161112e91906135cb565b600060405180830381865afa15801561114b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611174919061467b565b8383866000015160026007811061118e5761118d61432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106111e9576111e861432c565b5b60200201516040518263ffffffff1660e01b815260040161120a91906135cb565b600060405180830381865afa158015611227573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611250919061467b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a600001516004600781106112a6576112a561432c565b5b60200201516040518263ffffffff1660e01b81526004016112c791906135cb565b600060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061130d919061467b565b89600001516005600781106113255761132461432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c600001516006600781106113805761137f61432c565b5b60200201516040518263ffffffff1660e01b81526004016113a191906135cb565b600060405180830381865afa1580156113be573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e7919061467b565b6113f08e611971565b61142f576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611466565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b61146f8f612762565b6040516020016114889a99989796959493929190614d16565b60405160208183030381529060405290506114a281612830565b6040516020016114b29190614e88565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c82febf5858585856040518563ffffffff1660e01b815260040161154b94939291906150b0565b602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c919061510c565b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290615185565b60405180910390fd5b600081600160106115dc91906151a5565b601081106115ed576115ec61432c565b5b6020020151905060006115fe61086c565b905061160a82826129b4565b6001600d6000856003601081106116245761162361432c565b5b6020020151815260200190815260200160002060006101000a81548160ff021916908315150217905550600061165984610bf6565b9050600061166682611b23565b90506000600f6000858152602001908152602001600020905060005b600e80549050811015611965576000600e82815481106116a5576116a461432c565b5b90600052602060002090600402016040518060800160405290816000820180546116ce90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546116fa90614021565b80156117475780601f1061171c57610100808354040283529160200191611747565b820191906000526020600020905b81548152906001019060200180831161172a57829003601f168201915b5050505050815260200160018201548152602001600282015481526020016003820154815250509050600060018260200151836040015161178891906151a5565b61179291906151d9565b67ffffffffffffffff8111156117ab576117aa61387d565b5b6040519080825280601f01601f1916602001820160405280156117dd5781602001600182028036833780820191505090505b5090506000826020015190505b82604001518111611877578581815181106118085761180761432c565b5b602001015160f81c60f81b8284602001518361182491906151a5565b815181106118355761183461432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061186f90614488565b9150506117ea565b506000819050808560000185600781106118945761189361432c565b5b0190816118a191906153af565b5061194f83600001518660000186600781106118c0576118bf61432c565b5b0180546118cc90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614021565b80156119455780601f1061191a57610100808354040283529160200191611945565b820191906000526020600020905b81548152906001019060200180831161192857829003601f168201915b50505050506126c6565b505050808061195d90614488565b915050611682565b50505050505050505050565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611a515783820180546119c490614021565b80601f01602080910402602001604051908101604052809291908181526020018280546119f090614021565b8015611a3d5780601f10611a1257610100808354040283529160200191611a3d565b820191906000526020600020905b815481529060010190602001808311611a2057829003601f168201915b5050505050815260200190600101906119ae565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611ab357611ab261432c565b5b60200201516040518263ffffffff1660e01b8152600401611ad491906135cb565b602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190615496565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611b6d57611b6c61387d565b5b6040519080825280601f01601f191660200182016040528015611b9f5781602001600182028036833780820191505090505b5090506000805b6003811015611c77576000868260038110611bc457611bc361432c565b5b6020020151905060005b858360038110611be157611be061432c565b5b602002015160ff168160ff161015611c625760ff821660f81b858580611c0690614488565b965081518110611c1957611c1861432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611c5a906154d0565b915050611bce565b50508080611c6f90614488565b915050611ba6565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d4561233c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab9061556b565b60405180910390fd5b611dbd816123f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e9b5750611e9a82612bd1565b5b9050919050565b611eab81612685565b611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906143a7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6883610aa5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fba83610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc5750611ffb8185611c83565b5b8061203a57508373ffffffffffffffffffffffffffffffffffffffff166120228461070f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206382610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906155fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061568f565b60405180910390fd5b6121358383836001612c3b565b8273ffffffffffffffffffffffffffffffffffffffff1661215582610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a2906155fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123378383836001612cbc565b505050565b612344611eed565b73ffffffffffffffffffffffffffffffffffffffff16612362610c63565b73ffffffffffffffffffffffffffffffffffffffff16146123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906156fb565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290615767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161261c9190613520565b60405180910390a3505050565b612634848484612043565b61264084848484612cc2565b61267f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612676906157f9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166126a7836123ba565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61275e82826040516024016126dc929190615819565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e49565b5050565b60606000600161277184612e6a565b01905060008167ffffffffffffffff8111156127905761278f61387d565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b509050600082602001820190505b600115612825578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161281957612818615850565b5b049450600085036127d0575b819350505050919050565b60606000825103612852576040518060200160405280600081525090506129af565b6000604051806060016040528060408152602001615bac604091399050600060036002855161288191906151d9565b61288b919061587f565b600461289791906158b0565b905060006020826128a891906151d9565b67ffffffffffffffff8111156128c1576128c061387d565b5b6040519080825280601f01601f1916602001820160405280156128f35781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561296e576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612907565b6003895106600181146129885760028114612998576129a3565b613d3d60f01b60028303526129a3565b603d60f81b60018303525b50505050508093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061593e565b60405180910390fd5b612a2c81612685565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906159aa565b60405180910390fd5b612a7a600083836001612c3b565b612a8381612685565b15612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba906159aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bcd600083836001612cbc565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c4784848484612fbd565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90615a3c565b60405180910390fd5b50505050565b50505050565b6000612ce38473ffffffffffffffffffffffffffffffffffffffff1661311b565b15612e3c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0c611eed565b8786866040518563ffffffff1660e01b8152600401612d2e9493929190615a5c565b6020604051808303816000875af1925050508015612d6a57506040513d601f19601f82011682018060405250810190612d679190615abd565b60015b612dec573d8060008114612d9a576040519150601f19603f3d011682016040523d82523d6000602084013e612d9f565b606091505b506000815103612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb906157f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e41565b600190505b949350505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ec8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ebe57612ebd615850565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f05576d04ee2d6d415b85acef81000000008381612efb57612efa615850565b5b0492506020810190505b662386f26fc100008310612f3457662386f26fc100008381612f2a57612f29615850565b5b0492506010810190505b6305f5e1008310612f5d576305f5e1008381612f5357612f52615850565b5b0492506008810190505b6127108310612f82576127108381612f7857612f77615850565b5b0492506004810190505b60648310612fa55760648381612f9b57612f9a615850565b5b0492506002810190505b600a8310612fb4576001810190505b80915050919050565b612fc98484848461313e565b600181111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615b5c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036130545761304f81613144565b613093565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461309257613091858261318d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130d5576130d0816132fa565b613114565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131135761311284826133cb565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319a84610b2b565b6131a491906151a5565b9050600060076000848152602001908152602001600020549050818114613289576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061330e91906151a5565b905060006009600084815260200190815260200160002054905060006008838154811061333e5761333d61432c565b5b9060005260206000200154905080600883815481106133605761335f61432c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133af576133ae615b7c565b5b6001900381819060005260206000200160009055905550505050565b60006133d683610b2b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134b581613480565b81146134c057600080fd5b50565b6000813590506134d2816134ac565b92915050565b6000602082840312156134ee576134ed613476565b5b60006134fc848285016134c3565b91505092915050565b60008115159050919050565b61351a81613505565b82525050565b60006020820190506135356000830184613511565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357557808201518184015260208101905061355a565b60008484015250505050565b6000601f19601f8301169050919050565b600061359d8261353b565b6135a78185613546565b93506135b7818560208601613557565b6135c081613581565b840191505092915050565b600060208201905081810360008301526135e58184613592565b905092915050565b6000819050919050565b613600816135ed565b811461360b57600080fd5b50565b60008135905061361d816135f7565b92915050565b60006020828403121561363957613638613476565b5b60006136478482850161360e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061367b82613650565b9050919050565b61368b81613670565b82525050565b60006020820190506136a66000830184613682565b92915050565b6136b581613670565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613476565b5b60006136fd858286016136c3565b925050602061370e8582860161360e565b9150509250929050565b613721816135ed565b82525050565b600060208201905061373c6000830184613718565b92915050565b60008060006060848603121561375b5761375a613476565b5b6000613769868287016136c3565b935050602061377a868287016136c3565b925050604061378b8682870161360e565b9150509250925092565b6000819050919050565b60006137ba6137b56137b084613650565b613795565b613650565b9050919050565b60006137cc8261379f565b9050919050565b60006137de826137c1565b9050919050565b6137ee816137d3565b82525050565b600060208201905061380960008301846137e5565b92915050565b600061381a826137c1565b9050919050565b61382a8161380f565b82525050565b60006020820190506138456000830184613821565b92915050565b60006020828403121561386157613860613476565b5b600061386f848285016136c3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138b582613581565b810181811067ffffffffffffffff821117156138d4576138d361387d565b5b80604052505050565b60006138e761346c565b90506138f382826138ac565b919050565b600067ffffffffffffffff8211156139135761391261387d565b5b602082029050919050565b600080fd5b6000613936613931846138f8565b6138dd565b905080602084028301858111156139505761394f61391e565b5b835b818110156139795780613965888261360e565b845260208401935050602081019050613952565b5050509392505050565b600082601f83011261399857613997613878565b5b60106139a5848285613923565b91505092915050565b600061020082840312156139c5576139c4613476565b5b60006139d384828501613983565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613a05816135ed565b82525050565b6000613a1783836139fc565b60208301905092915050565b6000602082019050919050565b613a39816139dc565b613a4381846139e7565b9250613a4e826139f2565b8060005b83811015613a7f578151613a668782613a0b565b9650613a7183613a23565b925050600181019050613a52565b505050505050565b6000606082019050613a9c6000830184613a30565b92915050565b613aab81613505565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613476565b5b6000613af3858286016136c3565b9250506020613b0485828601613ab9565b9150509250929050565b60006080820190508181036000830152613b288187613592565b9050613b376020830186613718565b613b446040830185613718565b613b516060830184613718565b95945050505050565b600080fd5b600067ffffffffffffffff821115613b7a57613b7961387d565b5b613b8382613581565b9050602081019050919050565b82818337600083830152505050565b6000613bb2613bad84613b5f565b6138dd565b905082815260208101848484011115613bce57613bcd613b5a565b5b613bd9848285613b90565b509392505050565b600082601f830112613bf657613bf5613878565b5b8135613c06848260208601613b9f565b91505092915050565b60008060008060808587031215613c2957613c28613476565b5b6000613c37878288016136c3565b9450506020613c48878288016136c3565b9350506040613c598782880161360e565b925050606085013567ffffffffffffffff811115613c7a57613c7961347b565b5b613c8687828801613be1565b91505092959194509250565b600067ffffffffffffffff821115613cad57613cac61387d565b5b602082029050919050565b6000613ccb613cc684613c92565b6138dd565b90508060208402830185811115613ce557613ce461391e565b5b835b81811015613d0e5780613cfa888261360e565b845260208401935050602081019050613ce7565b5050509392505050565b600082601f830112613d2d57613d2c613878565b5b6002613d3a848285613cb8565b91505092915050565b600067ffffffffffffffff821115613d5e57613d5d61387d565b5b602082029050919050565b6000613d7c613d7784613d43565b6138dd565b90508060408402830185811115613d9657613d9561391e565b5b835b81811015613dbf5780613dab8882613d18565b845260208401935050604081019050613d98565b5050509392505050565b600082601f830112613dde57613ddd613878565b5b6002613deb848285613d69565b91505092915050565b6000806000806103008587031215613e0f57613e0e613476565b5b6000613e1d87828801613d18565b9450506040613e2e87828801613dc9565b93505060c0613e3f87828801613d18565b925050610100613e5187828801613983565b91505092959194509250565b600067ffffffffffffffff821115613e7857613e7761387d565b5b602082029050919050565b6000613e96613e9184613e5d565b6138dd565b90508060208402830185811115613eb057613eaf61391e565b5b835b81811015613ed95780613ec5888261360e565b845260208401935050602081019050613eb2565b5050509392505050565b600082601f830112613ef857613ef7613878565b5b6003613f05848285613e83565b91505092915050565b600060608284031215613f2457613f23613476565b5b6000613f3284828501613ee3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613f6282613f3b565b613f6c8185613f46565b9350613f7c818560208601613557565b613f8581613581565b840191505092915050565b60006020820190508181036000830152613faa8184613f57565b905092915050565b60008060408385031215613fc957613fc8613476565b5b6000613fd7858286016136c3565b9250506020613fe8858286016136c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b60208210810361404c5761404b613ff2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ae602183613546565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614140603d83613546565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006141d2602d83613546565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614264602b83613546565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142f6602c83613546565b91506143018261429a565b604082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614391601883613546565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614423602983613546565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614493826135ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c5576144c4614459565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061452c602f83613546565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600067ffffffffffffffff82111561457d5761457c61387d565b5b61458682613581565b9050602081019050919050565b60006145a66145a184614562565b6138dd565b9050828152602081018484840111156145c2576145c1613b5a565b5b6145cd848285613557565b509392505050565b600082601f8301126145ea576145e9613878565b5b81516145fa848260208601614593565b91505092915050565b6000806040838503121561461a57614619613476565b5b600083015167ffffffffffffffff8111156146385761463761347b565b5b614644858286016145d5565b925050602083015167ffffffffffffffff8111156146655761466461347b565b5b614671858286016145d5565b9150509250929050565b60006020828403121561469157614690613476565b5b600082015167ffffffffffffffff8111156146af576146ae61347b565b5b6146bb848285016145d5565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b60006147056011836146c4565b9150614710826146cf565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614777602a836146c4565b91506147828261471b565b602a82019050919050565b60006147988261353b565b6147a281856146c4565b93506147b2818560208601613557565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b600061481a6029836146c4565b9150614825826147be565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b600061488c6028836146c4565b915061489782614830565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b60006148fe602f836146c4565b9150614909826148a2565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614970602b836146c4565b915061497b82614914565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006149e2602d836146c4565b91506149ed82614986565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614a546026836146c4565b9150614a5f826149f8565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614ac6602b836146c4565b9150614ad182614a6a565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000614b386027836146c4565b9150614b4382614adc565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b846002836146c4565b9150614b8f82614b4e565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bd06002836146c4565b9150614bdb82614b9a565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b6000614d0060d8836146c4565b9150614d0b82614be6565b60d882019050919050565b6000614d21826146f8565b9150614d2c8261476a565b9150614d38828d61478d565b9150614d438261480d565b9150614d4f828c61478d565b9150614d5a8261487f565b9150614d66828b61478d565b9150614d71826148f1565b9150614d7d828a61478d565b9150614d8882614963565b9150614d94828961478d565b9150614d9f826149d5565b9150614dab828861478d565b9150614db682614a47565b9150614dc2828761478d565b9150614dcd82614ab9565b9150614dd9828661478d565b9150614de482614b2b565b9150614df0828561478d565b9150614dfb82614b77565b9150614e0682614bc3565b9150614e1182614cf3565b9150614e1d828461478d565b9150614e2882614b77565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614e72601d836146c4565b9150614e7d82614e3c565b601d82019050919050565b6000614e9382614e65565b9150614e9f828461478d565b915081905092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b614ee081614eaa565b614eea8184614eb5565b9250614ef582614ec0565b8060005b83811015614f26578151614f0d8782613a0b565b9650614f1883614eca565b925050600181019050614ef9565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b614f6281614eaa565b614f6c8184614f4e565b9250614f7782614ec0565b8060005b83811015614fa8578151614f8f8782613a0b565b9650614f9a83614eca565b925050600181019050614f7b565b505050505050565b6000614fbc8383614f59565b60408301905092915050565b6000602082019050919050565b614fde81614f2e565b614fe88184614f39565b9250614ff382614f44565b8060005b8381101561502457815161500b8782614fb0565b965061501683614fc8565b925050600181019050614ff7565b505050505050565b600060109050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6150628161502c565b61506c8184615037565b925061507782615042565b8060005b838110156150a857815161508f8782613a0b565b965061509a8361504c565b92505060018101905061507b565b505050505050565b6000610300820190506150c66000830187614ed7565b6150d36040830186614fd5565b6150e060c0830185614ed7565b6150ee610100830184615059565b95945050505050565b60008151905061510681613aa2565b92915050565b60006020828403121561512257615121613476565b5b6000615130848285016150f7565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b600061516f600d83613546565b915061517a82615139565b602082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b60006151b0826135ed565b91506151bb836135ed565b92508282039050818111156151d3576151d2614459565b5b92915050565b60006151e4826135ed565b91506151ef836135ed565b925082820190508082111561520757615206614459565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261526f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615232565b6152798683615232565b95508019841693508086168417925050509392505050565b60006152ac6152a76152a2846135ed565b613795565b6135ed565b9050919050565b6000819050919050565b6152c683615291565b6152da6152d2826152b3565b84845461523f565b825550505050565b600090565b6152ef6152e2565b6152fa8184846152bd565b505050565b5b8181101561531e576153136000826152e7565b600181019050615300565b5050565b601f821115615363576153348161520d565b61533d84615222565b8101602085101561534c578190505b61536061535885615222565b8301826152ff565b50505b505050565b600082821c905092915050565b600061538660001984600802615368565b1980831691505092915050565b600061539f8383615375565b9150826002028217905092915050565b6153b88261353b565b67ffffffffffffffff8111156153d1576153d061387d565b5b6153db8254614021565b6153e6828285615322565b600060209050601f8311600181146154195760008415615407578287015190505b6154118582615393565b865550615479565b601f1984166154278661520d565b60005b8281101561544f5784890151825560018201915060208501945060208101905061542a565b8683101561546c5784890151615468601f891682615375565b8355505b6001600288020188555050505b505050505050565b600081519050615490816135f7565b92915050565b6000602082840312156154ac576154ab613476565b5b60006154ba84828501615481565b91505092915050565b600060ff82169050919050565b60006154db826154c3565b915060ff82036154ee576154ed614459565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615555602683613546565b9150615560826154f9565b604082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155e7602583613546565b91506155f28261558b565b604082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615679602483613546565b91506156848261561d565b604082019050919050565b600060208201905081810360008301526156a88161566c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e5602083613546565b91506156f0826156af565b602082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615751601983613546565b915061575c8261571b565b602082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157e3603283613546565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b600060408201905081810360008301526158338185613592565b905081810360208301526158478184613592565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061588a826135ed565b9150615895836135ed565b9250826158a5576158a4615850565b5b828204905092915050565b60006158bb826135ed565b91506158c6836135ed565b92508282026158d4816135ed565b915082820484148315176158eb576158ea614459565b5b5092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615928602083613546565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615994601c83613546565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615a26603083613546565b9150615a31826159ca565b604082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b6000608082019050615a716000830187613682565b615a7e6020830186613682565b615a8b6040830185613718565b8181036060830152615a9d8184613f57565b905095945050505050565b600081519050615ab7816134ac565b92915050565b600060208284031215615ad357615ad2613476565b5b6000615ae184828501615aa8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b46603583613546565b9150615b5182615aea565b604082019050919050565b60006020820190508181036000830152615b7581615b39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f1cb3ead41ea552c9e05917d60589dae17ad738336477b4d3fcac944e18167db64736f6c63430008120033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c87b56dd116100a2578063dc54daf011610071578063dc54daf014610569578063e985e9c514610599578063eba11e05146105c9578063f2fde38b146105e7576101cf565b8063c87b56dd146104bd578063d21e82ab146104ed578063d4d9c00f1461051d578063d9548e5314610539576101cf565b806395d89b41116100de57806395d89b4114610434578063a22cb46514610452578063b04e3a3b1461046e578063b88d4fde146104a1576101cf565b8063715018a6146103dc57806376e6a447146103e65780638da5cb5b14610416576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce71461033057806354f96d52146103605780636352211e1461037c57806370a08231146103ac576101cf565b80632f745c59146102c65780633a41515f146102f657806342842e0e14610314576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632b7ac3f3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e991906134d8565b610603565b6040516101fb9190613520565b60405180910390f35b61020c61067d565b60405161021991906135cb565b60405180910390f35b61023c60048036038101906102379190613623565b61070f565b6040516102499190613691565b60405180910390f35b61026c600480360381019061026791906136d8565b610755565b005b61027661086c565b6040516102839190613727565b60405180910390f35b6102a660048036038101906102a19190613742565b610879565b005b6102b06108d9565b6040516102bd91906137f4565b60405180910390f35b6102e060048036038101906102db91906136d8565b6108fd565b6040516102ed9190613727565b60405180910390f35b6102fe6109a2565b60405161030b9190613830565b60405180910390f35b61032e60048036038101906103299190613742565b6109c8565b005b61034a60048036038101906103459190613623565b6109e8565b6040516103579190613727565b60405180910390f35b61037a6004803603810190610375919061384b565b610a59565b005b61039660048036038101906103919190613623565b610aa5565b6040516103a39190613691565b60405180910390f35b6103c660048036038101906103c1919061384b565b610b2b565b6040516103d39190613727565b60405180910390f35b6103e4610be2565b005b61040060048036038101906103fb91906139ae565b610bf6565b60405161040d9190613a87565b60405180910390f35b61041e610c63565b60405161042b9190613691565b60405180910390f35b61043c610c8d565b60405161044991906135cb565b60405180910390f35b61046c60048036038101906104679190613ace565b610d1f565b005b61048860048036038101906104839190613623565b610d35565b6040516104989493929190613b0e565b60405180910390f35b6104bb60048036038101906104b69190613c0f565b610dfd565b005b6104d760048036038101906104d29190613623565b610e5f565b6040516104e491906135cb565b60405180910390f35b61050760048036038101906105029190613623565b6114cc565b6040516105149190613520565b60405180910390f35b61053760048036038101906105329190613df4565b6114ec565b005b610553600480360381019061054e9190613623565b611971565b6040516105609190613520565b60405180910390f35b610583600480360381019061057e9190613f0e565b611b23565b6040516105909190613f90565b60405180910390f35b6105b360048036038101906105ae9190613fb2565b611c83565b6040516105c09190613520565b60405180910390f35b6105d1611d17565b6040516105de9190613691565b60405180910390f35b61060160048036038101906105fc919061384b565b611d3d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610676575061067582611dc0565b5b9050919050565b60606000805461068c90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546106b890614021565b80156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b5050505050905090565b600061071a82611ea2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076082610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c7906140c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ef611eed565b73ffffffffffffffffffffffffffffffffffffffff16148061081e575061081d81610818611eed565b611c83565b5b61085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490614156565b60405180910390fd5b6108678383611ef5565b505050565b6000600880549050905090565b61088a610884611eed565b82611fae565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c0906141e8565b60405180910390fd5b6108d4838383612043565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061090883610b2b565b8210610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061427a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e383838360405180602001604052806000815250610dfd565b505050565b60006109f261086c565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a9061430c565b60405180910390fd5b60088281548110610a4757610a4661432c565b5b90600052602060002001549050919050565b610a6161233c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ab1836123ba565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906143a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290614439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bea61233c565b610bf460006123f7565b565b610bfe61344a565b610c0661344a565b60005b6003811015610c5957838160108110610c2557610c2461432c565b5b6020020151828260038110610c3d57610c3c61432c565b5b6020020181815250508080610c5190614488565b915050610c09565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c9c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc890614021565b8015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050905090565b610d31610d2a611eed565b83836124bd565b5050565b600e8181548110610d4557600080fd5b9060005260206000209060040201600091509050806000018054610d6890614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614021565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b5050505050908060010154908060020154908060030154905084565b610e0e610e08611eed565b83611fae565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906141e8565b60405180910390fd5b610e5984848484612629565b50505050565b6060610e6a82612685565b610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614542565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015610f88578382018054610efb90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614021565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081526020019060010190610ee5565b50505050815250509050610fed6040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e555249000000000000008152508260000151600060078110610fe357610fe261432c565b5b60200201516126c6565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106110465761104561432c565b5b60200201516040518263ffffffff1660e01b815260040161106791906135cb565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614603565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed856000015160006007811061110d5761110c61432c565b5b60200201516040518263ffffffff1660e01b815260040161112e91906135cb565b600060405180830381865afa15801561114b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611174919061467b565b8383866000015160026007811061118e5761118d61432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106111e9576111e861432c565b5b60200201516040518263ffffffff1660e01b815260040161120a91906135cb565b600060405180830381865afa158015611227573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611250919061467b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a600001516004600781106112a6576112a561432c565b5b60200201516040518263ffffffff1660e01b81526004016112c791906135cb565b600060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061130d919061467b565b89600001516005600781106113255761132461432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c600001516006600781106113805761137f61432c565b5b60200201516040518263ffffffff1660e01b81526004016113a191906135cb565b600060405180830381865afa1580156113be573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e7919061467b565b6113f08e611971565b61142f576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611466565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b61146f8f612762565b6040516020016114889a99989796959493929190614d16565b60405160208183030381529060405290506114a281612830565b6040516020016114b29190614e88565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c82febf5858585856040518563ffffffff1660e01b815260040161154b94939291906150b0565b602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c919061510c565b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290615185565b60405180910390fd5b600081600160106115dc91906151a5565b601081106115ed576115ec61432c565b5b6020020151905060006115fe61086c565b905061160a82826129b4565b6001600d6000856003601081106116245761162361432c565b5b6020020151815260200190815260200160002060006101000a81548160ff021916908315150217905550600061165984610bf6565b9050600061166682611b23565b90506000600f6000858152602001908152602001600020905060005b600e80549050811015611965576000600e82815481106116a5576116a461432c565b5b90600052602060002090600402016040518060800160405290816000820180546116ce90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546116fa90614021565b80156117475780601f1061171c57610100808354040283529160200191611747565b820191906000526020600020905b81548152906001019060200180831161172a57829003601f168201915b5050505050815260200160018201548152602001600282015481526020016003820154815250509050600060018260200151836040015161178891906151a5565b61179291906151d9565b67ffffffffffffffff8111156117ab576117aa61387d565b5b6040519080825280601f01601f1916602001820160405280156117dd5781602001600182028036833780820191505090505b5090506000826020015190505b82604001518111611877578581815181106118085761180761432c565b5b602001015160f81c60f81b8284602001518361182491906151a5565b815181106118355761183461432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061186f90614488565b9150506117ea565b506000819050808560000185600781106118945761189361432c565b5b0190816118a191906153af565b5061194f83600001518660000186600781106118c0576118bf61432c565b5b0180546118cc90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614021565b80156119455780601f1061191a57610100808354040283529160200191611945565b820191906000526020600020905b81548152906001019060200180831161192857829003601f168201915b50505050506126c6565b505050808061195d90614488565b915050611682565b50505050505050505050565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611a515783820180546119c490614021565b80601f01602080910402602001604051908101604052809291908181526020018280546119f090614021565b8015611a3d5780601f10611a1257610100808354040283529160200191611a3d565b820191906000526020600020905b815481529060010190602001808311611a2057829003601f168201915b5050505050815260200190600101906119ae565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611ab357611ab261432c565b5b60200201516040518263ffffffff1660e01b8152600401611ad491906135cb565b602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190615496565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611b6d57611b6c61387d565b5b6040519080825280601f01601f191660200182016040528015611b9f5781602001600182028036833780820191505090505b5090506000805b6003811015611c77576000868260038110611bc457611bc361432c565b5b6020020151905060005b858360038110611be157611be061432c565b5b602002015160ff168160ff161015611c625760ff821660f81b858580611c0690614488565b965081518110611c1957611c1861432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611c5a906154d0565b915050611bce565b50508080611c6f90614488565b915050611ba6565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d4561233c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab9061556b565b60405180910390fd5b611dbd816123f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e9b5750611e9a82612bd1565b5b9050919050565b611eab81612685565b611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906143a7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6883610aa5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fba83610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc5750611ffb8185611c83565b5b8061203a57508373ffffffffffffffffffffffffffffffffffffffff166120228461070f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206382610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906155fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061568f565b60405180910390fd5b6121358383836001612c3b565b8273ffffffffffffffffffffffffffffffffffffffff1661215582610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a2906155fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123378383836001612cbc565b505050565b612344611eed565b73ffffffffffffffffffffffffffffffffffffffff16612362610c63565b73ffffffffffffffffffffffffffffffffffffffff16146123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906156fb565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290615767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161261c9190613520565b60405180910390a3505050565b612634848484612043565b61264084848484612cc2565b61267f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612676906157f9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166126a7836123ba565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61275e82826040516024016126dc929190615819565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e49565b5050565b60606000600161277184612e6a565b01905060008167ffffffffffffffff8111156127905761278f61387d565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b509050600082602001820190505b600115612825578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161281957612818615850565b5b049450600085036127d0575b819350505050919050565b60606000825103612852576040518060200160405280600081525090506129af565b6000604051806060016040528060408152602001615bac604091399050600060036002855161288191906151d9565b61288b919061587f565b600461289791906158b0565b905060006020826128a891906151d9565b67ffffffffffffffff8111156128c1576128c061387d565b5b6040519080825280601f01601f1916602001820160405280156128f35781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561296e576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612907565b6003895106600181146129885760028114612998576129a3565b613d3d60f01b60028303526129a3565b603d60f81b60018303525b50505050508093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061593e565b60405180910390fd5b612a2c81612685565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906159aa565b60405180910390fd5b612a7a600083836001612c3b565b612a8381612685565b15612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba906159aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bcd600083836001612cbc565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c4784848484612fbd565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90615a3c565b60405180910390fd5b50505050565b50505050565b6000612ce38473ffffffffffffffffffffffffffffffffffffffff1661311b565b15612e3c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0c611eed565b8786866040518563ffffffff1660e01b8152600401612d2e9493929190615a5c565b6020604051808303816000875af1925050508015612d6a57506040513d601f19601f82011682018060405250810190612d679190615abd565b60015b612dec573d8060008114612d9a576040519150601f19603f3d011682016040523d82523d6000602084013e612d9f565b606091505b506000815103612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb906157f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e41565b600190505b949350505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ec8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ebe57612ebd615850565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f05576d04ee2d6d415b85acef81000000008381612efb57612efa615850565b5b0492506020810190505b662386f26fc100008310612f3457662386f26fc100008381612f2a57612f29615850565b5b0492506010810190505b6305f5e1008310612f5d576305f5e1008381612f5357612f52615850565b5b0492506008810190505b6127108310612f82576127108381612f7857612f77615850565b5b0492506004810190505b60648310612fa55760648381612f9b57612f9a615850565b5b0492506002810190505b600a8310612fb4576001810190505b80915050919050565b612fc98484848461313e565b600181111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615b5c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036130545761304f81613144565b613093565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461309257613091858261318d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130d5576130d0816132fa565b613114565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131135761311284826133cb565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319a84610b2b565b6131a491906151a5565b9050600060076000848152602001908152602001600020549050818114613289576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061330e91906151a5565b905060006009600084815260200190815260200160002054905060006008838154811061333e5761333d61432c565b5b9060005260206000200154905080600883815481106133605761335f61432c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133af576133ae615b7c565b5b6001900381819060005260206000200160009055905550505050565b60006133d683610b2b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134b581613480565b81146134c057600080fd5b50565b6000813590506134d2816134ac565b92915050565b6000602082840312156134ee576134ed613476565b5b60006134fc848285016134c3565b91505092915050565b60008115159050919050565b61351a81613505565b82525050565b60006020820190506135356000830184613511565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357557808201518184015260208101905061355a565b60008484015250505050565b6000601f19601f8301169050919050565b600061359d8261353b565b6135a78185613546565b93506135b7818560208601613557565b6135c081613581565b840191505092915050565b600060208201905081810360008301526135e58184613592565b905092915050565b6000819050919050565b613600816135ed565b811461360b57600080fd5b50565b60008135905061361d816135f7565b92915050565b60006020828403121561363957613638613476565b5b60006136478482850161360e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061367b82613650565b9050919050565b61368b81613670565b82525050565b60006020820190506136a66000830184613682565b92915050565b6136b581613670565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613476565b5b60006136fd858286016136c3565b925050602061370e8582860161360e565b9150509250929050565b613721816135ed565b82525050565b600060208201905061373c6000830184613718565b92915050565b60008060006060848603121561375b5761375a613476565b5b6000613769868287016136c3565b935050602061377a868287016136c3565b925050604061378b8682870161360e565b9150509250925092565b6000819050919050565b60006137ba6137b56137b084613650565b613795565b613650565b9050919050565b60006137cc8261379f565b9050919050565b60006137de826137c1565b9050919050565b6137ee816137d3565b82525050565b600060208201905061380960008301846137e5565b92915050565b600061381a826137c1565b9050919050565b61382a8161380f565b82525050565b60006020820190506138456000830184613821565b92915050565b60006020828403121561386157613860613476565b5b600061386f848285016136c3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138b582613581565b810181811067ffffffffffffffff821117156138d4576138d361387d565b5b80604052505050565b60006138e761346c565b90506138f382826138ac565b919050565b600067ffffffffffffffff8211156139135761391261387d565b5b602082029050919050565b600080fd5b6000613936613931846138f8565b6138dd565b905080602084028301858111156139505761394f61391e565b5b835b818110156139795780613965888261360e565b845260208401935050602081019050613952565b5050509392505050565b600082601f83011261399857613997613878565b5b60106139a5848285613923565b91505092915050565b600061020082840312156139c5576139c4613476565b5b60006139d384828501613983565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613a05816135ed565b82525050565b6000613a1783836139fc565b60208301905092915050565b6000602082019050919050565b613a39816139dc565b613a4381846139e7565b9250613a4e826139f2565b8060005b83811015613a7f578151613a668782613a0b565b9650613a7183613a23565b925050600181019050613a52565b505050505050565b6000606082019050613a9c6000830184613a30565b92915050565b613aab81613505565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613476565b5b6000613af3858286016136c3565b9250506020613b0485828601613ab9565b9150509250929050565b60006080820190508181036000830152613b288187613592565b9050613b376020830186613718565b613b446040830185613718565b613b516060830184613718565b95945050505050565b600080fd5b600067ffffffffffffffff821115613b7a57613b7961387d565b5b613b8382613581565b9050602081019050919050565b82818337600083830152505050565b6000613bb2613bad84613b5f565b6138dd565b905082815260208101848484011115613bce57613bcd613b5a565b5b613bd9848285613b90565b509392505050565b600082601f830112613bf657613bf5613878565b5b8135613c06848260208601613b9f565b91505092915050565b60008060008060808587031215613c2957613c28613476565b5b6000613c37878288016136c3565b9450506020613c48878288016136c3565b9350506040613c598782880161360e565b925050606085013567ffffffffffffffff811115613c7a57613c7961347b565b5b613c8687828801613be1565b91505092959194509250565b600067ffffffffffffffff821115613cad57613cac61387d565b5b602082029050919050565b6000613ccb613cc684613c92565b6138dd565b90508060208402830185811115613ce557613ce461391e565b5b835b81811015613d0e5780613cfa888261360e565b845260208401935050602081019050613ce7565b5050509392505050565b600082601f830112613d2d57613d2c613878565b5b6002613d3a848285613cb8565b91505092915050565b600067ffffffffffffffff821115613d5e57613d5d61387d565b5b602082029050919050565b6000613d7c613d7784613d43565b6138dd565b90508060408402830185811115613d9657613d9561391e565b5b835b81811015613dbf5780613dab8882613d18565b845260208401935050604081019050613d98565b5050509392505050565b600082601f830112613dde57613ddd613878565b5b6002613deb848285613d69565b91505092915050565b6000806000806103008587031215613e0f57613e0e613476565b5b6000613e1d87828801613d18565b9450506040613e2e87828801613dc9565b93505060c0613e3f87828801613d18565b925050610100613e5187828801613983565b91505092959194509250565b600067ffffffffffffffff821115613e7857613e7761387d565b5b602082029050919050565b6000613e96613e9184613e5d565b6138dd565b90508060208402830185811115613eb057613eaf61391e565b5b835b81811015613ed95780613ec5888261360e565b845260208401935050602081019050613eb2565b5050509392505050565b600082601f830112613ef857613ef7613878565b5b6003613f05848285613e83565b91505092915050565b600060608284031215613f2457613f23613476565b5b6000613f3284828501613ee3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613f6282613f3b565b613f6c8185613f46565b9350613f7c818560208601613557565b613f8581613581565b840191505092915050565b60006020820190508181036000830152613faa8184613f57565b905092915050565b60008060408385031215613fc957613fc8613476565b5b6000613fd7858286016136c3565b9250506020613fe8858286016136c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b60208210810361404c5761404b613ff2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ae602183613546565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614140603d83613546565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006141d2602d83613546565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614264602b83613546565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142f6602c83613546565b91506143018261429a565b604082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614391601883613546565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614423602983613546565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614493826135ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c5576144c4614459565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061452c602f83613546565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600067ffffffffffffffff82111561457d5761457c61387d565b5b61458682613581565b9050602081019050919050565b60006145a66145a184614562565b6138dd565b9050828152602081018484840111156145c2576145c1613b5a565b5b6145cd848285613557565b509392505050565b600082601f8301126145ea576145e9613878565b5b81516145fa848260208601614593565b91505092915050565b6000806040838503121561461a57614619613476565b5b600083015167ffffffffffffffff8111156146385761463761347b565b5b614644858286016145d5565b925050602083015167ffffffffffffffff8111156146655761466461347b565b5b614671858286016145d5565b9150509250929050565b60006020828403121561469157614690613476565b5b600082015167ffffffffffffffff8111156146af576146ae61347b565b5b6146bb848285016145d5565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b60006147056011836146c4565b9150614710826146cf565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614777602a836146c4565b91506147828261471b565b602a82019050919050565b60006147988261353b565b6147a281856146c4565b93506147b2818560208601613557565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b600061481a6029836146c4565b9150614825826147be565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b600061488c6028836146c4565b915061489782614830565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b60006148fe602f836146c4565b9150614909826148a2565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614970602b836146c4565b915061497b82614914565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006149e2602d836146c4565b91506149ed82614986565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614a546026836146c4565b9150614a5f826149f8565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614ac6602b836146c4565b9150614ad182614a6a565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000614b386027836146c4565b9150614b4382614adc565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b846002836146c4565b9150614b8f82614b4e565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bd06002836146c4565b9150614bdb82614b9a565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b6000614d0060d8836146c4565b9150614d0b82614be6565b60d882019050919050565b6000614d21826146f8565b9150614d2c8261476a565b9150614d38828d61478d565b9150614d438261480d565b9150614d4f828c61478d565b9150614d5a8261487f565b9150614d66828b61478d565b9150614d71826148f1565b9150614d7d828a61478d565b9150614d8882614963565b9150614d94828961478d565b9150614d9f826149d5565b9150614dab828861478d565b9150614db682614a47565b9150614dc2828761478d565b9150614dcd82614ab9565b9150614dd9828661478d565b9150614de482614b2b565b9150614df0828561478d565b9150614dfb82614b77565b9150614e0682614bc3565b9150614e1182614cf3565b9150614e1d828461478d565b9150614e2882614b77565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614e72601d836146c4565b9150614e7d82614e3c565b601d82019050919050565b6000614e9382614e65565b9150614e9f828461478d565b915081905092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b614ee081614eaa565b614eea8184614eb5565b9250614ef582614ec0565b8060005b83811015614f26578151614f0d8782613a0b565b9650614f1883614eca565b925050600181019050614ef9565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b614f6281614eaa565b614f6c8184614f4e565b9250614f7782614ec0565b8060005b83811015614fa8578151614f8f8782613a0b565b9650614f9a83614eca565b925050600181019050614f7b565b505050505050565b6000614fbc8383614f59565b60408301905092915050565b6000602082019050919050565b614fde81614f2e565b614fe88184614f39565b9250614ff382614f44565b8060005b8381101561502457815161500b8782614fb0565b965061501683614fc8565b925050600181019050614ff7565b505050505050565b600060109050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6150628161502c565b61506c8184615037565b925061507782615042565b8060005b838110156150a857815161508f8782613a0b565b965061509a8361504c565b92505060018101905061507b565b505050505050565b6000610300820190506150c66000830187614ed7565b6150d36040830186614fd5565b6150e060c0830185614ed7565b6150ee610100830184615059565b95945050505050565b60008151905061510681613aa2565b92915050565b60006020828403121561512257615121613476565b5b6000615130848285016150f7565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b600061516f600d83613546565b915061517a82615139565b602082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b60006151b0826135ed565b91506151bb836135ed565b92508282039050818111156151d3576151d2614459565b5b92915050565b60006151e4826135ed565b91506151ef836135ed565b925082820190508082111561520757615206614459565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261526f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615232565b6152798683615232565b95508019841693508086168417925050509392505050565b60006152ac6152a76152a2846135ed565b613795565b6135ed565b9050919050565b6000819050919050565b6152c683615291565b6152da6152d2826152b3565b84845461523f565b825550505050565b600090565b6152ef6152e2565b6152fa8184846152bd565b505050565b5b8181101561531e576153136000826152e7565b600181019050615300565b5050565b601f821115615363576153348161520d565b61533d84615222565b8101602085101561534c578190505b61536061535885615222565b8301826152ff565b50505b505050565b600082821c905092915050565b600061538660001984600802615368565b1980831691505092915050565b600061539f8383615375565b9150826002028217905092915050565b6153b88261353b565b67ffffffffffffffff8111156153d1576153d061387d565b5b6153db8254614021565b6153e6828285615322565b600060209050601f8311600181146154195760008415615407578287015190505b6154118582615393565b865550615479565b601f1984166154278661520d565b60005b8281101561544f5784890151825560018201915060208501945060208101905061542a565b8683101561546c5784890151615468601f891682615375565b8355505b6001600288020188555050505b505050505050565b600081519050615490816135f7565b92915050565b6000602082840312156154ac576154ab613476565b5b60006154ba84828501615481565b91505092915050565b600060ff82169050919050565b60006154db826154c3565b915060ff82036154ee576154ed614459565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615555602683613546565b9150615560826154f9565b604082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155e7602583613546565b91506155f28261558b565b604082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615679602483613546565b91506156848261561d565b604082019050919050565b600060208201905081810360008301526156a88161566c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e5602083613546565b91506156f0826156af565b602082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615751601983613546565b915061575c8261571b565b602082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157e3603283613546565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b600060408201905081810360008301526158338185613592565b905081810360208301526158478184613592565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061588a826135ed565b9150615895836135ed565b9250826158a5576158a4615850565b5b828204905092915050565b60006158bb826135ed565b91506158c6836135ed565b92508282026158d4816135ed565b915082820484148315176158eb576158ea614459565b5b5092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615928602083613546565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615994601c83613546565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615a26603083613546565b9150615a31826159ca565b604082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b6000608082019050615a716000830187613682565b615a7e6020830186613682565b615a8b6040830185613718565b8181036060830152615a9d8184613f57565b905095945050505050565b600081519050615ab7816134ac565b92915050565b600060208284031215615ad357615ad2613476565b5b6000615ae184828501615aa8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b46603583613546565b9150615b5182615aea565b604082019050919050565b60006020820190508181036000830152615b7581615b39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f1cb3ead41ea552c9e05917d60589dae17ad738336477b4d3fcac944e18167db64736f6c63430008120033", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162006d7538038062006d75833981810160405281019062000037919062000a16565b6040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152506040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152508160009081620000b4919062000cec565b508060019081620000c6919062000cec565b505050620000e9620000dd620001c960201b60201c565b620001d160201b60201c565b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001af6200029760201b60201c565b620001c033620007bd60201b60201c565b50505062000eee565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600e60405180608001604052806040518060400160405280600d81526020017f69737375696e675f7374617465000000000000000000000000000000000000008152508152602001600281526020016004815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000332919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600481526020017f6e616d6500000000000000000000000000000000000000000000000000000000815250815260200160058152602001602b8152602001600181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620003ee919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600f81526020017f70617373706f72745f6e756d62657200000000000000000000000000000000008152508152602001602c815260200160348152602001600281525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620004aa919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6e6174696f6e616c6974790000000000000000000000000000000000000000008152508152602001603681526020016038815260200160038152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000566919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600d81526020017f646174655f6f665f626972746800000000000000000000000000000000000000815250815260200160398152602001603e815260200160048152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000622919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600681526020017f67656e646572000000000000000000000000000000000000000000000000000081525081526020016040815260200160408152602001600581525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620006de919062000cec565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6578706972795f64617465000000000000000000000000000000000000000000815250815260200160418152602001604681526020016006815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000190816200079a919062000cec565b506020820151816001015560408201518160020155606082015181600301555050565b620007cd6200085360201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008369062000e5a565b60405180910390fd5b6200085081620001d160201b60201c565b50565b62000863620001c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000889620008e460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d99062000ecc565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009408262000913565b9050919050565b6000620009548262000933565b9050919050565b620009668162000947565b81146200097257600080fd5b50565b60008151905062000986816200095b565b92915050565b6000620009998262000933565b9050919050565b620009ab816200098c565b8114620009b757600080fd5b50565b600081519050620009cb81620009a0565b92915050565b6000620009de8262000933565b9050919050565b620009f081620009d1565b8114620009fc57600080fd5b50565b60008151905062000a1081620009e5565b92915050565b60008060006060848603121562000a325762000a316200090e565b5b600062000a428682870162000975565b935050602062000a5586828701620009ba565b925050604062000a6886828701620009ff565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000af457607f821691505b60208210810362000b0a5762000b0962000aac565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b35565b62000b80868362000b35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000bcd62000bc762000bc18462000b98565b62000ba2565b62000b98565b9050919050565b6000819050919050565b62000be98362000bac565b62000c0162000bf88262000bd4565b84845462000b42565b825550505050565b600090565b62000c1862000c09565b62000c2581848462000bde565b505050565b5b8181101562000c4d5762000c4160008262000c0e565b60018101905062000c2b565b5050565b601f82111562000c9c5762000c668162000b10565b62000c718462000b25565b8101602085101562000c81578190505b62000c9962000c908562000b25565b83018262000c2a565b50505b505050565b600082821c905092915050565b600062000cc16000198460080262000ca1565b1980831691505092915050565b600062000cdc838362000cae565b9150826002028217905092915050565b62000cf78262000a72565b67ffffffffffffffff81111562000d135762000d1262000a7d565b5b62000d1f825462000adb565b62000d2c82828562000c51565b600060209050601f83116001811462000d64576000841562000d4f578287015190505b62000d5b858262000cce565b86555062000dcb565b601f19841662000d748662000b10565b60005b8281101562000d9e5784890151825560018201915060208501945060208101905062000d77565b8683101562000dbe578489015162000dba601f89168262000cae565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000e4260268362000dd3565b915062000e4f8262000de4565b604082019050919050565b6000602082019050818103600083015262000e758162000e33565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000eb460208362000dd3565b915062000ec18262000e7c565b602082019050919050565b6000602082019050818103600083015262000ee78162000ea5565b9050919050565b608051615e6462000f11600039600081816108b40152610cea0152615e646000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063d9548e5311610071578063d9548e5314610530578063dc54daf014610560578063e985e9c514610590578063f2fde38b146105c0576101c4565b8063b88d4fde146104b4578063c87b56dd146104d0578063d21e82ab14610500576101c4565b806395d89b41116100d357806395d89b411461042b578063a22cb46514610449578063a969d56b14610465578063b04e3a3b14610481576101c4565b8063715018a6146103e55780637b103999146103ef5780638da5cb5b1461040d576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce71461032557806363382d4a146103555780636352211e1461038557806370a08231146103b5576101c4565b80632f745c59146102bb5780633a41515f146102eb57806342842e0e14610309576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632b7ac3f31461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135d4565b6105dc565b6040516101f0919061361c565b60405180910390f35b610201610656565b60405161020e91906136c7565b60405180910390f35b610231600480360381019061022c919061371f565b6106e8565b60405161023e919061378d565b60405180910390f35b610261600480360381019061025c91906137d4565b61072e565b005b61026b610845565b6040516102789190613823565b60405180910390f35b61029b6004803603810190610296919061383e565b610852565b005b6102a56108b2565b6040516102b291906138f0565b60405180910390f35b6102d560048036038101906102d091906137d4565b6108d6565b6040516102e29190613823565b60405180910390f35b6102f361097b565b604051610300919061392c565b60405180910390f35b610323600480360381019061031e919061383e565b6109a1565b005b61033f600480360381019061033a919061371f565b6109c1565b60405161034c9190613823565b60405180910390f35b61036f600480360381019061036a9190613a7d565b610a32565b60405161037c9190613b55565b60405180910390f35b61039f600480360381019061039a919061371f565b610a9f565b6040516103ac919061378d565b60405180910390f35b6103cf60048036038101906103ca9190613b70565b610b25565b6040516103dc9190613823565b60405180910390f35b6103ed610bdc565b005b6103f7610bf0565b6040516104049190613bbe565b60405180910390f35b610415610c16565b604051610422919061378d565b60405180910390f35b610433610c40565b60405161044091906136c7565b60405180910390f35b610463600480360381019061045e9190613c05565b610cd2565b005b61047f600480360381019061047a9190613da7565b610ce8565b005b61049b6004803603810190610496919061371f565b6112dc565b6040516104ab9493929190613e10565b60405180910390f35b6104ce60048036038101906104c99190613f11565b6113a4565b005b6104ea60048036038101906104e5919061371f565b611406565b6040516104f791906136c7565b60405180910390f35b61051a6004803603810190610515919061371f565b611a73565b604051610527919061361c565b60405180910390f35b61054a6004803603810190610545919061371f565b611a93565b604051610557919061361c565b60405180910390f35b61057a60048036038101906105759190614045565b611c45565b60405161058791906140c7565b60405180910390f35b6105aa60048036038101906105a591906140e9565b611da5565b6040516105b7919061361c565b60405180910390f35b6105da60048036038101906105d59190613b70565b611e39565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611ebc565b5b9050919050565b60606000805461066590614158565b80601f016020809104026020016040519081016040528092919081815260200182805461069190614158565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f382611f9e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073982610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a0906141fb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c8611fe9565b73ffffffffffffffffffffffffffffffffffffffff1614806107f757506107f6816107f1611fe9565b611da5565b5b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d9061428d565b60405180910390fd5b6108408383611ff1565b505050565b6000600880549050905090565b61086361085d611fe9565b826120aa565b6108a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108999061431f565b60405180910390fd5b6108ad83838361213f565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006108e183610b25565b8210610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906143b1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109bc838383604051806020016040528060008152506113a4565b505050565b60006109cb610845565b8210610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390614443565b60405180910390fd5b60088281548110610a2057610a1f614463565b5b90600052602060002001549050919050565b610a3a613546565b610a42613546565b60005b6003811015610a9557838160068110610a6157610a60614463565b5b6020020151828260038110610a7957610a78614463565b5b6020020181815250508080610a8d906144c1565b915050610a45565b5080915050919050565b600080610aab83612438565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614555565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906145e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610be4612475565b610bee60006124f3565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c4f90614158565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7b90614158565b8015610cc85780601f10610c9d57610100808354040283529160200191610cc8565b820191906000526020600020905b815481529060010190602001808311610cab57829003601f168201915b5050505050905090565b610ce4610cdd611fe9565b83836125b9565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f398789b858585856040518563ffffffff1660e01b8152600401610d47949392919061480d565b602060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190614869565b610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906148e2565b60405180910390fd5b600d600082600360068110610ddf57610dde614463565b5b6020020151815260200190815260200160002060009054906101000a900460ff1615610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e379061494e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306c8442b82600460068110610e9257610e91614463565b5b602002015160001b6040518263ffffffff1660e01b8152600401610eb69190614987565b602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef79190614869565b610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d906149ee565b60405180910390fd5b60008160016006610f479190614a0e565b60068110610f5857610f57614463565b5b602002015190506000610f69610845565b9050610f758282612725565b6001600d600085600360068110610f8f57610f8e614463565b5b6020020151815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610fc484610a32565b90506000610fd182611c45565b90506000600f6000858152602001908152602001600020905060005b600e805490508110156112d0576000600e82815481106110105761100f614463565b5b906000526020600020906004020160405180608001604052908160008201805461103990614158565b80601f016020809104026020016040519081016040528092919081815260200182805461106590614158565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050905060006001826020015183604001516110f39190614a0e565b6110fd9190614a42565b67ffffffffffffffff8111156111165761111561394c565b5b6040519080825280601f01601f1916602001820160405280156111485781602001600182028036833780820191505090505b5090506000826020015190505b826040015181116111e25785818151811061117357611172614463565b5b602001015160f81c60f81b8284602001518361118f9190614a0e565b815181106111a05761119f614463565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806111da906144c1565b915050611155565b506000819050808560000185600781106111ff576111fe614463565b5b01908161120c9190614c18565b506112ba836000015186600001866007811061122b5761122a614463565b5b01805461123790614158565b80601f016020809104026020016040519081016040528092919081815260200182805461126390614158565b80156112b05780601f10611285576101008083540402835291602001916112b0565b820191906000526020600020905b81548152906001019060200180831161129357829003601f168201915b5050505050612942565b50505080806112c8906144c1565b915050610fed565b50505050505050505050565b600e81815481106112ec57600080fd5b906000526020600020906004020160009150905080600001805461130f90614158565b80601f016020809104026020016040519081016040528092919081815260200182805461133b90614158565b80156113885780601f1061135d57610100808354040283529160200191611388565b820191906000526020600020905b81548152906001019060200180831161136b57829003601f168201915b5050505050908060010154908060020154908060030154905084565b6113b56113af611fe9565b836120aa565b6113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb9061431f565b60405180910390fd5b611400848484846129de565b50505050565b606061141182612a3a565b611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790614d5c565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b8282101561152f5783820180546114a290614158565b80601f01602080910402602001604051908101604052809291908181526020018280546114ce90614158565b801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b50505050508152602001906001019061148c565b505050508152505090506115946040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e55524900000000000000815250826000015160006007811061158a57611589614463565b5b6020020151612942565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106115ed576115ec614463565b5b60200201516040518263ffffffff1660e01b815260040161160e91906136c7565b600060405180830381865afa15801561162b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116549190614e1d565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed85600001516000600781106116b4576116b3614463565b5b60200201516040518263ffffffff1660e01b81526004016116d591906136c7565b600060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061171b9190614e95565b8383866000015160026007811061173557611734614463565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106117905761178f614463565b5b60200201516040518263ffffffff1660e01b81526004016117b191906136c7565b600060405180830381865afa1580156117ce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117f79190614e95565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a6000015160046007811061184d5761184c614463565b5b60200201516040518263ffffffff1660e01b815260040161186e91906136c7565b600060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b49190614e95565b89600001516005600781106118cc576118cb614463565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c6000015160066007811061192757611926614463565b5b60200201516040518263ffffffff1660e01b815260040161194891906136c7565b600060405180830381865afa158015611965573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061198e9190614e95565b6119978e611a93565b6119d6576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611a0d565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b611a168f612a7b565b604051602001611a2f9a99989796959493929190615530565b6040516020818303038152906040529050611a4981612b49565b604051602001611a5991906156a2565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611b73578382018054611ae690614158565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1290614158565b8015611b5f5780601f10611b3457610100808354040283529160200191611b5f565b820191906000526020600020905b815481529060010190602001808311611b4257829003601f168201915b505050505081526020019060010190611ad0565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611bd557611bd4614463565b5b60200201516040518263ffffffff1660e01b8152600401611bf691906136c7565b602060405180830381865afa158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3791906156d9565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611c8f57611c8e61394c565b5b6040519080825280601f01601f191660200182016040528015611cc15781602001600182028036833780820191505090505b5090506000805b6003811015611d99576000868260038110611ce657611ce5614463565b5b6020020151905060005b858360038110611d0357611d02614463565b5b602002015160ff168160ff161015611d845760ff821660f81b858580611d28906144c1565b965081518110611d3b57611d3a614463565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611d7c90615713565b915050611cf0565b50508080611d91906144c1565b915050611cc8565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e41612475565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea7906157ae565b60405180910390fd5b611eb9816124f3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f8757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f975750611f9682612ccd565b5b9050919050565b611fa781612a3a565b611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90614555565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661206483610a9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806120b683610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f857506120f78185611da5565b5b8061213657508373ffffffffffffffffffffffffffffffffffffffff1661211e846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661215f82610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90615840565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906158d2565b60405180910390fd5b6122318383836001612d37565b8273ffffffffffffffffffffffffffffffffffffffff1661225182610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90615840565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124338383836001612db8565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61247d611fe9565b73ffffffffffffffffffffffffffffffffffffffff1661249b610c16565b73ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e89061593e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e906159aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612718919061361c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90615a16565b60405180910390fd5b61279d81612a3a565b156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490615a82565b60405180910390fd5b6127eb600083836001612d37565b6127f481612a3a565b15612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b90615a82565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461293e600083836001612db8565b5050565b6129da8282604051602401612958929190615aa2565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dbe565b5050565b6129e984848461213f565b6129f584848484612ddf565b612a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2b90615b4b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612a5c83612438565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001612a8a84612f66565b01905060008167ffffffffffffffff811115612aa957612aa861394c565b5b6040519080825280601f01601f191660200182016040528015612adb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612b3e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612b3257612b31615b6b565b5b04945060008503612ae9575b819350505050919050565b60606000825103612b6b57604051806020016040528060008152509050612cc8565b6000604051806060016040528060408152602001615def6040913990506000600360028551612b9a9190614a42565b612ba49190615b9a565b6004612bb09190615bcb565b90506000602082612bc19190614a42565b67ffffffffffffffff811115612bda57612bd961394c565b5b6040519080825280601f01601f191660200182016040528015612c0c5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612c87576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612c20565b600389510660018114612ca15760028114612cb157612cbc565b613d3d60f01b6002830352612cbc565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d43848484846130b9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da990615c7f565b60405180910390fd5b50505050565b50505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6000612e008473ffffffffffffffffffffffffffffffffffffffff16613217565b15612f59578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e29611fe9565b8786866040518563ffffffff1660e01b8152600401612e4b9493929190615c9f565b6020604051808303816000875af1925050508015612e8757506040513d601f19601f82011682018060405250810190612e849190615d00565b60015b612f09573d8060008114612eb7576040519150601f19603f3d011682016040523d82523d6000602084013e612ebc565b606091505b506000815103612f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890615b4b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f5e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fba57612fb9615b6b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613001576d04ee2d6d415b85acef81000000008381612ff757612ff6615b6b565b5b0492506020810190505b662386f26fc10000831061303057662386f26fc10000838161302657613025615b6b565b5b0492506010810190505b6305f5e1008310613059576305f5e100838161304f5761304e615b6b565b5b0492506008810190505b612710831061307e57612710838161307457613073615b6b565b5b0492506004810190505b606483106130a1576064838161309757613096615b6b565b5b0492506002810190505b600a83106130b0576001810190505b80915050919050565b6130c58484848461323a565b6001811115613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090615d9f565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131505761314b81613240565b61318f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461318e5761318d8582613289565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036131d1576131cc816133f6565b613210565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461320f5761320e84826134c7565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161329684610b25565b6132a09190614a0e565b9050600060076000848152602001908152602001600020549050818114613385576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061340a9190614a0e565b905060006009600084815260200190815260200160002054905060006008838154811061343a57613439614463565b5b90600052602060002001549050806008838154811061345c5761345b614463565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134ab576134aa615dbf565b5b6001900381819060005260206000200160009055905550505050565b60006134d283610b25565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135b18161357c565b81146135bc57600080fd5b50565b6000813590506135ce816135a8565b92915050565b6000602082840312156135ea576135e9613572565b5b60006135f8848285016135bf565b91505092915050565b60008115159050919050565b61361681613601565b82525050565b6000602082019050613631600083018461360d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613671578082015181840152602081019050613656565b60008484015250505050565b6000601f19601f8301169050919050565b600061369982613637565b6136a38185613642565b93506136b3818560208601613653565b6136bc8161367d565b840191505092915050565b600060208201905081810360008301526136e1818461368e565b905092915050565b6000819050919050565b6136fc816136e9565b811461370757600080fd5b50565b600081359050613719816136f3565b92915050565b60006020828403121561373557613734613572565b5b60006137438482850161370a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137778261374c565b9050919050565b6137878161376c565b82525050565b60006020820190506137a2600083018461377e565b92915050565b6137b18161376c565b81146137bc57600080fd5b50565b6000813590506137ce816137a8565b92915050565b600080604083850312156137eb576137ea613572565b5b60006137f9858286016137bf565b925050602061380a8582860161370a565b9150509250929050565b61381d816136e9565b82525050565b60006020820190506138386000830184613814565b92915050565b60008060006060848603121561385757613856613572565b5b6000613865868287016137bf565b9350506020613876868287016137bf565b92505060406138878682870161370a565b9150509250925092565b6000819050919050565b60006138b66138b16138ac8461374c565b613891565b61374c565b9050919050565b60006138c88261389b565b9050919050565b60006138da826138bd565b9050919050565b6138ea816138cf565b82525050565b600060208201905061390560008301846138e1565b92915050565b6000613916826138bd565b9050919050565b6139268161390b565b82525050565b6000602082019050613941600083018461391d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139848261367d565b810181811067ffffffffffffffff821117156139a3576139a261394c565b5b80604052505050565b60006139b6613568565b90506139c2828261397b565b919050565b600067ffffffffffffffff8211156139e2576139e161394c565b5b602082029050919050565b600080fd5b6000613a05613a00846139c7565b6139ac565b90508060208402830185811115613a1f57613a1e6139ed565b5b835b81811015613a485780613a34888261370a565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a66613947565b5b6006613a748482856139f2565b91505092915050565b600060c08284031215613a9357613a92613572565b5b6000613aa184828501613a52565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613ad3816136e9565b82525050565b6000613ae58383613aca565b60208301905092915050565b6000602082019050919050565b613b0781613aaa565b613b118184613ab5565b9250613b1c82613ac0565b8060005b83811015613b4d578151613b348782613ad9565b9650613b3f83613af1565b925050600181019050613b20565b505050505050565b6000606082019050613b6a6000830184613afe565b92915050565b600060208284031215613b8657613b85613572565b5b6000613b94848285016137bf565b91505092915050565b6000613ba8826138bd565b9050919050565b613bb881613b9d565b82525050565b6000602082019050613bd36000830184613baf565b92915050565b613be281613601565b8114613bed57600080fd5b50565b600081359050613bff81613bd9565b92915050565b60008060408385031215613c1c57613c1b613572565b5b6000613c2a858286016137bf565b9250506020613c3b85828601613bf0565b9150509250929050565b600067ffffffffffffffff821115613c6057613c5f61394c565b5b602082029050919050565b6000613c7e613c7984613c45565b6139ac565b90508060208402830185811115613c9857613c976139ed565b5b835b81811015613cc15780613cad888261370a565b845260208401935050602081019050613c9a565b5050509392505050565b600082601f830112613ce057613cdf613947565b5b6002613ced848285613c6b565b91505092915050565b600067ffffffffffffffff821115613d1157613d1061394c565b5b602082029050919050565b6000613d2f613d2a84613cf6565b6139ac565b90508060408402830185811115613d4957613d486139ed565b5b835b81811015613d725780613d5e8882613ccb565b845260208401935050604081019050613d4b565b5050509392505050565b600082601f830112613d9157613d90613947565b5b6002613d9e848285613d1c565b91505092915050565b6000806000806101c08587031215613dc257613dc1613572565b5b6000613dd087828801613ccb565b9450506040613de187828801613d7c565b93505060c0613df287828801613ccb565b925050610100613e0487828801613a52565b91505092959194509250565b60006080820190508181036000830152613e2a818761368e565b9050613e396020830186613814565b613e466040830185613814565b613e536060830184613814565b95945050505050565b600080fd5b600067ffffffffffffffff821115613e7c57613e7b61394c565b5b613e858261367d565b9050602081019050919050565b82818337600083830152505050565b6000613eb4613eaf84613e61565b6139ac565b905082815260208101848484011115613ed057613ecf613e5c565b5b613edb848285613e92565b509392505050565b600082601f830112613ef857613ef7613947565b5b8135613f08848260208601613ea1565b91505092915050565b60008060008060808587031215613f2b57613f2a613572565b5b6000613f39878288016137bf565b9450506020613f4a878288016137bf565b9350506040613f5b8782880161370a565b925050606085013567ffffffffffffffff811115613f7c57613f7b613577565b5b613f8887828801613ee3565b91505092959194509250565b600067ffffffffffffffff821115613faf57613fae61394c565b5b602082029050919050565b6000613fcd613fc884613f94565b6139ac565b90508060208402830185811115613fe757613fe66139ed565b5b835b818110156140105780613ffc888261370a565b845260208401935050602081019050613fe9565b5050509392505050565b600082601f83011261402f5761402e613947565b5b600361403c848285613fba565b91505092915050565b60006060828403121561405b5761405a613572565b5b60006140698482850161401a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061409982614072565b6140a3818561407d565b93506140b3818560208601613653565b6140bc8161367d565b840191505092915050565b600060208201905081810360008301526140e1818461408e565b905092915050565b60008060408385031215614100576140ff613572565b5b600061410e858286016137bf565b925050602061411f858286016137bf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061417057607f821691505b60208210810361418357614182614129565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141e5602183613642565b91506141f082614189565b604082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614277603d83613642565b91506142828261421b565b604082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614309602d83613642565b9150614314826142ad565b604082019050919050565b60006020820190508181036000830152614338816142fc565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061439b602b83613642565b91506143a68261433f565b604082019050919050565b600060208201905081810360008301526143ca8161438e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061442d602c83613642565b9150614438826143d1565b604082019050919050565b6000602082019050818103600083015261445c81614420565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144cc826136e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fe576144fd614492565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061453f601883613642565b915061454a82614509565b602082019050919050565b6000602082019050818103600083015261456e81614532565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145d1602983613642565b91506145dc82614575565b604082019050919050565b60006020820190508181036000830152614600816145c4565b9050919050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61463d81614607565b6146478184614612565b92506146528261461d565b8060005b8381101561468357815161466a8782613ad9565b965061467583614627565b925050600181019050614656565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b6146bf81614607565b6146c981846146ab565b92506146d48261461d565b8060005b838110156147055781516146ec8782613ad9565b96506146f783614627565b9250506001810190506146d8565b505050505050565b600061471983836146b6565b60408301905092915050565b6000602082019050919050565b61473b8161468b565b6147458184614696565b9250614750826146a1565b8060005b83811015614781578151614768878261470d565b965061477383614725565b925050600181019050614754565b505050505050565b600060069050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6147bf81614789565b6147c98184614794565b92506147d48261479f565b8060005b838110156148055781516147ec8782613ad9565b96506147f7836147a9565b9250506001810190506147d8565b505050505050565b60006101c0820190506148236000830187614634565b6148306040830186614732565b61483d60c0830185614634565b61484b6101008301846147b6565b95945050505050565b60008151905061486381613bd9565b92915050565b60006020828403121561487f5761487e613572565b5b600061488d84828501614854565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b60006148cc600d83613642565b91506148d782614896565b602082019050919050565b600060208201905081810360008301526148fb816148bf565b9050919050565b7f5369676e617475726520616c7265616479206e756c6c69666965640000000000600082015250565b6000614938601b83613642565b915061494382614902565b602082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b6000819050919050565b6149818161496e565b82525050565b600060208201905061499c6000830184614978565b92915050565b7f496e76616c6964206d65726b6c6520726f6f7400000000000000000000000000600082015250565b60006149d8601383613642565b91506149e3826149a2565b602082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b6000614a19826136e9565b9150614a24836136e9565b9250828203905081811115614a3c57614a3b614492565b5b92915050565b6000614a4d826136e9565b9150614a58836136e9565b9250828201905080821115614a7057614a6f614492565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ad87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a9b565b614ae28683614a9b565b95508019841693508086168417925050509392505050565b6000614b15614b10614b0b846136e9565b613891565b6136e9565b9050919050565b6000819050919050565b614b2f83614afa565b614b43614b3b82614b1c565b848454614aa8565b825550505050565b600090565b614b58614b4b565b614b63818484614b26565b505050565b5b81811015614b8757614b7c600082614b50565b600181019050614b69565b5050565b601f821115614bcc57614b9d81614a76565b614ba684614a8b565b81016020851015614bb5578190505b614bc9614bc185614a8b565b830182614b68565b50505b505050565b600082821c905092915050565b6000614bef60001984600802614bd1565b1980831691505092915050565b6000614c088383614bde565b9150826002028217905092915050565b614c2182613637565b67ffffffffffffffff811115614c3a57614c3961394c565b5b614c448254614158565b614c4f828285614b8b565b600060209050601f831160018114614c825760008415614c70578287015190505b614c7a8582614bfc565b865550614ce2565b601f198416614c9086614a76565b60005b82811015614cb857848901518255600182019150602085019450602081019050614c93565b86831015614cd55784890151614cd1601f891682614bde565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d46602f83613642565b9150614d5182614cea565b604082019050919050565b60006020820190508181036000830152614d7581614d39565b9050919050565b600067ffffffffffffffff821115614d9757614d9661394c565b5b614da08261367d565b9050602081019050919050565b6000614dc0614dbb84614d7c565b6139ac565b905082815260208101848484011115614ddc57614ddb613e5c565b5b614de7848285613653565b509392505050565b600082601f830112614e0457614e03613947565b5b8151614e14848260208601614dad565b91505092915050565b60008060408385031215614e3457614e33613572565b5b600083015167ffffffffffffffff811115614e5257614e51613577565b5b614e5e85828601614def565b925050602083015167ffffffffffffffff811115614e7f57614e7e613577565b5b614e8b85828601614def565b9150509250929050565b600060208284031215614eab57614eaa613572565b5b600082015167ffffffffffffffff811115614ec957614ec8613577565b5b614ed584828501614def565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b6000614f1f601183614ede565b9150614f2a82614ee9565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614f91602a83614ede565b9150614f9c82614f35565b602a82019050919050565b6000614fb282613637565b614fbc8185614ede565b9350614fcc818560208601613653565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b6000615034602983614ede565b915061503f82614fd8565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b60006150a6602883614ede565b91506150b18261504a565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b6000615118602f83614ede565b9150615123826150bc565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b600061518a602b83614ede565b91506151958261512e565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006151fc602d83614ede565b9150615207826151a0565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b600061526e602683614ede565b915061527982615212565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b60006152e0602b83614ede565b91506152eb82615284565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000615352602783614ede565b915061535d826152f6565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061539e600283614ede565b91506153a982615368565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b60006153ea600283614ede565b91506153f5826153b4565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b600061551a60d883614ede565b915061552582615400565b60d882019050919050565b600061553b82614f12565b915061554682614f84565b9150615552828d614fa7565b915061555d82615027565b9150615569828c614fa7565b915061557482615099565b9150615580828b614fa7565b915061558b8261510b565b9150615597828a614fa7565b91506155a28261517d565b91506155ae8289614fa7565b91506155b9826151ef565b91506155c58288614fa7565b91506155d082615261565b91506155dc8287614fa7565b91506155e7826152d3565b91506155f38286614fa7565b91506155fe82615345565b915061560a8285614fa7565b915061561582615391565b9150615620826153dd565b915061562b8261550d565b91506156378284614fa7565b915061564282615391565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b600061568c601d83614ede565b915061569782615656565b601d82019050919050565b60006156ad8261567f565b91506156b98284614fa7565b915081905092915050565b6000815190506156d3816136f3565b92915050565b6000602082840312156156ef576156ee613572565b5b60006156fd848285016156c4565b91505092915050565b600060ff82169050919050565b600061571e82615706565b915060ff820361573157615730614492565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615798602683613642565b91506157a38261573c565b604082019050919050565b600060208201905081810360008301526157c78161578b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061582a602583613642565b9150615835826157ce565b604082019050919050565b600060208201905081810360008301526158598161581d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158bc602483613642565b91506158c782615860565b604082019050919050565b600060208201905081810360008301526158eb816158af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615928602083613642565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615994601983613642565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a00602083613642565b9150615a0b826159ca565b602082019050919050565b60006020820190508181036000830152615a2f816159f3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a6c601c83613642565b9150615a7782615a36565b602082019050919050565b60006020820190508181036000830152615a9b81615a5f565b9050919050565b60006040820190508181036000830152615abc818561368e565b90508181036020830152615ad0818461368e565b90509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b35603283613642565b9150615b4082615ad9565b604082019050919050565b60006020820190508181036000830152615b6481615b28565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ba5826136e9565b9150615bb0836136e9565b925082615bc057615bbf615b6b565b5b828204905092915050565b6000615bd6826136e9565b9150615be1836136e9565b9250828202615bef816136e9565b91508282048414831517615c0657615c05614492565b5b5092915050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615c69603083613642565b9150615c7482615c0d565b604082019050919050565b60006020820190508181036000830152615c9881615c5c565b9050919050565b6000608082019050615cb4600083018761377e565b615cc1602083018661377e565b615cce6040830185613814565b8181036060830152615ce0818461408e565b905095945050505050565b600081519050615cfa816135a8565b92915050565b600060208284031215615d1657615d15613572565b5b6000615d2484828501615ceb565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615d89603583613642565b9150615d9482615d2d565b604082019050919050565b60006020820190508181036000830152615db881615d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122046d27b34599feaff8b765cb2832c4856d7912bd8b4fd348a5d476c60456ad99664736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063d9548e5311610071578063d9548e5314610530578063dc54daf014610560578063e985e9c514610590578063f2fde38b146105c0576101c4565b8063b88d4fde146104b4578063c87b56dd146104d0578063d21e82ab14610500576101c4565b806395d89b41116100d357806395d89b411461042b578063a22cb46514610449578063a969d56b14610465578063b04e3a3b14610481576101c4565b8063715018a6146103e55780637b103999146103ef5780638da5cb5b1461040d576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce71461032557806363382d4a146103555780636352211e1461038557806370a08231146103b5576101c4565b80632f745c59146102bb5780633a41515f146102eb57806342842e0e14610309576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632b7ac3f31461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135d4565b6105dc565b6040516101f0919061361c565b60405180910390f35b610201610656565b60405161020e91906136c7565b60405180910390f35b610231600480360381019061022c919061371f565b6106e8565b60405161023e919061378d565b60405180910390f35b610261600480360381019061025c91906137d4565b61072e565b005b61026b610845565b6040516102789190613823565b60405180910390f35b61029b6004803603810190610296919061383e565b610852565b005b6102a56108b2565b6040516102b291906138f0565b60405180910390f35b6102d560048036038101906102d091906137d4565b6108d6565b6040516102e29190613823565b60405180910390f35b6102f361097b565b604051610300919061392c565b60405180910390f35b610323600480360381019061031e919061383e565b6109a1565b005b61033f600480360381019061033a919061371f565b6109c1565b60405161034c9190613823565b60405180910390f35b61036f600480360381019061036a9190613a7d565b610a32565b60405161037c9190613b55565b60405180910390f35b61039f600480360381019061039a919061371f565b610a9f565b6040516103ac919061378d565b60405180910390f35b6103cf60048036038101906103ca9190613b70565b610b25565b6040516103dc9190613823565b60405180910390f35b6103ed610bdc565b005b6103f7610bf0565b6040516104049190613bbe565b60405180910390f35b610415610c16565b604051610422919061378d565b60405180910390f35b610433610c40565b60405161044091906136c7565b60405180910390f35b610463600480360381019061045e9190613c05565b610cd2565b005b61047f600480360381019061047a9190613da7565b610ce8565b005b61049b6004803603810190610496919061371f565b6112dc565b6040516104ab9493929190613e10565b60405180910390f35b6104ce60048036038101906104c99190613f11565b6113a4565b005b6104ea60048036038101906104e5919061371f565b611406565b6040516104f791906136c7565b60405180910390f35b61051a6004803603810190610515919061371f565b611a73565b604051610527919061361c565b60405180910390f35b61054a6004803603810190610545919061371f565b611a93565b604051610557919061361c565b60405180910390f35b61057a60048036038101906105759190614045565b611c45565b60405161058791906140c7565b60405180910390f35b6105aa60048036038101906105a591906140e9565b611da5565b6040516105b7919061361c565b60405180910390f35b6105da60048036038101906105d59190613b70565b611e39565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611ebc565b5b9050919050565b60606000805461066590614158565b80601f016020809104026020016040519081016040528092919081815260200182805461069190614158565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b60006106f382611f9e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073982610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a0906141fb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c8611fe9565b73ffffffffffffffffffffffffffffffffffffffff1614806107f757506107f6816107f1611fe9565b611da5565b5b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d9061428d565b60405180910390fd5b6108408383611ff1565b505050565b6000600880549050905090565b61086361085d611fe9565b826120aa565b6108a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108999061431f565b60405180910390fd5b6108ad83838361213f565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006108e183610b25565b8210610922576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610919906143b1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109bc838383604051806020016040528060008152506113a4565b505050565b60006109cb610845565b8210610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390614443565b60405180910390fd5b60088281548110610a2057610a1f614463565b5b90600052602060002001549050919050565b610a3a613546565b610a42613546565b60005b6003811015610a9557838160068110610a6157610a60614463565b5b6020020151828260038110610a7957610a78614463565b5b6020020181815250508080610a8d906144c1565b915050610a45565b5080915050919050565b600080610aab83612438565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614555565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906145e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610be4612475565b610bee60006124f3565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c4f90614158565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7b90614158565b8015610cc85780601f10610c9d57610100808354040283529160200191610cc8565b820191906000526020600020905b815481529060010190602001808311610cab57829003601f168201915b5050505050905090565b610ce4610cdd611fe9565b83836125b9565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f398789b858585856040518563ffffffff1660e01b8152600401610d47949392919061480d565b602060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190614869565b610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906148e2565b60405180910390fd5b600d600082600360068110610ddf57610dde614463565b5b6020020151815260200190815260200160002060009054906101000a900460ff1615610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e379061494e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306c8442b82600460068110610e9257610e91614463565b5b602002015160001b6040518263ffffffff1660e01b8152600401610eb69190614987565b602060405180830381865afa158015610ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef79190614869565b610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d906149ee565b60405180910390fd5b60008160016006610f479190614a0e565b60068110610f5857610f57614463565b5b602002015190506000610f69610845565b9050610f758282612725565b6001600d600085600360068110610f8f57610f8e614463565b5b6020020151815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610fc484610a32565b90506000610fd182611c45565b90506000600f6000858152602001908152602001600020905060005b600e805490508110156112d0576000600e82815481106110105761100f614463565b5b906000526020600020906004020160405180608001604052908160008201805461103990614158565b80601f016020809104026020016040519081016040528092919081815260200182805461106590614158565b80156110b25780601f10611087576101008083540402835291602001916110b2565b820191906000526020600020905b81548152906001019060200180831161109557829003601f168201915b505050505081526020016001820154815260200160028201548152602001600382015481525050905060006001826020015183604001516110f39190614a0e565b6110fd9190614a42565b67ffffffffffffffff8111156111165761111561394c565b5b6040519080825280601f01601f1916602001820160405280156111485781602001600182028036833780820191505090505b5090506000826020015190505b826040015181116111e25785818151811061117357611172614463565b5b602001015160f81c60f81b8284602001518361118f9190614a0e565b815181106111a05761119f614463565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806111da906144c1565b915050611155565b506000819050808560000185600781106111ff576111fe614463565b5b01908161120c9190614c18565b506112ba836000015186600001866007811061122b5761122a614463565b5b01805461123790614158565b80601f016020809104026020016040519081016040528092919081815260200182805461126390614158565b80156112b05780601f10611285576101008083540402835291602001916112b0565b820191906000526020600020905b81548152906001019060200180831161129357829003601f168201915b5050505050612942565b50505080806112c8906144c1565b915050610fed565b50505050505050505050565b600e81815481106112ec57600080fd5b906000526020600020906004020160009150905080600001805461130f90614158565b80601f016020809104026020016040519081016040528092919081815260200182805461133b90614158565b80156113885780601f1061135d57610100808354040283529160200191611388565b820191906000526020600020905b81548152906001019060200180831161136b57829003601f168201915b5050505050908060010154908060020154908060030154905084565b6113b56113af611fe9565b836120aa565b6113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb9061431f565b60405180910390fd5b611400848484846129de565b50505050565b606061141182612a3a565b611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790614d5c565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b8282101561152f5783820180546114a290614158565b80601f01602080910402602001604051908101604052809291908181526020018280546114ce90614158565b801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b50505050508152602001906001019061148c565b505050508152505090506115946040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e55524900000000000000815250826000015160006007811061158a57611589614463565b5b6020020151612942565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106115ed576115ec614463565b5b60200201516040518263ffffffff1660e01b815260040161160e91906136c7565b600060405180830381865afa15801561162b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906116549190614e1d565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed85600001516000600781106116b4576116b3614463565b5b60200201516040518263ffffffff1660e01b81526004016116d591906136c7565b600060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061171b9190614e95565b8383866000015160026007811061173557611734614463565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106117905761178f614463565b5b60200201516040518263ffffffff1660e01b81526004016117b191906136c7565b600060405180830381865afa1580156117ce573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117f79190614e95565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a6000015160046007811061184d5761184c614463565b5b60200201516040518263ffffffff1660e01b815260040161186e91906136c7565b600060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906118b49190614e95565b89600001516005600781106118cc576118cb614463565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c6000015160066007811061192757611926614463565b5b60200201516040518263ffffffff1660e01b815260040161194891906136c7565b600060405180830381865afa158015611965573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061198e9190614e95565b6119978e611a93565b6119d6576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611a0d565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b611a168f612a7b565b604051602001611a2f9a99989796959493929190615530565b6040516020818303038152906040529050611a4981612b49565b604051602001611a5991906156a2565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611b73578382018054611ae690614158565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1290614158565b8015611b5f5780601f10611b3457610100808354040283529160200191611b5f565b820191906000526020600020905b815481529060010190602001808311611b4257829003601f168201915b505050505081526020019060010190611ad0565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611bd557611bd4614463565b5b60200201516040518263ffffffff1660e01b8152600401611bf691906136c7565b602060405180830381865afa158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3791906156d9565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611c8f57611c8e61394c565b5b6040519080825280601f01601f191660200182016040528015611cc15781602001600182028036833780820191505090505b5090506000805b6003811015611d99576000868260038110611ce657611ce5614463565b5b6020020151905060005b858360038110611d0357611d02614463565b5b602002015160ff168160ff161015611d845760ff821660f81b858580611d28906144c1565b965081518110611d3b57611d3a614463565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611d7c90615713565b915050611cf0565b50508080611d91906144c1565b915050611cc8565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e41612475565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea7906157ae565b60405180910390fd5b611eb9816124f3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f8757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f975750611f9682612ccd565b5b9050919050565b611fa781612a3a565b611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90614555565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661206483610a9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806120b683610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f857506120f78185611da5565b5b8061213657508373ffffffffffffffffffffffffffffffffffffffff1661211e846106e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661215f82610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146121b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ac90615840565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906158d2565b60405180910390fd5b6122318383836001612d37565b8273ffffffffffffffffffffffffffffffffffffffff1661225182610a9f565b73ffffffffffffffffffffffffffffffffffffffff16146122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90615840565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124338383836001612db8565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61247d611fe9565b73ffffffffffffffffffffffffffffffffffffffff1661249b610c16565b73ffffffffffffffffffffffffffffffffffffffff16146124f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e89061593e565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e906159aa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612718919061361c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90615a16565b60405180910390fd5b61279d81612a3a565b156127dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d490615a82565b60405180910390fd5b6127eb600083836001612d37565b6127f481612a3a565b15612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b90615a82565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461293e600083836001612db8565b5050565b6129da8282604051602401612958929190615aa2565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dbe565b5050565b6129e984848461213f565b6129f584848484612ddf565b612a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2b90615b4b565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612a5c83612438565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006001612a8a84612f66565b01905060008167ffffffffffffffff811115612aa957612aa861394c565b5b6040519080825280601f01601f191660200182016040528015612adb5781602001600182028036833780820191505090505b509050600082602001820190505b600115612b3e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612b3257612b31615b6b565b5b04945060008503612ae9575b819350505050919050565b60606000825103612b6b57604051806020016040528060008152509050612cc8565b6000604051806060016040528060408152602001615def6040913990506000600360028551612b9a9190614a42565b612ba49190615b9a565b6004612bb09190615bcb565b90506000602082612bc19190614a42565b67ffffffffffffffff811115612bda57612bd961394c565b5b6040519080825280601f01601f191660200182016040528015612c0c5781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612c87576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612c20565b600389510660018114612ca15760028114612cb157612cbc565b613d3d60f01b6002830352612cbc565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d43848484846130b9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da990615c7f565b60405180910390fd5b50505050565b50505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b6000612e008473ffffffffffffffffffffffffffffffffffffffff16613217565b15612f59578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e29611fe9565b8786866040518563ffffffff1660e01b8152600401612e4b9493929190615c9f565b6020604051808303816000875af1925050508015612e8757506040513d601f19601f82011682018060405250810190612e849190615d00565b60015b612f09573d8060008114612eb7576040519150601f19603f3d011682016040523d82523d6000602084013e612ebc565b606091505b506000815103612f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef890615b4b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f5e565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fba57612fb9615b6b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613001576d04ee2d6d415b85acef81000000008381612ff757612ff6615b6b565b5b0492506020810190505b662386f26fc10000831061303057662386f26fc10000838161302657613025615b6b565b5b0492506010810190505b6305f5e1008310613059576305f5e100838161304f5761304e615b6b565b5b0492506008810190505b612710831061307e57612710838161307457613073615b6b565b5b0492506004810190505b606483106130a1576064838161309757613096615b6b565b5b0492506002810190505b600a83106130b0576001810190505b80915050919050565b6130c58484848461323a565b6001811115613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090615d9f565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036131505761314b81613240565b61318f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461318e5761318d8582613289565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036131d1576131cc816133f6565b613210565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461320f5761320e84826134c7565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161329684610b25565b6132a09190614a0e565b9050600060076000848152602001908152602001600020549050818114613385576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061340a9190614a0e565b905060006009600084815260200190815260200160002054905060006008838154811061343a57613439614463565b5b90600052602060002001549050806008838154811061345c5761345b614463565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134ab576134aa615dbf565b5b6001900381819060005260206000200160009055905550505050565b60006134d283610b25565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135b18161357c565b81146135bc57600080fd5b50565b6000813590506135ce816135a8565b92915050565b6000602082840312156135ea576135e9613572565b5b60006135f8848285016135bf565b91505092915050565b60008115159050919050565b61361681613601565b82525050565b6000602082019050613631600083018461360d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613671578082015181840152602081019050613656565b60008484015250505050565b6000601f19601f8301169050919050565b600061369982613637565b6136a38185613642565b93506136b3818560208601613653565b6136bc8161367d565b840191505092915050565b600060208201905081810360008301526136e1818461368e565b905092915050565b6000819050919050565b6136fc816136e9565b811461370757600080fd5b50565b600081359050613719816136f3565b92915050565b60006020828403121561373557613734613572565b5b60006137438482850161370a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137778261374c565b9050919050565b6137878161376c565b82525050565b60006020820190506137a2600083018461377e565b92915050565b6137b18161376c565b81146137bc57600080fd5b50565b6000813590506137ce816137a8565b92915050565b600080604083850312156137eb576137ea613572565b5b60006137f9858286016137bf565b925050602061380a8582860161370a565b9150509250929050565b61381d816136e9565b82525050565b60006020820190506138386000830184613814565b92915050565b60008060006060848603121561385757613856613572565b5b6000613865868287016137bf565b9350506020613876868287016137bf565b92505060406138878682870161370a565b9150509250925092565b6000819050919050565b60006138b66138b16138ac8461374c565b613891565b61374c565b9050919050565b60006138c88261389b565b9050919050565b60006138da826138bd565b9050919050565b6138ea816138cf565b82525050565b600060208201905061390560008301846138e1565b92915050565b6000613916826138bd565b9050919050565b6139268161390b565b82525050565b6000602082019050613941600083018461391d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139848261367d565b810181811067ffffffffffffffff821117156139a3576139a261394c565b5b80604052505050565b60006139b6613568565b90506139c2828261397b565b919050565b600067ffffffffffffffff8211156139e2576139e161394c565b5b602082029050919050565b600080fd5b6000613a05613a00846139c7565b6139ac565b90508060208402830185811115613a1f57613a1e6139ed565b5b835b81811015613a485780613a34888261370a565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a66613947565b5b6006613a748482856139f2565b91505092915050565b600060c08284031215613a9357613a92613572565b5b6000613aa184828501613a52565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613ad3816136e9565b82525050565b6000613ae58383613aca565b60208301905092915050565b6000602082019050919050565b613b0781613aaa565b613b118184613ab5565b9250613b1c82613ac0565b8060005b83811015613b4d578151613b348782613ad9565b9650613b3f83613af1565b925050600181019050613b20565b505050505050565b6000606082019050613b6a6000830184613afe565b92915050565b600060208284031215613b8657613b85613572565b5b6000613b94848285016137bf565b91505092915050565b6000613ba8826138bd565b9050919050565b613bb881613b9d565b82525050565b6000602082019050613bd36000830184613baf565b92915050565b613be281613601565b8114613bed57600080fd5b50565b600081359050613bff81613bd9565b92915050565b60008060408385031215613c1c57613c1b613572565b5b6000613c2a858286016137bf565b9250506020613c3b85828601613bf0565b9150509250929050565b600067ffffffffffffffff821115613c6057613c5f61394c565b5b602082029050919050565b6000613c7e613c7984613c45565b6139ac565b90508060208402830185811115613c9857613c976139ed565b5b835b81811015613cc15780613cad888261370a565b845260208401935050602081019050613c9a565b5050509392505050565b600082601f830112613ce057613cdf613947565b5b6002613ced848285613c6b565b91505092915050565b600067ffffffffffffffff821115613d1157613d1061394c565b5b602082029050919050565b6000613d2f613d2a84613cf6565b6139ac565b90508060408402830185811115613d4957613d486139ed565b5b835b81811015613d725780613d5e8882613ccb565b845260208401935050604081019050613d4b565b5050509392505050565b600082601f830112613d9157613d90613947565b5b6002613d9e848285613d1c565b91505092915050565b6000806000806101c08587031215613dc257613dc1613572565b5b6000613dd087828801613ccb565b9450506040613de187828801613d7c565b93505060c0613df287828801613ccb565b925050610100613e0487828801613a52565b91505092959194509250565b60006080820190508181036000830152613e2a818761368e565b9050613e396020830186613814565b613e466040830185613814565b613e536060830184613814565b95945050505050565b600080fd5b600067ffffffffffffffff821115613e7c57613e7b61394c565b5b613e858261367d565b9050602081019050919050565b82818337600083830152505050565b6000613eb4613eaf84613e61565b6139ac565b905082815260208101848484011115613ed057613ecf613e5c565b5b613edb848285613e92565b509392505050565b600082601f830112613ef857613ef7613947565b5b8135613f08848260208601613ea1565b91505092915050565b60008060008060808587031215613f2b57613f2a613572565b5b6000613f39878288016137bf565b9450506020613f4a878288016137bf565b9350506040613f5b8782880161370a565b925050606085013567ffffffffffffffff811115613f7c57613f7b613577565b5b613f8887828801613ee3565b91505092959194509250565b600067ffffffffffffffff821115613faf57613fae61394c565b5b602082029050919050565b6000613fcd613fc884613f94565b6139ac565b90508060208402830185811115613fe757613fe66139ed565b5b835b818110156140105780613ffc888261370a565b845260208401935050602081019050613fe9565b5050509392505050565b600082601f83011261402f5761402e613947565b5b600361403c848285613fba565b91505092915050565b60006060828403121561405b5761405a613572565b5b60006140698482850161401a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061409982614072565b6140a3818561407d565b93506140b3818560208601613653565b6140bc8161367d565b840191505092915050565b600060208201905081810360008301526140e1818461408e565b905092915050565b60008060408385031215614100576140ff613572565b5b600061410e858286016137bf565b925050602061411f858286016137bf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061417057607f821691505b60208210810361418357614182614129565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006141e5602183613642565b91506141f082614189565b604082019050919050565b60006020820190508181036000830152614214816141d8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614277603d83613642565b91506142828261421b565b604082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614309602d83613642565b9150614314826142ad565b604082019050919050565b60006020820190508181036000830152614338816142fc565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061439b602b83613642565b91506143a68261433f565b604082019050919050565b600060208201905081810360008301526143ca8161438e565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061442d602c83613642565b9150614438826143d1565b604082019050919050565b6000602082019050818103600083015261445c81614420565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144cc826136e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fe576144fd614492565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061453f601883613642565b915061454a82614509565b602082019050919050565b6000602082019050818103600083015261456e81614532565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006145d1602983613642565b91506145dc82614575565b604082019050919050565b60006020820190508181036000830152614600816145c4565b9050919050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61463d81614607565b6146478184614612565b92506146528261461d565b8060005b8381101561468357815161466a8782613ad9565b965061467583614627565b925050600181019050614656565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b6146bf81614607565b6146c981846146ab565b92506146d48261461d565b8060005b838110156147055781516146ec8782613ad9565b96506146f783614627565b9250506001810190506146d8565b505050505050565b600061471983836146b6565b60408301905092915050565b6000602082019050919050565b61473b8161468b565b6147458184614696565b9250614750826146a1565b8060005b83811015614781578151614768878261470d565b965061477383614725565b925050600181019050614754565b505050505050565b600060069050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6147bf81614789565b6147c98184614794565b92506147d48261479f565b8060005b838110156148055781516147ec8782613ad9565b96506147f7836147a9565b9250506001810190506147d8565b505050505050565b60006101c0820190506148236000830187614634565b6148306040830186614732565b61483d60c0830185614634565b61484b6101008301846147b6565b95945050505050565b60008151905061486381613bd9565b92915050565b60006020828403121561487f5761487e613572565b5b600061488d84828501614854565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b60006148cc600d83613642565b91506148d782614896565b602082019050919050565b600060208201905081810360008301526148fb816148bf565b9050919050565b7f5369676e617475726520616c7265616479206e756c6c69666965640000000000600082015250565b6000614938601b83613642565b915061494382614902565b602082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b6000819050919050565b6149818161496e565b82525050565b600060208201905061499c6000830184614978565b92915050565b7f496e76616c6964206d65726b6c6520726f6f7400000000000000000000000000600082015250565b60006149d8601383613642565b91506149e3826149a2565b602082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b6000614a19826136e9565b9150614a24836136e9565b9250828203905081811115614a3c57614a3b614492565b5b92915050565b6000614a4d826136e9565b9150614a58836136e9565b9250828201905080821115614a7057614a6f614492565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ad87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a9b565b614ae28683614a9b565b95508019841693508086168417925050509392505050565b6000614b15614b10614b0b846136e9565b613891565b6136e9565b9050919050565b6000819050919050565b614b2f83614afa565b614b43614b3b82614b1c565b848454614aa8565b825550505050565b600090565b614b58614b4b565b614b63818484614b26565b505050565b5b81811015614b8757614b7c600082614b50565b600181019050614b69565b5050565b601f821115614bcc57614b9d81614a76565b614ba684614a8b565b81016020851015614bb5578190505b614bc9614bc185614a8b565b830182614b68565b50505b505050565b600082821c905092915050565b6000614bef60001984600802614bd1565b1980831691505092915050565b6000614c088383614bde565b9150826002028217905092915050565b614c2182613637565b67ffffffffffffffff811115614c3a57614c3961394c565b5b614c448254614158565b614c4f828285614b8b565b600060209050601f831160018114614c825760008415614c70578287015190505b614c7a8582614bfc565b865550614ce2565b601f198416614c9086614a76565b60005b82811015614cb857848901518255600182019150602085019450602081019050614c93565b86831015614cd55784890151614cd1601f891682614bde565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d46602f83613642565b9150614d5182614cea565b604082019050919050565b60006020820190508181036000830152614d7581614d39565b9050919050565b600067ffffffffffffffff821115614d9757614d9661394c565b5b614da08261367d565b9050602081019050919050565b6000614dc0614dbb84614d7c565b6139ac565b905082815260208101848484011115614ddc57614ddb613e5c565b5b614de7848285613653565b509392505050565b600082601f830112614e0457614e03613947565b5b8151614e14848260208601614dad565b91505092915050565b60008060408385031215614e3457614e33613572565b5b600083015167ffffffffffffffff811115614e5257614e51613577565b5b614e5e85828601614def565b925050602083015167ffffffffffffffff811115614e7f57614e7e613577565b5b614e8b85828601614def565b9150509250929050565b600060208284031215614eab57614eaa613572565b5b600082015167ffffffffffffffff811115614ec957614ec8613577565b5b614ed584828501614def565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b6000614f1f601183614ede565b9150614f2a82614ee9565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614f91602a83614ede565b9150614f9c82614f35565b602a82019050919050565b6000614fb282613637565b614fbc8185614ede565b9350614fcc818560208601613653565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b6000615034602983614ede565b915061503f82614fd8565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b60006150a6602883614ede565b91506150b18261504a565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b6000615118602f83614ede565b9150615123826150bc565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b600061518a602b83614ede565b91506151958261512e565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006151fc602d83614ede565b9150615207826151a0565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b600061526e602683614ede565b915061527982615212565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b60006152e0602b83614ede565b91506152eb82615284565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000615352602783614ede565b915061535d826152f6565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061539e600283614ede565b91506153a982615368565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b60006153ea600283614ede565b91506153f5826153b4565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b600061551a60d883614ede565b915061552582615400565b60d882019050919050565b600061553b82614f12565b915061554682614f84565b9150615552828d614fa7565b915061555d82615027565b9150615569828c614fa7565b915061557482615099565b9150615580828b614fa7565b915061558b8261510b565b9150615597828a614fa7565b91506155a28261517d565b91506155ae8289614fa7565b91506155b9826151ef565b91506155c58288614fa7565b91506155d082615261565b91506155dc8287614fa7565b91506155e7826152d3565b91506155f38286614fa7565b91506155fe82615345565b915061560a8285614fa7565b915061561582615391565b9150615620826153dd565b915061562b8261550d565b91506156378284614fa7565b915061564282615391565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b600061568c601d83614ede565b915061569782615656565b601d82019050919050565b60006156ad8261567f565b91506156b98284614fa7565b915081905092915050565b6000815190506156d3816136f3565b92915050565b6000602082840312156156ef576156ee613572565b5b60006156fd848285016156c4565b91505092915050565b600060ff82169050919050565b600061571e82615706565b915060ff820361573157615730614492565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615798602683613642565b91506157a38261573c565b604082019050919050565b600060208201905081810360008301526157c78161578b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061582a602583613642565b9150615835826157ce565b604082019050919050565b600060208201905081810360008301526158598161581d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006158bc602483613642565b91506158c782615860565b604082019050919050565b600060208201905081810360008301526158eb816158af565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615928602083613642565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615994601983613642565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a00602083613642565b9150615a0b826159ca565b602082019050919050565b60006020820190508181036000830152615a2f816159f3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a6c601c83613642565b9150615a7782615a36565b602082019050919050565b60006020820190508181036000830152615a9b81615a5f565b9050919050565b60006040820190508181036000830152615abc818561368e565b90508181036020830152615ad0818461368e565b90509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b35603283613642565b9150615b4082615ad9565b604082019050919050565b60006020820190508181036000830152615b6481615b28565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ba5826136e9565b9150615bb0836136e9565b925082615bc057615bbf615b6b565b5b828204905092915050565b6000615bd6826136e9565b9150615be1836136e9565b9250828202615bef816136e9565b91508282048414831517615c0657615c05614492565b5b5092915050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615c69603083613642565b9150615c7482615c0d565b604082019050919050565b60006020820190508181036000830152615c9881615c5c565b9050919050565b6000608082019050615cb4600083018761377e565b615cc1602083018661377e565b615cce6040830185613814565b8181036060830152615ce0818461408e565b905095945050505050565b600081519050615cfa816135a8565b92915050565b600060208284031215615d1657615d15613572565b5b6000615d2484828501615ceb565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615d89603583613642565b9150615d9482615d2d565b604082019050919050565b60006020820190508181036000830152615db881615d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122046d27b34599feaff8b765cb2832c4856d7912bd8b4fd348a5d476c60456ad99664736f6c63430008120033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/app/deployments/addresses.json b/app/deployments/addresses.json index 4611599dc..1640df45d 100644 --- a/app/deployments/addresses.json +++ b/app/deployments/addresses.json @@ -1 +1 @@ -{"ProofOfPassport":"0x7AB5B112b09816617048482230C6Ea9629AF2349","Groth16Verifier":"0x764f40848eBD343da6595b0624c9480cfBA0668e"} \ No newline at end of file +{"ProofOfPassport":"0x24c919Dc3E5BA89c0898778D71435D566B05B4c5","Groth16Verifier":"0x6b3c6CF3e7bf2663E5EA30F2566433261fe64554"} \ No newline at end of file diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 76356bd4f..a40b47114 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -555,13 +555,13 @@ SPEC CHECKSUMS: React-Core: 8293312ad137ea82fd2c29deb163dbc24aa4e00e React-CoreModules: 32fab1d62416849a3b6dac6feff9d54e5ddc2d1e React-cxxreact: 55d0f7cb6b4cc09ba9190797f1da87182d1a2fb6 - React-debug: 878f0c4026b30a6240f7a15f8612efcf5d8c3df9 + React-debug: 7e61555c8158126c6cd98c3154381ad3821aaaca React-jsc: 0db8e8cc2074d979c37ffa7b8d7c914833960497 React-jsi: 58677ff4848ceb6aeb9118fe03448a843ea5e16a React-jsiexecutor: 2c15ba1bace70177492368d5180b564f165870fd React-jsinspector: b511447170f561157547bc0bef3f169663860be7 React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95 - React-NativeModulesApple: 3a49a4bc38b979b804525816b781eb6612dba5fa + React-NativeModulesApple: 0438665fc7473be6edc496e823e6ea0b0537b46c React-perflogger: 6bd153e776e6beed54c56b0847e1220a3ff92ba5 React-RCTActionSheet: c0b62af44e610e69d9a2049a682f5dba4e9dff17 React-RCTAnimation: fe7005136b58f58871cab2f70732343b6e330d30 @@ -575,13 +575,13 @@ SPEC CHECKSUMS: React-RCTVibration: ea3a68a49873a54ced927c90923fc6932baf344a React-rncore: 9672a017af4a7da7495d911f0b690cbcae9dd18d React-runtimeexecutor: 369ae9bb3f83b65201c0c8f7d50b72280b5a1dbc - React-runtimescheduler: 116fb55732ddfd96298350528cf13ceaf94759c8 - React-utils: a8681f0d721ff080373ae9e4afb1f380707b55f9 - ReactCommon: df6a7f5665621529ee01b89fb0c3c93eb014f276 + React-runtimescheduler: ec1066a4f2d1152eb1bc3fb61d69376b3bc0dde0 + React-utils: d55ba834beb39f01b0b470ae43478c0a3a024abe + ReactCommon: 68e3a815fbb69af3bb4196e04c6ae7abb306e7a8 RNSVG: 07dbd870b0dcdecc99b3a202fa37c8ca163caec2 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Yoga: 8796b55dba14d7004f980b54bcc9833ee45b28ce PODFILE CHECKSUM: 7568291077da8ee6387464cd1a7e01559a46ab1f -COCOAPODS: 1.15.0 +COCOAPODS: 1.14.3 diff --git a/app/ios/ProofOfPassport.xcodeproj/project.pbxproj b/app/ios/ProofOfPassport.xcodeproj/project.pbxproj index e47f6f599..44b428344 100644 --- a/app/ios/ProofOfPassport.xcodeproj/project.pbxproj +++ b/app/ios/ProofOfPassport.xcodeproj/project.pbxproj @@ -22,6 +22,31 @@ 905B70052A72767900AFA232 /* PassportReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 905B70042A72767900AFA232 /* PassportReader.swift */; }; 905B70072A72774000AFA232 /* PassportReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 905B70062A72774000AFA232 /* PassportReader.m */; }; 905B700B2A72A5E900AFA232 /* masterList.pem in Resources */ = {isa = PBXBuildFile; fileRef = 905B700A2A72A5E900AFA232 /* masterList.pem */; }; + 2FA7C90AFAF5417DAA7BCB1E /* Inter-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 066DD67BD55B4E90941F2B97 /* Inter-Black.otf */; }; + C9B733B168F84BBA818C6CB8 /* Inter-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0C76A5D3C00C4D19B7624F46 /* Inter-BlackItalic.otf */; }; + 15AAF7651FCF40EB993543A3 /* Inter-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 6F5E37006DF4462994FA8164 /* Inter-BoldItalic.otf */; }; + 1D2A11340C7041909B820A90 /* Inter-ExtraBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = D20EA8C94F544E14AB58E6EB /* Inter-ExtraBold.otf */; }; + E4BC7CC193684992A11E3135 /* Inter-ExtraBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 5686BD657D224A089EAFB825 /* Inter-ExtraBoldItalic.otf */; }; + 1BA25F26C91C45F697D55099 /* Inter-ExtraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 568162F4DC4B4CDC8B341853 /* Inter-ExtraLight.otf */; }; + 625D35EA2F1643E89F9887CE /* Inter-ExtraLightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 67F811D831354006A0A6FE2A /* Inter-ExtraLightItalic.otf */; }; + EEC491DF41A44001A577E8C5 /* Inter-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8716F728A49C438396CB79D3 /* Inter-Italic.otf */; }; + 0A6918EB0654476189741475 /* Inter-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 780F6F2600AE4EC1B21B6F44 /* Inter-Light.otf */; }; + 9713779CBED04A308A0B2DF2 /* Inter-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 38DEC0D33CBA43429A48B8E3 /* Inter-LightItalic.otf */; }; + B9E3D3D20C9F4863A67B66D3 /* Inter-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 53AEBBB143534D68B7792C46 /* Inter-Medium.otf */; }; + 8362BCF2197E445C9CAFFD53 /* Inter-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 60F5BB028A4E49588D71E6CE /* Inter-MediumItalic.otf */; }; + 2CD45EA0A0A94063935CE7D3 /* Inter-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF4EC58B331A46F098343757 /* Inter-Regular.otf */; }; + 6FA6BA98BE3F485982F5E962 /* Inter-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 666078AFC2DC4894ABC19DA5 /* Inter-SemiBold.otf */; }; + B7C1F08B40CC4C1985152F72 /* Inter-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = C03CCA67A92F47D59CDA16E5 /* Inter-SemiBoldItalic.otf */; }; + F78FB2FC94E1443A8EE8EEC3 /* Inter-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = B68457923C3F444388AB85F2 /* Inter-Thin.otf */; }; + 37AF1D1302824FFC83B6D1D2 /* Inter-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1CA9D245CD5A439D88F01D4F /* Inter-ThinItalic.otf */; }; + CC99B59A281C4B6497C14141 /* Luciole-Bold-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F59F295E9CC54539B2C48953 /* Luciole-Bold-Italic.ttf */; }; + 05E2174E2E7E48EB80B9C8D8 /* Luciole-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = ABB740B68A8141229E6118AC /* Luciole-Bold.ttf */; }; + 6959CC40713D4D42AA56850D /* Luciole-Regular-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8720D4D8B8BC41B79088D43C /* Luciole-Regular-Italic.ttf */; }; + E4E0715B819049EFACAF2AEE /* Luciole-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 714371FB26B944FFBE7F0B29 /* Luciole-Regular.ttf */; }; + 98D6CE33FC02453794D8DB08 /* slkscr.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 110D16BAD3FA4513BEA89A3A /* slkscr.ttf */; }; + FA58D9C915314CF086BD7FFB /* slkscrb.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0AD24C885D29461481982641 /* slkscrb.ttf */; }; + 749862C5A266413FBE508618 /* slkscr.woff in Resources */ = {isa = PBXBuildFile; fileRef = 98413C61772F41BD96F279F5 /* slkscr.woff */; }; + 5A0E2800F0C34012B292255B /* Inter-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 449D98322BFA406CBB9E2648 /* Inter-Bold.otf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -63,6 +88,31 @@ CE0B085EC65BAFEB61DD9C49 /* Pods-ProofOfPassport.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ProofOfPassport.debug.xcconfig"; path = "Target Support Files/Pods-ProofOfPassport/Pods-ProofOfPassport.debug.xcconfig"; sourceTree = ""; }; CFAE0EE7E1942128592D0CC4 /* Pods_ProofOfPassport_ProofOfPassportTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ProofOfPassport_ProofOfPassportTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + 066DD67BD55B4E90941F2B97 /* Inter-Black.otf */ = {isa = PBXFileReference; name = "Inter-Black.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Black.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 0C76A5D3C00C4D19B7624F46 /* Inter-BlackItalic.otf */ = {isa = PBXFileReference; name = "Inter-BlackItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-BlackItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 6F5E37006DF4462994FA8164 /* Inter-BoldItalic.otf */ = {isa = PBXFileReference; name = "Inter-BoldItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-BoldItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + D20EA8C94F544E14AB58E6EB /* Inter-ExtraBold.otf */ = {isa = PBXFileReference; name = "Inter-ExtraBold.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ExtraBold.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 5686BD657D224A089EAFB825 /* Inter-ExtraBoldItalic.otf */ = {isa = PBXFileReference; name = "Inter-ExtraBoldItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ExtraBoldItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 568162F4DC4B4CDC8B341853 /* Inter-ExtraLight.otf */ = {isa = PBXFileReference; name = "Inter-ExtraLight.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ExtraLight.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 67F811D831354006A0A6FE2A /* Inter-ExtraLightItalic.otf */ = {isa = PBXFileReference; name = "Inter-ExtraLightItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ExtraLightItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 8716F728A49C438396CB79D3 /* Inter-Italic.otf */ = {isa = PBXFileReference; name = "Inter-Italic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Italic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 780F6F2600AE4EC1B21B6F44 /* Inter-Light.otf */ = {isa = PBXFileReference; name = "Inter-Light.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Light.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 38DEC0D33CBA43429A48B8E3 /* Inter-LightItalic.otf */ = {isa = PBXFileReference; name = "Inter-LightItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-LightItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 53AEBBB143534D68B7792C46 /* Inter-Medium.otf */ = {isa = PBXFileReference; name = "Inter-Medium.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Medium.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 60F5BB028A4E49588D71E6CE /* Inter-MediumItalic.otf */ = {isa = PBXFileReference; name = "Inter-MediumItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-MediumItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + DF4EC58B331A46F098343757 /* Inter-Regular.otf */ = {isa = PBXFileReference; name = "Inter-Regular.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Regular.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 666078AFC2DC4894ABC19DA5 /* Inter-SemiBold.otf */ = {isa = PBXFileReference; name = "Inter-SemiBold.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-SemiBold.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + C03CCA67A92F47D59CDA16E5 /* Inter-SemiBoldItalic.otf */ = {isa = PBXFileReference; name = "Inter-SemiBoldItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-SemiBoldItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + B68457923C3F444388AB85F2 /* Inter-Thin.otf */ = {isa = PBXFileReference; name = "Inter-Thin.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Thin.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 1CA9D245CD5A439D88F01D4F /* Inter-ThinItalic.otf */ = {isa = PBXFileReference; name = "Inter-ThinItalic.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-ThinItalic.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + F59F295E9CC54539B2C48953 /* Luciole-Bold-Italic.ttf */ = {isa = PBXFileReference; name = "Luciole-Bold-Italic.ttf"; path = "../assets/fonts/Luciole-Bold-Italic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + ABB740B68A8141229E6118AC /* Luciole-Bold.ttf */ = {isa = PBXFileReference; name = "Luciole-Bold.ttf"; path = "../assets/fonts/Luciole-Bold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 8720D4D8B8BC41B79088D43C /* Luciole-Regular-Italic.ttf */ = {isa = PBXFileReference; name = "Luciole-Regular-Italic.ttf"; path = "../assets/fonts/Luciole-Regular-Italic.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 714371FB26B944FFBE7F0B29 /* Luciole-Regular.ttf */ = {isa = PBXFileReference; name = "Luciole-Regular.ttf"; path = "../assets/fonts/Luciole-Regular.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 110D16BAD3FA4513BEA89A3A /* slkscr.ttf */ = {isa = PBXFileReference; name = "slkscr.ttf"; path = "../node_modules/@tamagui/font-silkscreen/files/slkscr.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 0AD24C885D29461481982641 /* slkscrb.ttf */ = {isa = PBXFileReference; name = "slkscrb.ttf"; path = "../node_modules/@tamagui/font-silkscreen/files/slkscrb.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 98413C61772F41BD96F279F5 /* slkscr.woff */ = {isa = PBXFileReference; name = "slkscr.woff"; path = "../node_modules/@tamagui/font-silkscreen/files/slkscr.woff"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 449D98322BFA406CBB9E2648 /* Inter-Bold.otf */ = {isa = PBXFileReference; name = "Inter-Bold.otf"; path = "../node_modules/@tamagui/font-inter/otf/Inter-Bold.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -154,6 +204,7 @@ 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, BBD78D7AC51CEA395F1C20DB /* Pods */, + 48CFD94B265341A283033375 /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -180,6 +231,39 @@ path = Pods; sourceTree = ""; }; + 48CFD94B265341A283033375 /* Resources */ = { + isa = "PBXGroup"; + children = ( + 066DD67BD55B4E90941F2B97 /* Inter-Black.otf */, + 0C76A5D3C00C4D19B7624F46 /* Inter-BlackItalic.otf */, + 6F5E37006DF4462994FA8164 /* Inter-BoldItalic.otf */, + D20EA8C94F544E14AB58E6EB /* Inter-ExtraBold.otf */, + 5686BD657D224A089EAFB825 /* Inter-ExtraBoldItalic.otf */, + 568162F4DC4B4CDC8B341853 /* Inter-ExtraLight.otf */, + 67F811D831354006A0A6FE2A /* Inter-ExtraLightItalic.otf */, + 8716F728A49C438396CB79D3 /* Inter-Italic.otf */, + 780F6F2600AE4EC1B21B6F44 /* Inter-Light.otf */, + 38DEC0D33CBA43429A48B8E3 /* Inter-LightItalic.otf */, + 53AEBBB143534D68B7792C46 /* Inter-Medium.otf */, + 60F5BB028A4E49588D71E6CE /* Inter-MediumItalic.otf */, + DF4EC58B331A46F098343757 /* Inter-Regular.otf */, + 666078AFC2DC4894ABC19DA5 /* Inter-SemiBold.otf */, + C03CCA67A92F47D59CDA16E5 /* Inter-SemiBoldItalic.otf */, + B68457923C3F444388AB85F2 /* Inter-Thin.otf */, + 1CA9D245CD5A439D88F01D4F /* Inter-ThinItalic.otf */, + F59F295E9CC54539B2C48953 /* Luciole-Bold-Italic.ttf */, + ABB740B68A8141229E6118AC /* Luciole-Bold.ttf */, + 8720D4D8B8BC41B79088D43C /* Luciole-Regular-Italic.ttf */, + 714371FB26B944FFBE7F0B29 /* Luciole-Regular.ttf */, + 110D16BAD3FA4513BEA89A3A /* slkscr.ttf */, + 0AD24C885D29461481982641 /* slkscrb.ttf */, + 98413C61772F41BD96F279F5 /* slkscr.woff */, + 449D98322BFA406CBB9E2648 /* Inter-Bold.otf */, + ); + name = Resources; + sourceTree = ""; + path = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -276,6 +360,31 @@ 05BD9DCC2B548AA900823023 /* MoproKit in Resources */, 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 2FA7C90AFAF5417DAA7BCB1E /* Inter-Black.otf in Resources */, + C9B733B168F84BBA818C6CB8 /* Inter-BlackItalic.otf in Resources */, + 15AAF7651FCF40EB993543A3 /* Inter-BoldItalic.otf in Resources */, + 1D2A11340C7041909B820A90 /* Inter-ExtraBold.otf in Resources */, + E4BC7CC193684992A11E3135 /* Inter-ExtraBoldItalic.otf in Resources */, + 1BA25F26C91C45F697D55099 /* Inter-ExtraLight.otf in Resources */, + 625D35EA2F1643E89F9887CE /* Inter-ExtraLightItalic.otf in Resources */, + EEC491DF41A44001A577E8C5 /* Inter-Italic.otf in Resources */, + 0A6918EB0654476189741475 /* Inter-Light.otf in Resources */, + 9713779CBED04A308A0B2DF2 /* Inter-LightItalic.otf in Resources */, + B9E3D3D20C9F4863A67B66D3 /* Inter-Medium.otf in Resources */, + 8362BCF2197E445C9CAFFD53 /* Inter-MediumItalic.otf in Resources */, + 2CD45EA0A0A94063935CE7D3 /* Inter-Regular.otf in Resources */, + 6FA6BA98BE3F485982F5E962 /* Inter-SemiBold.otf in Resources */, + B7C1F08B40CC4C1985152F72 /* Inter-SemiBoldItalic.otf in Resources */, + F78FB2FC94E1443A8EE8EEC3 /* Inter-Thin.otf in Resources */, + 37AF1D1302824FFC83B6D1D2 /* Inter-ThinItalic.otf in Resources */, + CC99B59A281C4B6497C14141 /* Luciole-Bold-Italic.ttf in Resources */, + 05E2174E2E7E48EB80B9C8D8 /* Luciole-Bold.ttf in Resources */, + 6959CC40713D4D42AA56850D /* Luciole-Regular-Italic.ttf in Resources */, + E4E0715B819049EFACAF2AEE /* Luciole-Regular.ttf in Resources */, + 98D6CE33FC02453794D8DB08 /* slkscr.ttf in Resources */, + FA58D9C915314CF086BD7FFB /* slkscrb.ttf in Resources */, + 749862C5A266413FBE508618 /* slkscr.woff in Resources */, + 5A0E2800F0C34012B292255B /* Inter-Bold.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/app/ios/ProofOfPassport/Info.plist b/app/ios/ProofOfPassport/Info.plist index cf7bd77c7..64bda2266 100644 --- a/app/ios/ProofOfPassport/Info.plist +++ b/app/ios/ProofOfPassport/Info.plist @@ -23,7 +23,7 @@ CFBundleVersion $(CURRENT_PROJECT_VERSION) LSApplicationCategoryType - + LSRequiresIPhoneOS NFCReaderUsageDescription @@ -31,7 +31,7 @@ NSAppTransportSecurity NSLocationWhenInUseUsageDescription - + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -52,5 +52,32 @@ A0000002472001 00000000000000 + UIAppFonts + + Inter-Black.otf + Inter-BlackItalic.otf + Inter-BoldItalic.otf + Inter-ExtraBold.otf + Inter-ExtraBoldItalic.otf + Inter-ExtraLight.otf + Inter-ExtraLightItalic.otf + Inter-Italic.otf + Inter-Light.otf + Inter-LightItalic.otf + Inter-Medium.otf + Inter-MediumItalic.otf + Inter-Regular.otf + Inter-SemiBold.otf + Inter-SemiBoldItalic.otf + Inter-Thin.otf + Inter-ThinItalic.otf + Luciole-Bold-Italic.ttf + Luciole-Bold.ttf + Luciole-Regular-Italic.ttf + Luciole-Regular.ttf + slkscr.ttf + slkscrb.ttf + Inter-Bold.otf + diff --git a/app/scripts/download_current_zkey.sh b/app/scripts/download_current_zkey.sh index 73928a143..d5170f223 100755 --- a/app/scripts/download_current_zkey.sh +++ b/app/scripts/download_current_zkey.sh @@ -5,6 +5,5 @@ if [ -f "proof_of_passport_final.zkey" ]; then rm "proof_of_passport_final.zkey" fi echo "downloading proof_of_passport_final.zkey to /circuits/build/" -wget https://current-pop-zkey.s3.eu-north-1.amazonaws.com/proof_of_passport_final_dynamic_dg_support.arkzkey # ios -mv proof_of_passport_final_dynamic_dg_support.arkzkey proof_of_passport_final.zkey -cd ../../app \ No newline at end of file +wget https://current-pop-zkey.s3.eu-north-1.amazonaws.com/proof_of_passport_final_merkle_proof.arkzkey # ios +mv proof_of_passport_final_merkle_proof.arkzkey proof_of_passport_final.zkey \ No newline at end of file diff --git a/app/src/screens/ProveScreen.tsx b/app/src/screens/ProveScreen.tsx index 2f15dd937..2701069fb 100644 --- a/app/src/screens/ProveScreen.tsx +++ b/app/src/screens/ProveScreen.tsx @@ -60,7 +60,7 @@ const ProveScreen: React.FC = ({ try { console.log('Downloading file...') const result = await NativeModules.RNPassportReader.downloadFile( - 'https://current-pop-zkey.s3.eu-north-1.amazonaws.com/proof_of_passport_final_dynamic_dg_support.arkzkey', + 'https://current-pop-zkey.s3.eu-north-1.amazonaws.com/proof_of_passport_final_merkle_proof.arkzkey', fileName ); console.log("Download successful"); diff --git a/common/src/utils/generateInputs.ts b/common/src/utils/generateInputs.ts index d3ca15d4e..17d6ca8aa 100644 --- a/common/src/utils/generateInputs.ts +++ b/common/src/utils/generateInputs.ts @@ -18,7 +18,7 @@ export function generateCircuitInputs(passportData: PassportData, pubkeys: any[] 'concatenatedDataHashesHashDigest is at the right place in passportData.eContent' ) - const sigAlgFormatted = formatSigAlg(passportData.signatureAlgorithm, passportData.pubKey.exponent) + const sigAlgFormatted = formatSigAlg(passportData.signatureAlgorithm, passportData.pubKey.exponent ?? "65537") const pubkeyChunked = bigIntToChunkedBytes(BigInt(passportData.pubKey.modulus as string), 192, 11); const leaf = poseidon12([SignatureAlgorithm[sigAlgFormatted], ...pubkeyChunked]) @@ -45,15 +45,15 @@ export function generateCircuitInputs(passportData: PassportData, pubkeys: any[] BigInt(64), BigInt(32) ), - signatureAlgorithm: SignatureAlgorithm[sigAlgFormatted], + signatureAlgorithm: SignatureAlgorithm[sigAlgFormatted].toString(), pubkey: splitToWords( BigInt(passportData.pubKey.modulus as string), BigInt(64), BigInt(32) ), - pathIndices: proof.pathIndices, - siblings: proof.siblings.flat(), - root: tree.root, + pathIndices: proof.pathIndices.map(index => index.toString()), + siblings: proof.siblings.flat().map(index => index.toString()), + root: tree.root.toString(), address, } } \ No newline at end of file diff --git a/common/src/utils/pubkeyTree.ts b/common/src/utils/pubkeyTree.ts index d9e6da8e3..869e3fec6 100644 --- a/common/src/utils/pubkeyTree.ts +++ b/common/src/utils/pubkeyTree.ts @@ -4,7 +4,8 @@ import { IMT } from '@zk-kit/imt' import { bigIntToChunkedBytes, formatSigAlg } from "./utils"; export function buildPubkeyTree(pubkeys: any[]) { - const tree = new IMT(poseidon2, TREE_DEPTH, 0) // 0 as zerovalue + let leaves: bigint[] = [] + let startTime = performance.now(); for(let i = 0; i < pubkeys.length; i++) { const pubkey = pubkeys[i] @@ -50,7 +51,11 @@ export function buildPubkeyTree(pubkeys: any[]) { continue } - tree.insert(leaf) + leaves.push(leaf) } + + const tree = new IMT(poseidon2, TREE_DEPTH, 0, 2, leaves) + console.log('pubkey tree built in', performance.now() - startTime, 'ms') + return tree } \ No newline at end of file diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts index 6c5f5d9e2..894679ad0 100644 --- a/contracts/scripts/deploy.ts +++ b/contracts/scripts/deploy.ts @@ -1,9 +1,14 @@ import { ethers } from "hardhat"; import { countryCodes } from "../../common/src/constants/constants"; +import { buildPubkeyTree } from "../../common/src/utils/pubkeyTree"; +import { formatRoot } from "../../common/src/utils/utils"; const fs = require('fs'); const path = require('path'); async function main() { + const pubkeys = JSON.parse(fs.readFileSync("../common/pubkeys/publicKeysParsed.json") as unknown as string) + const root = formatRoot(buildPubkeyTree(pubkeys).root) + const Verifier = await ethers.getContractFactory("Groth16Verifier"); const verifier = await Verifier.deploy(); await verifier.waitForDeployment(); @@ -19,9 +24,13 @@ async function main() { await tx.wait(); console.log(`Country codes added`); + const Registry = await ethers.getContractFactory("Registry"); + const registry = await Registry.deploy(root); + await registry.waitForDeployment(); + console.log(`Registry deployed to ${registry.target}`); const ProofOfPassport = await ethers.getContractFactory("ProofOfPassport"); - const proofOfPassport = await ProofOfPassport.deploy(verifier.target, formatter.target); + const proofOfPassport = await ProofOfPassport.deploy(verifier.target, formatter.target, registry.target); await proofOfPassport.waitForDeployment(); console.log(`ProofOfPassport NFT deployed to ${proofOfPassport.target}`);