diff --git a/examples/calculator/contract.spec.ts b/examples/calculator/contract.spec.ts index 4d5a122..61b1721 100644 --- a/examples/calculator/contract.spec.ts +++ b/examples/calculator/contract.spec.ts @@ -1,4 +1,4 @@ -import { internal, op, Uint64 } from '@algorandfoundation/algorand-typescript' +import { internal, Uint64 } from '@algorandfoundation/algorand-typescript' import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' import { afterEach, describe, expect, it } from 'vitest' import MyContract from './contract.algo' @@ -31,7 +31,7 @@ describe('Calculator', () => { .createScope([ ctx.any.txn.applicationCall({ appId: application, - appArgs: [op.itob(Uint64(1)), op.itob(Uint64(2)), op.itob(Uint64(3))], + appArgs: [Uint64(1), Uint64(2), Uint64(3)], }), ]) .execute(contract.approvalProgram) diff --git a/package-lock.json b/package-lock.json index 6e814a4..4c98251 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "hasInstallScript": true, "dependencies": { "@algorandfoundation/algokit-utils": "^6.2.1", - "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.20", - "@algorandfoundation/puya-ts": "^1.0.0-alpha.32", + "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.22", + "@algorandfoundation/puya-ts": "^1.0.0-alpha.34", "algosdk": "^2.9.0", "elliptic": "^6.5.7", "js-sha256": "^0.11.0", @@ -50,7 +50,7 @@ "rollup": "^4.24.0", "semantic-release": "^24.1.2", "tsx": "4.19.1", - "typescript": "5.6.2", + "typescript": "^5.7.2", "vitest": "2.1.2" }, "peerDependencies": { @@ -73,17 +73,17 @@ } }, "node_modules/@algorandfoundation/algorand-typescript": { - "version": "0.0.1-alpha.20", - "resolved": "https://registry.npmjs.org/@algorandfoundation/algorand-typescript/-/algorand-typescript-0.0.1-alpha.20.tgz", - "integrity": "sha512-XpIxvfOQdcZV1cG4TI6pXDtvYDtReWX6xW4bEuVn9FSpVrg1Vgs0lW03QoLK1sNs38Y/oW1UV9iep1P1AJX6fA==", + "version": "0.0.1-alpha.22", + "resolved": "https://registry.npmjs.org/@algorandfoundation/algorand-typescript/-/algorand-typescript-0.0.1-alpha.22.tgz", + "integrity": "sha512-RhPxX2wU3srIEmA8EgjEbE8lJQqJrUW78aKS2VnpVS/uejHMDDt+kQIjtjpNEB+vxli8shaBYZ8TM0h1wE5b0g==", "peerDependencies": { "tslib": "^2.6.2" } }, "node_modules/@algorandfoundation/puya-ts": { - "version": "1.0.0-alpha.32", - "resolved": "https://registry.npmjs.org/@algorandfoundation/puya-ts/-/puya-ts-1.0.0-alpha.32.tgz", - "integrity": "sha512-9mMS8v9AksNDS9rVy+KJmbUjtYvOmXQh8ThNZ+yyvFct+vhEdiBTBnoaUsOXsTjpMtchh1GHUkjjtVKhHUuRsg==", + "version": "1.0.0-alpha.34", + "resolved": "https://registry.npmjs.org/@algorandfoundation/puya-ts/-/puya-ts-1.0.0-alpha.34.tgz", + "integrity": "sha512-H5MHNk6JDV5NeWlV9na+MZvN2Jge/PcVhINOCHNG4RixYU/rBPBzbpIvpbQkSjo7uWrqaxFSHUtL08H+/cLClg==", "bundleDependencies": [ "typescript" ], @@ -95,7 +95,7 @@ "cross-spawn": "7.0.6", "glob": "^11.0.0", "polytype": "^0.17.0", - "typescript": "5.6.2", + "typescript": "^5.7.2", "upath": "^2.0.1", "zod": "^3.24.0" }, @@ -105,7 +105,7 @@ } }, "node_modules/@algorandfoundation/puya-ts/node_modules/typescript": { - "version": "5.6.2", + "version": "5.7.2", "inBundle": true, "license": "Apache-2.0", "bin": { @@ -12945,10 +12945,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index eb6421d..b2d7492 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "rollup": "^4.24.0", "semantic-release": "^24.1.2", "tsx": "4.19.1", - "typescript": "5.6.2", + "typescript": "^5.7.2", "vitest": "2.1.2" }, "peerDependencies": { @@ -63,8 +63,8 @@ }, "dependencies": { "@algorandfoundation/algokit-utils": "^6.2.1", - "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.20", - "@algorandfoundation/puya-ts": "^1.0.0-alpha.32", + "@algorandfoundation/algorand-typescript": "^0.0.1-alpha.22", + "@algorandfoundation/puya-ts": "^1.0.0-alpha.34", "algosdk": "^2.9.0", "elliptic": "^6.5.7", "js-sha256": "^0.11.0", diff --git a/patches/typescript+5.6.2.patch b/patches/typescript+5.7.2.patch similarity index 69% rename from patches/typescript+5.6.2.patch rename to patches/typescript+5.7.2.patch index 9712991..f28cd8b 100644 --- a/patches/typescript+5.6.2.patch +++ b/patches/typescript+5.7.2.patch @@ -1,20 +1,20 @@ diff --git a/node_modules/typescript/lib/typescript.d.ts b/node_modules/typescript/lib/typescript.d.ts -index 963c573..299a8a4 100644 +index 6780dd1..8700e72 100644 --- a/node_modules/typescript/lib/typescript.d.ts +++ b/node_modules/typescript/lib/typescript.d.ts -@@ -6116,6 +6116,7 @@ declare namespace ts { +@@ -6159,6 +6159,7 @@ declare namespace ts { getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined; getIndexInfosOfType(type: Type): readonly IndexInfo[]; - getIndexInfosOfIndexSymbol: (indexSymbol: Symbol) => IndexInfo[]; + getIndexInfosOfIndexSymbol: (indexSymbol: Symbol, siblingSymbols?: Symbol[] | undefined) => IndexInfo[]; + getTypeArgumentsForResolvedSignature(signature: Signature): readonly Type[] | undefined; getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[]; getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined; getBaseTypes(type: InterfaceType): BaseType[]; diff --git a/node_modules/typescript/lib/typescript.js b/node_modules/typescript/lib/typescript.js -index 90f3266..9daa319 100644 +index 33387ea..a1f35b3 100644 --- a/node_modules/typescript/lib/typescript.js +++ b/node_modules/typescript/lib/typescript.js -@@ -50171,6 +50171,7 @@ function createTypeChecker(host) { +@@ -50655,6 +50655,7 @@ function createTypeChecker(host) { getGlobalDiagnostics, getRecursionIdentity, getUnmatchedProperties, @@ -22,13 +22,13 @@ index 90f3266..9daa319 100644 getTypeOfSymbolAtLocation: (symbol, locationIn) => { const location = getParseTreeNode(locationIn); return location ? getTypeOfSymbolAtLocation(symbol, location) : errorType; -@@ -92895,6 +92896,9 @@ function createTypeChecker(host) { - Debug.assert(specifier && nodeIsSynthesized(specifier) && specifier.text === "tslib", `Expected sourceFile.imports[0] to be the synthesized tslib import`); - return specifier; +@@ -71776,6 +71777,9 @@ function createTypeChecker(host) { + } + } } + function getTypeArgumentsForResolvedSignature(signature) { + return signature.mapper && instantiateTypes((signature.target ?? signature).typeParameters ?? [], signature.mapper); + } - } - function isNotAccessor(declaration) { - return !isAccessor(declaration); + function getUnmatchedProperty(source, target, requireOptionalProperties, matchDiscriminantProperties) { + return firstOrUndefinedIterator(getUnmatchedProperties(source, target, requireOptionalProperties, matchDiscriminantProperties)); + } diff --git a/src/abi-metadata.ts b/src/abi-metadata.ts index d11dc57..57723a6 100644 --- a/src/abi-metadata.ts +++ b/src/abi-metadata.ts @@ -1,16 +1,20 @@ import { BaseContract, Contract } from '@algorandfoundation/algorand-typescript' import { AbiMethodConfig, BareMethodConfig, CreateOptions, OnCompleteActionStr } from '@algorandfoundation/algorand-typescript/arc4' +import { ABIMethod } from 'algosdk' +import { TypeInfo } from './encoders' +import { getArc4TypeName as getArc4TypeNameForARC4Encoded } from './impl/encoded-types' import { DeliberateAny } from './typescript-helpers' export interface AbiMetadata { methodName: string - methodSelector: string + methodSignature: string | undefined argTypes: string[] returnType: string onCreate?: CreateOptions allowActions?: OnCompleteActionStr[] } const AbiMetaSymbol = Symbol('AbiMetadata') +export const isContractProxy = Symbol('isContractProxy') export const attachAbiMetadata = (contract: { new (): Contract }, methodName: string, metadata: AbiMetadata): void => { const metadatas: Record = (AbiMetaSymbol in contract ? contract[AbiMetaSymbol] : {}) as Record metadatas[methodName] = metadata @@ -23,38 +27,89 @@ export const attachAbiMetadata = (contract: { new (): Contract }, methodName: st } } +export const copyAbiMetadatas = (sourceContract: T, targetContract: T): void => { + const metadatas = getContractAbiMetadata(sourceContract) + Object.defineProperty(targetContract, AbiMetaSymbol, { + value: metadatas, + writable: true, + enumerable: false, + }) +} + export const captureMethodConfig = ( contract: T, methodName: string, config?: AbiMethodConfig | BareMethodConfig, ): void => { - const metadata = ensureMetadata(contract, methodName) + const metadata = getContractMethodAbiMetadata(contract, methodName) metadata.onCreate = config?.onCreate ?? 'disallow' metadata.allowActions = ([] as OnCompleteActionStr[]).concat(config?.allowActions ?? 'NoOp') } -const ensureMetadata = (contract: T, methodName: string): AbiMetadata => { - if (!hasAbiMetadata(contract)) { - const contractClass = contract.constructor as { new (): T } - Object.getOwnPropertyNames(Object.getPrototypeOf(contract)).forEach((name) => { - attachAbiMetadata(contractClass, name, { methodName: name, methodSelector: name, argTypes: [], returnType: '' }) - }) - } - return getAbiMetadata(contract, methodName) -} - export const hasAbiMetadata = (contract: T): boolean => { const contractClass = contract.constructor as { new (): T } return ( Object.getOwnPropertySymbols(contractClass).some((s) => s.toString() === AbiMetaSymbol.toString()) || AbiMetaSymbol in contractClass ) } - -export const getAbiMetadata = (contract: T, methodName: string): AbiMetadata => { +export const getContractAbiMetadata = (contract: T): Record => { + if ((contract as DeliberateAny)[isContractProxy]) { + return (contract as DeliberateAny)[AbiMetaSymbol] as Record + } const contractClass = contract.constructor as { new (): T } const s = Object.getOwnPropertySymbols(contractClass).find((s) => s.toString() === AbiMetaSymbol.toString()) const metadatas: Record = ( s ? (contractClass as DeliberateAny)[s] : AbiMetaSymbol in contractClass ? contractClass[AbiMetaSymbol] : {} ) as Record + return metadatas +} + +export const getContractMethodAbiMetadata = (contract: T, methodName: string): AbiMetadata => { + const metadatas = getContractAbiMetadata(contract) return metadatas[methodName] } + +export const getArc4Signature = (metadata: AbiMetadata): string => { + if (metadata.methodSignature === undefined) { + const argTypes = metadata.argTypes.map((t) => JSON.parse(t) as TypeInfo).map(getArc4TypeName) + const returnType = getArc4TypeName(JSON.parse(metadata.returnType) as TypeInfo) + const method = new ABIMethod({ name: metadata.methodName, args: argTypes.map((t) => ({ type: t })), returns: { type: returnType } }) + metadata.methodSignature = method.getSignature() + } + return metadata.methodSignature +} + +const getArc4TypeName = (t: TypeInfo): string => { + const map: Record string)> = { + void: 'void', + account: 'account', + application: 'application', + asset: 'asset', + boolean: 'bool', + biguint: 'uint512', + bytes: 'byte[]', + string: 'string', + uint64: 'uint64', + OnCompleteAction: 'uint64', + TransactionType: 'uint64', + Transaction: 'txn', + PaymentTxn: 'pay', + KeyRegistrationTxn: 'keyreg', + AssetConfigTxn: 'acfg', + AssetTransferTxn: 'axfer', + AssetFreezeTxn: 'afrz', + ApplicationTxn: 'appl', + 'Tuple<.*>': (t) => + `(${Object.values(t.genericArgs as Record) + .map(getArc4TypeName) + .join(',')})`, + } + const entry = Object.entries(map).find(([k, _]) => new RegExp(`^${k}$`, 'i').test(t.name))?.[1] + if (entry === undefined) { + return getArc4TypeNameForARC4Encoded(t) ?? t.name + } + if (entry instanceof Function) { + return entry(t) + } + return entry +} diff --git a/src/context-helpers/context-util.ts b/src/context-helpers/context-util.ts new file mode 100644 index 0000000..7cfb006 --- /dev/null +++ b/src/context-helpers/context-util.ts @@ -0,0 +1,21 @@ +import { internal, uint64 } from '@algorandfoundation/algorand-typescript' +import { AbiMetadata } from '../abi-metadata' +import { ApplicationTransaction } from '../impl/transactions' +import { lazyContext } from './internal-context' + +export const checkRoutingConditions = (appId: uint64, metadata: AbiMetadata) => { + const appData = lazyContext.getApplicationData(appId) + const isCreating = appData.isCreating + if (isCreating && metadata.onCreate === 'disallow') { + throw new internal.errors.CodeError('method can not be called while creating') + } + if (!isCreating && metadata.onCreate === 'require') { + throw new internal.errors.CodeError('method can only be called while creating') + } + const txn = lazyContext.activeGroup.activeTransaction + if (txn instanceof ApplicationTransaction && metadata.allowActions && !metadata.allowActions.includes(txn.onCompletion)) { + throw new internal.errors.CodeError( + `method can only be called with one of the following on_completion values: ${metadata.allowActions.join(', ')}`, + ) + } +} diff --git a/src/context-helpers/internal-context.ts b/src/context-helpers/internal-context.ts index 459e995..e7b6e1d 100644 --- a/src/context-helpers/internal-context.ts +++ b/src/context-helpers/internal-context.ts @@ -1,4 +1,4 @@ -import { Account, internal } from '@algorandfoundation/algorand-typescript' +import { Account, BaseContract, internal } from '@algorandfoundation/algorand-typescript' import { AccountData } from '../impl/account' import { ApplicationData } from '../impl/application' import { AssetData } from '../impl/asset' @@ -60,8 +60,10 @@ class InternalContext { return data } - getApplicationData(id: internal.primitives.StubUint64Compat): ApplicationData { - const data = this.ledger.applicationDataMap.get(id) + getApplicationData(id: internal.primitives.StubUint64Compat | BaseContract): ApplicationData { + const uint64Id = + id instanceof BaseContract ? this.ledger.getApplicationForContract(id).id : internal.primitives.Uint64Cls.fromCompat(id) + const data = this.ledger.applicationDataMap.get(uint64Id) if (!data) { throw internal.errors.internalError('Unknown application, check correct testing context is active') } diff --git a/src/impl/app-global.ts b/src/impl/app-global.ts index 1c31acc..eaa5470 100644 --- a/src/impl/app-global.ts +++ b/src/impl/app-global.ts @@ -1,6 +1,6 @@ import { Application, Bytes, bytes, internal, Uint64, uint64 } from '@algorandfoundation/algorand-typescript' import { lazyContext } from '../context-helpers/internal-context' -import { asBytes } from '../util' +import { asBytes, toBytes } from '../util' import { getApp } from './app-params' export const AppGlobal: internal.opTypes.AppGlobalType = { @@ -22,7 +22,7 @@ export const AppGlobal: internal.opTypes.AppGlobalType = { if (!exists) { return [Bytes(), false] } - return [state!.value as bytes, exists] + return [toBytes(state!.value), exists] }, getExUint64(a: Application | internal.primitives.StubUint64Compat, b: internal.primitives.StubBytesCompat): readonly [uint64, boolean] { const app = getApp(a) diff --git a/src/impl/app-local.ts b/src/impl/app-local.ts index f478fce..d6feb16 100644 --- a/src/impl/app-local.ts +++ b/src/impl/app-local.ts @@ -1,6 +1,6 @@ import { Account, Application, Bytes, bytes, internal, Uint64, uint64 } from '@algorandfoundation/algorand-typescript' import { lazyContext } from '../context-helpers/internal-context' -import { asBytes } from '../util' +import { asBytes, toBytes } from '../util' import { getAccount } from './acct-params' import { getApp } from './app-params' @@ -32,7 +32,7 @@ export const AppLocal: internal.opTypes.AppLocalType = { if (!exists) { return [Bytes(), false] } - return [state!.value as bytes, exists] + return [toBytes(state!.value), exists] }, getExUint64: function ( a: Account | internal.primitives.StubUint64Compat, diff --git a/src/impl/encoded-types.ts b/src/impl/encoded-types.ts index cf8578b..178a991 100644 --- a/src/impl/encoded-types.ts +++ b/src/impl/encoded-types.ts @@ -81,6 +81,10 @@ export class UintNImpl extends UintN { static getMaxBitsLength(typeInfo: TypeInfo): BitSize { return parseInt((typeInfo.genericArgs as TypeInfo[])![0].name, 10) as BitSize } + + static getArc4TypeName = (t: TypeInfo): string => { + return `uint${this.getMaxBitsLength(t)}` + } } const regExpNxM = (maxPrecision: number) => new RegExp(`^\\d*\\.?\\d{0,${maxPrecision}}$`) @@ -144,6 +148,11 @@ export class UFixedNxMImpl extends UFixedNx const genericArgs = typeInfo.genericArgs as uFixedNxMGenericArgs return parseInt(genericArgs.n.name, 10) as BitSize } + + static getArc4TypeName = (t: TypeInfo): string => { + const genericArgs = t.genericArgs as uFixedNxMGenericArgs + return `ufixed${genericArgs.n.name}x${genericArgs.m.name}` + } } export class ByteImpl extends Byte { @@ -403,6 +412,11 @@ export class StaticArrayImpl } return size } + + static getArc4TypeName = (t: TypeInfo): string => { + const genericArgs = t.genericArgs as StaticArrayGenericArgs + return `${getArc4TypeName(genericArgs.elementType)}[${genericArgs.size.name}]` + } } export class AddressImpl extends Address { @@ -562,6 +576,11 @@ export class DynamicArrayImpl extends DynamicArray { + const genericArgs = t.genericArgs as DynamicArrayGenericArgs + return `${getArc4TypeName(genericArgs.elementType)}[]` + } + private encodeWithLength(items: TItem[]) { return conactUint8Arrays(encodeLength(items.length).asUint8Array(), encode(items)) } @@ -657,6 +676,11 @@ export class TupleImpl extends T } return size } + + static getArc4TypeName = (t: TypeInfo): string => { + const genericArgs = Object.values(t.genericArgs as Record) + return `(${genericArgs.map(getArc4TypeName).join(',')})` + } } type StructConstraint = Record @@ -732,6 +756,11 @@ export class StructImpl extends (Struct { + const genericArgs = Object.values(t.genericArgs as Record) + return `(${genericArgs.map(getArc4TypeName).join(',')})` + } } export class DynamicBytesImpl extends DynamicBytes { @@ -783,6 +812,10 @@ export class DynamicBytesImpl extends DynamicBytes { result.value = dynamicArrayValue return result } + + static getArc4TypeName = (_t: TypeInfo): string => { + return 'byte[]' + } } export class StaticBytesImpl extends StaticBytes { @@ -838,6 +871,11 @@ export class StaticBytesImpl extends StaticBytes { static getMaxBytesLength(typeInfo: TypeInfo): number { return StaticArrayImpl.getMaxBytesLength(typeInfo) } + + static getArc4TypeName = (t: TypeInfo): string => { + const genericArgs = t.genericArgs as StaticArrayGenericArgs + return `byte[${genericArgs.size.name}]` + } } const decode = (value: Uint8Array, childTypes: TypeInfo[]) => { @@ -1097,3 +1135,24 @@ export const getArc4Encoder = (typeInfo: TypeInfo, encoders?: Record } + +export const getArc4TypeName = (typeInfo: TypeInfo): string | undefined => { + const map = { + Address: 'address', + Bool: 'bool', + Byte: 'byte', + Str: 'string', + 'UintN<.*>': UintNImpl.getArc4TypeName, + 'UFixedNxM<.*>': UFixedNxMImpl.getArc4TypeName, + 'StaticArray<.*>': StaticArrayImpl.getArc4TypeName, + 'DynamicArray<.*>': DynamicArrayImpl.getArc4TypeName, + Tuple: TupleImpl.getArc4TypeName, + Struct: StructImpl.getArc4TypeName, + DynamicBytes: DynamicBytesImpl.getArc4TypeName, + 'StaticBytes<.*>': StaticBytesImpl.getArc4TypeName, + } + const name = Object.entries(map).find(([k, _]) => new RegExp(`^${k}$`, 'i').test(typeInfo.name))?.[1] + if (typeof name === 'string') return name + else if (typeof name === 'function') return name(typeInfo) + return undefined +} diff --git a/src/impl/inner-transactions.ts b/src/impl/inner-transactions.ts index 8f6c4ea..ea68185 100644 --- a/src/impl/inner-transactions.ts +++ b/src/impl/inner-transactions.ts @@ -1,4 +1,10 @@ import { Account, Application, arc4, Asset, bytes, internal, itxn, TransactionType, uint64 } from '@algorandfoundation/algorand-typescript' +import { lazyContext } from '../context-helpers/internal-context' +import { Mutable } from '../typescript-helpers' +import { asBytes } from '../util' +import { getApp } from './app-params' +import { getAsset } from './asset-params' +import { InnerTxn, InnerTxnFields } from './itxn' import { ApplicationTransaction, AssetConfigTransaction, @@ -7,12 +13,6 @@ import { KeyRegistrationTransaction, PaymentTransaction, } from './transactions' -import { asBytes, toBytes } from '../util' -import { getAsset } from './asset-params' -import { InnerTxn, InnerTxnFields } from './itxn' -import { getApp } from './app-params' -import { Mutable } from '../typescript-helpers' -import { lazyContext } from '../context-helpers/internal-context' const mapCommonFields = ( fields: T, @@ -149,7 +149,7 @@ export class ApplicationInnerTxn extends ApplicationTransaction implements itxn. approvalProgramPages: Array.isArray(approvalProgram) ? approvalProgram : undefined, clearStateProgram: Array.isArray(clearStateProgram) ? undefined : (clearStateProgram as bytes), clearStateProgramPages: Array.isArray(clearStateProgram) ? clearStateProgram : undefined, - appArgs: appArgs?.map((x) => toBytes(x)), + appArgs: appArgs?.map((x) => x), accounts: accounts?.map((x) => x), assets: assets?.map((x) => x), apps: apps?.map((x) => x), diff --git a/src/impl/transactions.ts b/src/impl/transactions.ts index d6fae1a..6e0b85e 100644 --- a/src/impl/transactions.ts +++ b/src/impl/transactions.ts @@ -226,7 +226,7 @@ export class AssetFreezeTransaction extends TransactionBase implements gtxn.Asse export type ApplicationTransactionFields = TxnFields & Partial<{ - appArgs: Array + appArgs: Array accounts: Array assets: Array apps: Array @@ -241,7 +241,7 @@ export class ApplicationTransaction extends TransactionBase implements gtxn.Appl static create(fields: ApplicationTransactionFields) { return new ApplicationTransaction(fields) } - #appArgs: Array + #appArgs: Array #accounts: Array #assets: Array #apps: Array @@ -308,7 +308,7 @@ export class ApplicationTransaction extends TransactionBase implements gtxn.Appl return this.#appLogs.at(-1) ?? lazyContext.getApplicationData(this.appId.id).appLogs.at(-1) ?? Bytes() } appArgs(index: internal.primitives.StubUint64Compat): bytes { - return this.#appArgs[asNumber(index)] + return toBytes(this.#appArgs[asNumber(index)]) } accounts(index: internal.primitives.StubUint64Compat): Account { return this.#accounts[asNumber(index)] diff --git a/src/set-up.ts b/src/set-up.ts index 718bd12..b368ebb 100644 --- a/src/set-up.ts +++ b/src/set-up.ts @@ -1,4 +1,5 @@ import { internal } from '@algorandfoundation/algorand-typescript' +import { Address } from '@algorandfoundation/algorand-typescript/arc4' import { encodingUtil } from '@algorandfoundation/puya-ts' import { AccountCls } from './impl/account' @@ -77,6 +78,33 @@ function addEqualityTesters(expectObj: ExpectObj) { // Defer to other testers return undefined }, + function AddressIsAccountStr(this: TesterContext, subject, test, customTesters): boolean | undefined { + if (subject instanceof Address) { + const testValue = typeof test === 'string' ? encodingUtil.base32ToUint8Array(test).slice(0, 32) : undefined + if (testValue !== undefined) return this.equals(subject.native.bytes, testValue, customTesters) + return undefined + } + // Defer to other testers + return undefined + }, + function AddressIsAccountBytes(this: TesterContext, subject, test, customTesters): boolean | undefined { + if (subject instanceof Address) { + const testValue = test instanceof internal.primitives.BytesCls ? test.asUint8Array().slice(0, 32) : undefined + if (testValue !== undefined) return this.equals(subject.native.bytes, testValue, customTesters) + return undefined + } + // Defer to other testers + return undefined + }, + function AddressIsAccount(this: TesterContext, subject, test, customTesters): boolean | undefined { + if (subject instanceof Address) { + const testValue = test instanceof AccountCls ? test.bytes : undefined + if (testValue !== undefined) return this.equals(subject.native.bytes, testValue, customTesters) + return undefined + } + // Defer to other testers + return undefined + }, ]) } diff --git a/src/subcontexts/contract-context.ts b/src/subcontexts/contract-context.ts index 27c71ad..26b7d62 100644 --- a/src/subcontexts/contract-context.ts +++ b/src/subcontexts/contract-context.ts @@ -1,6 +1,26 @@ -import { Account, Application, Asset, BaseContract, Bytes, bytes, Contract, LocalState } from '@algorandfoundation/algorand-typescript' -import { getAbiMetadata } from '../abi-metadata' +import { + Account, + Application, + Asset, + BaseContract, + Bytes, + bytes, + Contract, + contract, + internal, + LocalState, +} from '@algorandfoundation/algorand-typescript' +import { ABIMethod } from 'algosdk' +import { + AbiMetadata, + copyAbiMetadatas, + getArc4Signature, + getContractAbiMetadata, + getContractMethodAbiMetadata, + isContractProxy, +} from '../abi-metadata' import { BytesMap } from '../collections/custom-key-map' +import { checkRoutingConditions } from '../context-helpers/context-util' import { lazyContext } from '../context-helpers/internal-context' import type { TypeInfo } from '../encoders' import { AccountCls } from '../impl/account' @@ -18,7 +38,9 @@ import { } from '../impl/transactions' import { getGenericTypeInfo } from '../runtime-helpers' import { DeliberateAny, IConstructor } from '../typescript-helpers' -import { asUint64Cls } from '../util' +import { toBytes } from '../util' + +type ContractOptionsParameter = Parameters[0] type StateTotals = Pick @@ -33,7 +55,7 @@ const isUint64GenericType = (typeInfo: TypeInfo | undefined) => { return typeInfo.genericArgs.some((t) => t.name.toLocaleLowerCase() === 'uint64') } -const extractStates = (contract: BaseContract): States => { +const extractStates = (contract: BaseContract, contractOptions: ContractOptionsParameter | undefined): States => { const stateTotals = { globalNumBytes: 0, globalNumUint: 0, localNumBytes: 0, localNumUint: 0 } const states = { globalStates: new BytesMap>(), @@ -66,34 +88,37 @@ const extractStates = (contract: BaseContract): States => { stateTotals.localNumBytes += isLocalState && !isUint64State ? 1 : 0 } }) + + stateTotals.globalNumUint = contractOptions?.stateTotals?.globalUints ?? stateTotals.globalNumUint + stateTotals.globalNumBytes = contractOptions?.stateTotals?.globalBytes ?? stateTotals.globalNumBytes + stateTotals.localNumUint = contractOptions?.stateTotals?.localUints ?? stateTotals.localNumUint + stateTotals.localNumBytes = contractOptions?.stateTotals?.localBytes ?? stateTotals.localNumBytes + return states } -const extractArraysFromArgs = (app: Application, args: DeliberateAny[]) => { +const extractArraysFromArgs = (app: Application, methodSelector: Uint8Array, args: DeliberateAny[]) => { const transactions: Transaction[] = [] const accounts: Account[] = [] const apps: Application[] = [app] const assets: Asset[] = [] const appArgs: bytes[] = [] - // TODO: replace `asUint64Cls(accounts.length).toBytes().asAlgoTs()` with `arc4.Uint8(account.length).toBytes().asAlgoTs()` for (const arg of args) { if (isTransaction(arg)) { transactions.push(arg) } else if (arg instanceof AccountCls) { - appArgs.push(asUint64Cls(accounts.length).toBytes().asAlgoTs()) + appArgs.push(toBytes(accounts.length)) accounts.push(arg as Account) } else if (arg instanceof ApplicationCls) { - appArgs.push(asUint64Cls(apps.length).toBytes().asAlgoTs()) + appArgs.push(toBytes(apps.length)) apps.push(arg as Application) } else if (arg instanceof AssetCls) { - appArgs.push(asUint64Cls(assets.length).toBytes().asAlgoTs()) + appArgs.push(toBytes(assets.length)) assets.push(arg as Asset) } } - - // TODO: use actual method selector in appArgs - return { accounts, apps, assets, transactions, appArgs: [Bytes('method_selector'), ...appArgs] } + return { accounts, apps, assets, transactions, appArgs: [Bytes(methodSelector), ...appArgs] } } function isTransaction(obj: unknown): obj is Transaction { @@ -113,14 +138,14 @@ export class ContractContext { return new proxy(...args) } - static createMethodCallTxns( + static createMethodCallTxns( contract: BaseContract, - method: (...args: TParams) => TReturn, + abiMetadata: AbiMetadata | undefined, ...args: TParams ): Transaction[] { - const abiMetadata = getAbiMetadata(contract, method.name) const app = lazyContext.ledger.getApplicationForContract(contract) - const { transactions, ...appCallArgs } = extractArraysFromArgs(app, args) + const methodSelector = abiMetadata ? ABIMethod.fromSignature(getArc4Signature(abiMetadata)).getSelector() : new Uint8Array() + const { transactions, ...appCallArgs } = extractArraysFromArgs(app, methodSelector, args) const appTxn = lazyContext.any.txn.applicationCall({ appId: app, ...appCallArgs, @@ -144,8 +169,8 @@ export class ContractContext { } private getContractProxyHandler(isArc4: boolean): ProxyHandler> { - const onConstructed = (application: Application, instance: T) => { - const states = extractStates(instance) + const onConstructed = (application: Application, instance: T, conrtactOptions: ContractOptionsParameter | undefined) => { + const states = extractStates(instance, conrtactOptions) const applicationData = lazyContext.ledger.applicationDataMap.getOrFail(application.id) applicationData.application = { @@ -161,23 +186,33 @@ export class ContractContext { let t: T | undefined = undefined const application = lazyContext.any.application() const txn = lazyContext.any.txn.applicationCall({ appId: application }) + const appData = lazyContext.ledger.applicationDataMap.getOrFail(application.id) + appData.isCreating = true lazyContext.txn.ensureScope([txn]).execute(() => { t = new target(...args) }) + appData.isCreating = hasCreateMethods(t!) const instance = new Proxy(t!, { get(target, prop, receiver) { + if (prop === isContractProxy) { + return true + } const orig = Reflect.get(target, prop, receiver) - const abiMetadata = getAbiMetadata(target, prop as string) + const abiMetadata = getContractMethodAbiMetadata(target, prop as string) const isProgramMethod = prop === 'approvalProgram' || prop === 'clearStateProgram' const isAbiMethod = isArc4 && abiMetadata if (isAbiMethod || isProgramMethod) { return (...args: DeliberateAny[]): DeliberateAny => { - const txns = ContractContext.createMethodCallTxns(receiver, orig as DeliberateAny, ...args) + const txns = ContractContext.createMethodCallTxns(receiver, abiMetadata, ...args) return lazyContext.txn.ensureScope(txns).execute(() => { + if (isAbiMethod) { + checkRoutingConditions(application.id, abiMetadata) + } const returnValue = (orig as DeliberateAny).apply(target, args) if (!isProgramMethod && isAbiMethod && returnValue !== undefined) { ;(txns.at(-1) as ApplicationTransaction).logArc4ReturnValue(returnValue) } + appData.isCreating = false return returnValue }) } @@ -186,10 +221,22 @@ export class ContractContext { }, }) - onConstructed(application, instance) + onConstructed(application, instance, getContractOptions(t!)) + + copyAbiMetadatas(t!, instance) return instance }, } } } + +const getContractOptions = (contract: BaseContract): ContractOptionsParameter | undefined => { + const contractClass = contract.constructor as DeliberateAny + return contractClass[internal.ContractOptionsSymbol] as ContractOptionsParameter +} + +const hasCreateMethods = (contract: BaseContract) => { + const metadatas = getContractAbiMetadata(contract) + return Object.values(metadatas).some((metadata) => (metadata.onCreate ?? 'disallow') !== 'disallow') +} diff --git a/src/subcontexts/transaction-context.ts b/src/subcontexts/transaction-context.ts index 56722ef..dacd212 100644 --- a/src/subcontexts/transaction-context.ts +++ b/src/subcontexts/transaction-context.ts @@ -1,5 +1,6 @@ import { bytes, Contract, internal, TransactionType, uint64 } from '@algorandfoundation/algorand-typescript' import algosdk from 'algosdk' +import { AbiMetadata, getContractMethodAbiMetadata } from '../abi-metadata' import { lazyContext } from '../context-helpers/internal-context' import { DecodedLogs, decodeLogs, LogDecoding } from '../decode-logs' import { testInvariant } from '../errors' @@ -23,6 +24,7 @@ import { PaymentTransaction, Transaction, } from '../impl/transactions' +import { FunctionKeys } from '../typescript-helpers' import { asBigInt, asNumber, asUint64 } from '../util' import { ContractContext } from './contract-context' @@ -47,16 +49,34 @@ interface ExecutionScope { execute: (body: () => TReturn) => TReturn } +export const checkRoutingConditions = (appId: uint64, metadata: AbiMetadata) => { + const appData = lazyContext.getApplicationData(appId) + const isCreating = appData.isCreating + if (isCreating && metadata.onCreate === 'disallow') { + throw new internal.errors.CodeError('method can not be called while creating') + } + if (!isCreating && metadata.onCreate === 'require') { + throw new internal.errors.CodeError('method can only be called while creating') + } + const txn = lazyContext.activeGroup.activeTransaction + if (txn instanceof ApplicationTransaction && metadata.allowActions && !metadata.allowActions.includes(txn.onCompletion)) { + throw new internal.errors.CodeError( + `method can only be called with one of the following on_completion values: ${metadata.allowActions.join(', ')}`, + ) + } +} + export class DeferredAppCall { constructor( private readonly appId: uint64, readonly txns: Transaction[], private readonly method: (...args: TParams) => TReturn, + private readonly abiMetadata: AbiMetadata, private readonly args: TParams, ) {} submit(): TReturn { - // TODO: check_routing_conditions + checkRoutingConditions(this.appId, this.abiMetadata) return this.method(...this.args) } } @@ -124,14 +144,16 @@ export class TransactionContext { activeTransaction.appendLog(value) } - deferAppCall( - contract: Contract, + deferAppCall( + contract: TContract, method: (...args: TParams) => TReturn, + methodName: FunctionKeys, ...args: TParams ): DeferredAppCall { const appId = lazyContext.ledger.getApplicationForContract(contract) - const txns = ContractContext.createMethodCallTxns(contract, method, ...args) - return new DeferredAppCall(appId.id, txns, method, args) + const abiMetadata = getContractMethodAbiMetadata(contract, methodName as string) + const txns = ContractContext.createMethodCallTxns(contract, abiMetadata, ...args) + return new DeferredAppCall(appId.id, txns, method, abiMetadata, args) } exportLogs(appId: uint64, ...decoding: T): DecodedLogs { diff --git a/src/test-execution-context.ts b/src/test-execution-context.ts index 99f6335..250e3ab 100644 --- a/src/test-execution-context.ts +++ b/src/test-execution-context.ts @@ -28,13 +28,13 @@ export class TestExecutionContext implements internal.ExecutionContext { #valueGenerator: ValueGenerator #defaultSender: Account - constructor() { + constructor(defaultSenderAddress?: bytes) { internal.ctxMgr.instance = this this.#contractContext = new ContractContext() this.#ledgerContext = new LedgerContext() this.#txnContext = new TransactionContext() this.#valueGenerator = new ValueGenerator() - this.#defaultSender = Account(Bytes.fromBase32(algosdk.generateAccount().addr)) + this.#defaultSender = Account(defaultSenderAddress ?? Bytes.fromBase32(algosdk.generateAccount().addr)) } account(address?: bytes): Account { diff --git a/src/test-transformer/node-factory.ts b/src/test-transformer/node-factory.ts index f7f2577..49d5607 100644 --- a/src/test-transformer/node-factory.ts +++ b/src/test-transformer/node-factory.ts @@ -48,16 +48,21 @@ export const nodeFactory = { ) }, - attachMetaData(classIdentifier: ts.Identifier, method: ts.MethodDeclaration, functionType: ptypes.FunctionPType) { + attachMetaData( + classIdentifier: ts.Identifier, + method: ts.MethodDeclaration, + functionType: ptypes.FunctionPType, + argTypes: string[], + returnType: string, + ) { const methodName = getPropertyNameAsString(method.name) const metadata = factory.createObjectLiteralExpression([ factory.createPropertyAssignment('methodName', methodName), - factory.createPropertyAssignment('methodSelector', methodName), factory.createPropertyAssignment( 'argTypes', - factory.createArrayLiteralExpression(functionType.parameters.map((p) => factory.createStringLiteral(p[1].fullName))), + factory.createArrayLiteralExpression(argTypes.map((p) => factory.createStringLiteral(p))), ), - factory.createPropertyAssignment('returnType', factory.createStringLiteral(functionType.returnType.fullName)), + factory.createPropertyAssignment('returnType', factory.createStringLiteral(returnType)), ]) return factory.createExpressionStatement( factory.createCallExpression( diff --git a/src/test-transformer/visitors.ts b/src/test-transformer/visitors.ts index cba0798..76e5edf 100644 --- a/src/test-transformer/visitors.ts +++ b/src/test-transformer/visitors.ts @@ -249,7 +249,9 @@ class ClassVisitor { if (this.classDec.name && this.isArc4) { const methodType = this.helper.resolveType(node) if (methodType instanceof ptypes.FunctionPType) { - this.helper.additionalStatements.push(nodeFactory.attachMetaData(this.classDec.name, node, methodType)) + const argTypes = methodType.parameters.map((p) => JSON.stringify(getGenericTypeInfo(p[1]))) + const returnType = JSON.stringify(getGenericTypeInfo(methodType.returnType)) + this.helper.additionalStatements.push(nodeFactory.attachMetaData(this.classDec.name, node, methodType, argTypes, returnType)) } } @@ -318,7 +320,7 @@ const getGenericTypeInfo = (type: ptypes.PType): TypeInfo => { .map(([key, value]) => [key, getGenericTypeInfo(value)]) .filter((x) => !!x), ) - } else if (type instanceof ptypes.ARC4TupleType) { + } else if (type instanceof ptypes.ARC4TupleType || type instanceof ptypes.TuplePType) { genericArgs.push(...type.items.map(getGenericTypeInfo)) } diff --git a/src/util.ts b/src/util.ts index 0cd42eb..31d3211 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,4 +1,5 @@ import { Bytes, bytes, internal } from '@algorandfoundation/algorand-typescript' +import { ARC4Encoded } from '@algorandfoundation/algorand-typescript/arc4' import { randomBytes } from 'crypto' import { BITS_IN_BYTE, MAX_BYTES_SIZE, MAX_UINT512, MAX_UINT8, UINT512_SIZE } from './constants' import { BytesBackedCls, Uint64BackedCls } from './impl/base' @@ -45,7 +46,6 @@ export const asBytes = (val: internal.primitives.StubBytesCompat | Uint8Array) = export const asUint8Array = (val: internal.primitives.StubBytesCompat | Uint8Array) => asBytesCls(val).asUint8Array() -//TODO: handle arc4 types, bytes backed types export const toBytes = (val: unknown): bytes => { const uint64Val = asMaybeUint64Cls(val) if (uint64Val !== undefined) { @@ -66,17 +66,13 @@ export const toBytes = (val: unknown): bytes => { return asUint64Cls(val.uint64).toBytes().asAlgoTs() } if (Array.isArray(val)) { - // This hack handles tuples/arrays of uint64 only return val.reduce((acc: bytes, cur: unknown) => { - const uint64Val = asMaybeUint64Cls(cur) - if (!uint64Val) { - // TODO: support ABI tuple encoding - // internal.errors.internalError(`ABI tuple encoding not supported: ${nameOfType(val)}`) - return acc.concat(Bytes()) - } return acc.concat(toBytes(cur)) }, Bytes()) } + if (val instanceof ARC4Encoded) { + return val.bytes + } internal.errors.internalError(`Invalid type for bytes: ${nameOfType(val)}`) } diff --git a/tests/artifacts/box-contract/contract.algo.ts b/tests/artifacts/box-contract/contract.algo.ts index f14304d..0dbe673 100644 --- a/tests/artifacts/box-contract/contract.algo.ts +++ b/tests/artifacts/box-contract/contract.algo.ts @@ -1,18 +1,10 @@ -import { arc4, assert, Box, Bytes, op, TransactionType, uint64, Uint64 } from '@algorandfoundation/algorand-typescript' - -// type X = [a: uint64, b: string, c: bytes] -// type Y = { a: uint64; b: string; c: bytes } -// type Z = { x: X; y: Y } +import { arc4, assert, Box, Bytes, op, TransactionType } from '@algorandfoundation/algorand-typescript' +import { Tuple, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' export class BoxContract extends arc4.Contract { oca = Box({ key: Bytes('oca') }) txn = Box({ key: Bytes('txn') }) - // a = Box({ key: Bytes('a') }) - // b = Box({ key: Bytes('b') }) - // c = Box({ key: Bytes('c') }) - // d = Box({ key: Bytes('d') }) - @arc4.abimethod() public storeEnums(): void { this.oca.value = arc4.OnCompleteAction.OptIn @@ -20,12 +12,10 @@ export class BoxContract extends arc4.Contract { } @arc4.abimethod() - public read_enums(): readonly [uint64, uint64] { + public read_enums(): Tuple<[UintN64, UintN64]> { assert(op.Box.get(Bytes('oca'))[0] === op.itob(this.oca.value)) assert(op.Box.get(Bytes('txn'))[0] === op.itob(this.txn.value)) - return [Uint64(this.oca.value), Uint64(this.txn.value)] - // TODO: use arc4 types when available - // return arc4.Tuple((arc4.UInt64(this.oca.value), arc4.UInt64(this.txn.value))) + return new Tuple(new UintN64(this.oca.value), new UintN64(this.txn.value)) } } diff --git a/tests/artifacts/created-app-asset/contract.algo.ts b/tests/artifacts/created-app-asset/contract.algo.ts index d532f13..6ec0344 100644 --- a/tests/artifacts/created-app-asset/contract.algo.ts +++ b/tests/artifacts/created-app-asset/contract.algo.ts @@ -1,4 +1,5 @@ -import { arc4, assert, Bytes, gtxn, op, uint64 } from '@algorandfoundation/algorand-typescript' +import { arc4, assert, Global, gtxn, op, uint64 } from '@algorandfoundation/algorand-typescript' +import { interpretAsArc4, methodSelector, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' export class AppExpectingEffects extends arc4.Contract { @arc4.abimethod() @@ -13,16 +14,8 @@ export class AppExpectingEffects extends arc4.Contract { @arc4.abimethod() public log_group(appCall: gtxn.ApplicationTxn): void { - assert(appCall.appArgs(0) === Bytes('some_value()uint64'), 'expected correct method called') + assert(appCall.appArgs(0) === methodSelector('some_value()uint64'), 'expected correct method called') assert(appCall.numLogs === 1, 'expected logs') - assert(appCall.lastLog === Bytes('this is a log statement')) + assert(interpretAsArc4(appCall.lastLog, 'log').native === (appCall.groupIndex + 1) * Global.groupSize) } - - // TODO: uncomment when arc4 stubs are implemented - // @arc4.abimethod() - // public log_group(appCall: gtxn.ApplicationTxn): void { - // assert(appCall.appArgs(0) === arc4.arc4Signature("some_value()uint64"), "expected correct method called") - // assert(appCall.numLogs === 1, "expected logs") - // assert(arc4.UInt64.from_log(appCall.lastLog) === (appCall.groupIndex + 1) * Global.groupSize) - // } } diff --git a/tests/artifacts/crypto-ops/contract.algo.ts b/tests/artifacts/crypto-ops/contract.algo.ts index e74ae28..01455a9 100644 --- a/tests/artifacts/crypto-ops/contract.algo.ts +++ b/tests/artifacts/crypto-ops/contract.algo.ts @@ -1,4 +1,5 @@ import { arc4, bytes, Ecdsa, ensureBudget, op, OpUpFeeSource, uint64, VrfVerify } from '@algorandfoundation/algorand-typescript' +import { Bool } from '@algorandfoundation/algorand-typescript/arc4' export class CryptoOpsContract extends arc4.Contract { @arc4.abimethod() @@ -29,20 +30,18 @@ export class CryptoOpsContract extends arc4.Contract { return result } - // TODO: return arc4.Bool to match python version when arc4 types are available @arc4.abimethod() - public verify_ed25519verify(a: bytes, b: bytes, c: bytes): boolean { + public verify_ed25519verify(a: bytes, b: bytes, c: bytes): Bool { ensureBudget(1900, OpUpFeeSource.GroupCredit) const result = op.ed25519verify(a, b, c) - return result + return new Bool(result) } - // TODO: return arc4.Bool to match python version when arc4 types are available @arc4.abimethod() - public verify_ed25519verify_bare(a: bytes, b: bytes, c: bytes): boolean { + public verify_ed25519verify_bare(a: bytes, b: bytes, c: bytes): Bool { ensureBudget(1900, OpUpFeeSource.GroupCredit) const result = op.ed25519verifyBare(a, b, c) - return result + return new Bool(result) } @arc4.abimethod() diff --git a/tests/artifacts/primitive-ops/contract.algo.ts b/tests/artifacts/primitive-ops/contract.algo.ts index 0ea7097..9dfee26 100644 --- a/tests/artifacts/primitive-ops/contract.algo.ts +++ b/tests/artifacts/primitive-ops/contract.algo.ts @@ -1,4 +1,18 @@ -import { arc4, biguint, BigUint, Bytes, bytes, op, uint64 } from '@algorandfoundation/algorand-typescript' +import { arc4, biguint, BigUint, Bytes, bytes, log, op, uint64 } from '@algorandfoundation/algorand-typescript' +import { + Bool, + DynamicArray, + interpretAsArc4, + StaticArray, + Str, + Tuple, + UFixedNxM, + UintN, + UintN16, + UintN32, + UintN64, + UintN8, +} from '@algorandfoundation/algorand-typescript/arc4' export class PrimitiveOpsContract extends arc4.Contract { @arc4.abimethod() @@ -390,27 +404,26 @@ export class PrimitiveOpsContract extends arc4.Contract { return result } - // TODO: uncomment when arc4 types are available - // @arc4.abimethod - // public verify_log( # noqa: PLR0913 - // self, - // a: String, - // b: uint64, - // c: bytes, - // d: bytes, - // e: arc4.boolean, - // f: arc4.String, - // g: arc4.UIntN[typing.Literal[64]], - // h: arc4.BigUIntN[typing.Literal[256]], - // i: arc4.UFixedNxM[typing.Literal[32], typing.Literal[8]], - // j: arc4.BigUFixedNxM[typing.Literal[256], typing.Literal[16]], - // k: bytes, - // m: bytes, - // n: bytes, - // ) : None: - // d_biguint = BigUint(d) - // arc4_k = arc4.StaticArray[arc4.UInt8, typing.Literal[3]].from_bytes(k) - // arc4_m = arc4.DynamicArray[arc4.UInt16].from_bytes(m) - // arc4_n = arc4.Tuple[arc4.UInt32, arc4.uint64, arc4.String].from_bytes(n) - // log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n, sep="-") + @arc4.abimethod() + public verify_log( + a: string, + b: uint64, + c: bytes, + d: bytes, + e: Bool, + f: Str, + g: UintN<64>, + h: UintN<256>, + i: UFixedNxM<32, 8>, + j: UFixedNxM<256, 16>, + k: bytes, + m: bytes, + n: bytes, + ) { + const d_biguint = BigUint(d) + const arc4_k = interpretAsArc4>(k) + const arc4_m = interpretAsArc4>(m) + const arc4_n = interpretAsArc4>(n) + log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n) + } } diff --git a/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.approval.teal b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.approval.teal index 4e77e89..873741f 100644 --- a/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.approval.teal +++ b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.approval.teal @@ -9,30 +9,30 @@ tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.approvalPro // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.__puya_arc4_router__() -> uint64: __puya_arc4_router__: - // tests/artifacts/primitive-ops/contract.algo.ts:3 + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { proto 0 1 txn NumAppArgs - bz __puya_arc4_router___bare_routing@59 - pushbytess 0x725c692b 0x17314559 0x53f34893 0x88c8b269 0xa464b7ab 0x9c8b11b8 0x6f40654e 0xec9a2974 0xc793708f 0x7ddb7499 0xa21c443d 0x6e7fb212 0xb007fcb0 0x2ebc20d4 0xb0954b66 0xdd140aef 0xace474da 0xba694990 0x6db581c0 0x91c8db89 0xdbe77158 0x9a0f22e1 0x64033d37 0x2a7237c5 0xe3a94458 0x42f87f7d 0x2b5542a4 0x9be2fbe9 0x1cd92515 0x64e1705c 0xf1271c50 0x2ab63b70 0x834bb7d2 0x531620d7 0x3fb9e769 0xfa8db0bc 0xa72ea485 0xb7b0ba19 0x74460c42 0xab320738 0x52ad4654 0x10156399 0x0f075957 0xbd843dff 0xb377d381 0x89767265 0x456b4b23 0x33d1b88c 0x6bf973ea 0x67cd6bb2 0x3f58805a 0x1e130039 0x509dc91d 0xa564a202 0x23650763 // method "verify_uint64_init(byte[])uint64", method "verify_uint64_add(uint64,uint64)uint64", method "verify_uint64_sub(uint64,uint64)uint64", method "verify_uint64_mul(uint64,uint64)uint64", method "verify_uint64_div(uint64,uint64)uint64", method "verify_uint64_mod(uint64,uint64)uint64", method "verify_uint64_and(uint64,uint64)uint64", method "verify_uint64_or(uint64,uint64)uint64", method "verify_uint64_xor(uint64,uint64)uint64", method "verify_uint64_not(uint64)uint64", method "verify_uint64_lshift(uint64,uint64)uint64", method "verify_uint64_rshift(uint64,uint64)uint64", method "verify_uint64_pow(uint64,uint64)uint64", method "verify_uint64_eq(uint64,uint64)bool", method "verify_uint64_ne(uint64,uint64)bool", method "verify_uint64_lt(uint64,uint64)bool", method "verify_uint64_le(uint64,uint64)bool", method "verify_uint64_gt(uint64,uint64)bool", method "verify_uint64_ge(uint64,uint64)bool", method "verify_bytes_init(uint64)byte[]", method "verify_bytes_add(byte[],byte[],uint64,uint64)byte[]", method "verify_bytes_eq(byte[],byte[])bool", method "verify_bytes_ne(byte[],byte[])bool", method "verify_bytes_and(byte[],byte[])byte[]", method "verify_bytes_or(byte[],byte[])byte[]", method "verify_bytes_xor(byte[],byte[])byte[]", method "verify_bytes_not(byte[],uint64)byte[]", method "verify_biguint_add(byte[],byte[])byte[]", method "verify_biguint_add_uint64(byte[],uint64)byte[]", method "verify_biguint_sub(byte[],byte[])byte[]", method "verify_biguint_sub_uint64(byte[],uint64)byte[]", method "verify_biguint_mul(byte[],byte[])byte[]", method "verify_biguint_mul_uint64(byte[],uint64)byte[]", method "verify_biguint_div(byte[],byte[])byte[]", method "verify_biguint_div_uint64(byte[],uint64)byte[]", method "verify_biguint_mod(byte[],byte[])byte[]", method "verify_biguint_mod_uint64(byte[],uint64)byte[]", method "verify_biguint_and(byte[],byte[])byte[]", method "verify_biguint_and_uint64(byte[],uint64)byte[]", method "verify_biguint_or(byte[],byte[])byte[]", method "verify_biguint_or_uint64(byte[],uint64)byte[]", method "verify_biguint_xor(byte[],byte[])byte[]", method "verify_biguint_xor_uint64(byte[],uint64)byte[]", method "verify_biguint_eq(byte[],byte[])bool", method "verify_biguint_eq_uint64(byte[],uint64)bool", method "verify_biguint_ne(byte[],byte[])bool", method "verify_biguint_ne_uint64(byte[],uint64)bool", method "verify_biguint_lt(byte[],byte[])bool", method "verify_biguint_lt_uint64(byte[],uint64)bool", method "verify_biguint_le(byte[],byte[])bool", method "verify_biguint_le_uint64(byte[],uint64)bool", method "verify_biguint_gt(byte[],byte[])bool", method "verify_biguint_gt_uint64(byte[],uint64)bool", method "verify_biguint_ge(byte[],byte[])bool", method "verify_biguint_ge_uint64(byte[],uint64)bool" + bz __puya_arc4_router___bare_routing@60 + pushbytess 0x725c692b 0x17314559 0x53f34893 0x88c8b269 0xa464b7ab 0x9c8b11b8 0x6f40654e 0xec9a2974 0xc793708f 0x7ddb7499 0xa21c443d 0x6e7fb212 0xb007fcb0 0x2ebc20d4 0xb0954b66 0xdd140aef 0xace474da 0xba694990 0x6db581c0 0x91c8db89 0xdbe77158 0x9a0f22e1 0x64033d37 0x2a7237c5 0xe3a94458 0x42f87f7d 0x2b5542a4 0x9be2fbe9 0x1cd92515 0x64e1705c 0xf1271c50 0x2ab63b70 0x834bb7d2 0x531620d7 0x3fb9e769 0xfa8db0bc 0xa72ea485 0xb7b0ba19 0x74460c42 0xab320738 0x52ad4654 0x10156399 0x0f075957 0xbd843dff 0xb377d381 0x89767265 0x456b4b23 0x33d1b88c 0x6bf973ea 0x67cd6bb2 0x3f58805a 0x1e130039 0x509dc91d 0xa564a202 0x23650763 0xe007c10b // method "verify_uint64_init(byte[])uint64", method "verify_uint64_add(uint64,uint64)uint64", method "verify_uint64_sub(uint64,uint64)uint64", method "verify_uint64_mul(uint64,uint64)uint64", method "verify_uint64_div(uint64,uint64)uint64", method "verify_uint64_mod(uint64,uint64)uint64", method "verify_uint64_and(uint64,uint64)uint64", method "verify_uint64_or(uint64,uint64)uint64", method "verify_uint64_xor(uint64,uint64)uint64", method "verify_uint64_not(uint64)uint64", method "verify_uint64_lshift(uint64,uint64)uint64", method "verify_uint64_rshift(uint64,uint64)uint64", method "verify_uint64_pow(uint64,uint64)uint64", method "verify_uint64_eq(uint64,uint64)bool", method "verify_uint64_ne(uint64,uint64)bool", method "verify_uint64_lt(uint64,uint64)bool", method "verify_uint64_le(uint64,uint64)bool", method "verify_uint64_gt(uint64,uint64)bool", method "verify_uint64_ge(uint64,uint64)bool", method "verify_bytes_init(uint64)byte[]", method "verify_bytes_add(byte[],byte[],uint64,uint64)byte[]", method "verify_bytes_eq(byte[],byte[])bool", method "verify_bytes_ne(byte[],byte[])bool", method "verify_bytes_and(byte[],byte[])byte[]", method "verify_bytes_or(byte[],byte[])byte[]", method "verify_bytes_xor(byte[],byte[])byte[]", method "verify_bytes_not(byte[],uint64)byte[]", method "verify_biguint_add(byte[],byte[])byte[]", method "verify_biguint_add_uint64(byte[],uint64)byte[]", method "verify_biguint_sub(byte[],byte[])byte[]", method "verify_biguint_sub_uint64(byte[],uint64)byte[]", method "verify_biguint_mul(byte[],byte[])byte[]", method "verify_biguint_mul_uint64(byte[],uint64)byte[]", method "verify_biguint_div(byte[],byte[])byte[]", method "verify_biguint_div_uint64(byte[],uint64)byte[]", method "verify_biguint_mod(byte[],byte[])byte[]", method "verify_biguint_mod_uint64(byte[],uint64)byte[]", method "verify_biguint_and(byte[],byte[])byte[]", method "verify_biguint_and_uint64(byte[],uint64)byte[]", method "verify_biguint_or(byte[],byte[])byte[]", method "verify_biguint_or_uint64(byte[],uint64)byte[]", method "verify_biguint_xor(byte[],byte[])byte[]", method "verify_biguint_xor_uint64(byte[],uint64)byte[]", method "verify_biguint_eq(byte[],byte[])bool", method "verify_biguint_eq_uint64(byte[],uint64)bool", method "verify_biguint_ne(byte[],byte[])bool", method "verify_biguint_ne_uint64(byte[],uint64)bool", method "verify_biguint_lt(byte[],byte[])bool", method "verify_biguint_lt_uint64(byte[],uint64)bool", method "verify_biguint_le(byte[],byte[])bool", method "verify_biguint_le_uint64(byte[],uint64)bool", method "verify_biguint_gt(byte[],byte[])bool", method "verify_biguint_gt_uint64(byte[],uint64)bool", method "verify_biguint_ge(byte[],byte[])bool", method "verify_biguint_ge_uint64(byte[],uint64)bool", method "verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[])void" txna ApplicationArgs 0 - match __puya_arc4_router___verify_uint64_init_route@2 __puya_arc4_router___verify_uint64_add_route@3 __puya_arc4_router___verify_uint64_sub_route@4 __puya_arc4_router___verify_uint64_mul_route@5 __puya_arc4_router___verify_uint64_div_route@6 __puya_arc4_router___verify_uint64_mod_route@7 __puya_arc4_router___verify_uint64_and_route@8 __puya_arc4_router___verify_uint64_or_route@9 __puya_arc4_router___verify_uint64_xor_route@10 __puya_arc4_router___verify_uint64_not_route@11 __puya_arc4_router___verify_uint64_lshift_route@12 __puya_arc4_router___verify_uint64_rshift_route@13 __puya_arc4_router___verify_uint64_pow_route@14 __puya_arc4_router___verify_uint64_eq_route@15 __puya_arc4_router___verify_uint64_ne_route@16 __puya_arc4_router___verify_uint64_lt_route@17 __puya_arc4_router___verify_uint64_le_route@18 __puya_arc4_router___verify_uint64_gt_route@19 __puya_arc4_router___verify_uint64_ge_route@20 __puya_arc4_router___verify_bytes_init_route@21 __puya_arc4_router___verify_bytes_add_route@22 __puya_arc4_router___verify_bytes_eq_route@23 __puya_arc4_router___verify_bytes_ne_route@24 __puya_arc4_router___verify_bytes_and_route@25 __puya_arc4_router___verify_bytes_or_route@26 __puya_arc4_router___verify_bytes_xor_route@27 __puya_arc4_router___verify_bytes_not_route@28 __puya_arc4_router___verify_biguint_add_route@29 __puya_arc4_router___verify_biguint_add_uint64_route@30 __puya_arc4_router___verify_biguint_sub_route@31 __puya_arc4_router___verify_biguint_sub_uint64_route@32 __puya_arc4_router___verify_biguint_mul_route@33 __puya_arc4_router___verify_biguint_mul_uint64_route@34 __puya_arc4_router___verify_biguint_div_route@35 __puya_arc4_router___verify_biguint_div_uint64_route@36 __puya_arc4_router___verify_biguint_mod_route@37 __puya_arc4_router___verify_biguint_mod_uint64_route@38 __puya_arc4_router___verify_biguint_and_route@39 __puya_arc4_router___verify_biguint_and_uint64_route@40 __puya_arc4_router___verify_biguint_or_route@41 __puya_arc4_router___verify_biguint_or_uint64_route@42 __puya_arc4_router___verify_biguint_xor_route@43 __puya_arc4_router___verify_biguint_xor_uint64_route@44 __puya_arc4_router___verify_biguint_eq_route@45 __puya_arc4_router___verify_biguint_eq_uint64_route@46 __puya_arc4_router___verify_biguint_ne_route@47 __puya_arc4_router___verify_biguint_ne_uint64_route@48 __puya_arc4_router___verify_biguint_lt_route@49 __puya_arc4_router___verify_biguint_lt_uint64_route@50 __puya_arc4_router___verify_biguint_le_route@51 __puya_arc4_router___verify_biguint_le_uint64_route@52 __puya_arc4_router___verify_biguint_gt_route@53 __puya_arc4_router___verify_biguint_gt_uint64_route@54 __puya_arc4_router___verify_biguint_ge_route@55 __puya_arc4_router___verify_biguint_ge_uint64_route@56 + match __puya_arc4_router___verify_uint64_init_route@2 __puya_arc4_router___verify_uint64_add_route@3 __puya_arc4_router___verify_uint64_sub_route@4 __puya_arc4_router___verify_uint64_mul_route@5 __puya_arc4_router___verify_uint64_div_route@6 __puya_arc4_router___verify_uint64_mod_route@7 __puya_arc4_router___verify_uint64_and_route@8 __puya_arc4_router___verify_uint64_or_route@9 __puya_arc4_router___verify_uint64_xor_route@10 __puya_arc4_router___verify_uint64_not_route@11 __puya_arc4_router___verify_uint64_lshift_route@12 __puya_arc4_router___verify_uint64_rshift_route@13 __puya_arc4_router___verify_uint64_pow_route@14 __puya_arc4_router___verify_uint64_eq_route@15 __puya_arc4_router___verify_uint64_ne_route@16 __puya_arc4_router___verify_uint64_lt_route@17 __puya_arc4_router___verify_uint64_le_route@18 __puya_arc4_router___verify_uint64_gt_route@19 __puya_arc4_router___verify_uint64_ge_route@20 __puya_arc4_router___verify_bytes_init_route@21 __puya_arc4_router___verify_bytes_add_route@22 __puya_arc4_router___verify_bytes_eq_route@23 __puya_arc4_router___verify_bytes_ne_route@24 __puya_arc4_router___verify_bytes_and_route@25 __puya_arc4_router___verify_bytes_or_route@26 __puya_arc4_router___verify_bytes_xor_route@27 __puya_arc4_router___verify_bytes_not_route@28 __puya_arc4_router___verify_biguint_add_route@29 __puya_arc4_router___verify_biguint_add_uint64_route@30 __puya_arc4_router___verify_biguint_sub_route@31 __puya_arc4_router___verify_biguint_sub_uint64_route@32 __puya_arc4_router___verify_biguint_mul_route@33 __puya_arc4_router___verify_biguint_mul_uint64_route@34 __puya_arc4_router___verify_biguint_div_route@35 __puya_arc4_router___verify_biguint_div_uint64_route@36 __puya_arc4_router___verify_biguint_mod_route@37 __puya_arc4_router___verify_biguint_mod_uint64_route@38 __puya_arc4_router___verify_biguint_and_route@39 __puya_arc4_router___verify_biguint_and_uint64_route@40 __puya_arc4_router___verify_biguint_or_route@41 __puya_arc4_router___verify_biguint_or_uint64_route@42 __puya_arc4_router___verify_biguint_xor_route@43 __puya_arc4_router___verify_biguint_xor_uint64_route@44 __puya_arc4_router___verify_biguint_eq_route@45 __puya_arc4_router___verify_biguint_eq_uint64_route@46 __puya_arc4_router___verify_biguint_ne_route@47 __puya_arc4_router___verify_biguint_ne_uint64_route@48 __puya_arc4_router___verify_biguint_lt_route@49 __puya_arc4_router___verify_biguint_lt_uint64_route@50 __puya_arc4_router___verify_biguint_le_route@51 __puya_arc4_router___verify_biguint_le_uint64_route@52 __puya_arc4_router___verify_biguint_gt_route@53 __puya_arc4_router___verify_biguint_gt_uint64_route@54 __puya_arc4_router___verify_biguint_ge_route@55 __puya_arc4_router___verify_biguint_ge_uint64_route@56 __puya_arc4_router___verify_log_route@57 intc_1 // 0 retsub __puya_arc4_router___verify_uint64_init_route@2: - // tests/artifacts/primitive-ops/contract.algo.ts:4 + // tests/artifacts/primitive-ops/contract.algo.ts:5 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:4 + // tests/artifacts/primitive-ops/contract.algo.ts:5 // @arc4.abimethod() callsub verify_uint64_init itob @@ -44,20 +44,20 @@ __puya_arc4_router___verify_uint64_init_route@2: retsub __puya_arc4_router___verify_uint64_add_route@3: - // tests/artifacts/primitive-ops/contract.algo.ts:10 + // tests/artifacts/primitive-ops/contract.algo.ts:11 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:10 + // tests/artifacts/primitive-ops/contract.algo.ts:11 // @arc4.abimethod() callsub verify_uint64_add itob @@ -69,20 +69,20 @@ __puya_arc4_router___verify_uint64_add_route@3: retsub __puya_arc4_router___verify_uint64_sub_route@4: - // tests/artifacts/primitive-ops/contract.algo.ts:16 + // tests/artifacts/primitive-ops/contract.algo.ts:17 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:16 + // tests/artifacts/primitive-ops/contract.algo.ts:17 // @arc4.abimethod() callsub verify_uint64_sub itob @@ -94,20 +94,20 @@ __puya_arc4_router___verify_uint64_sub_route@4: retsub __puya_arc4_router___verify_uint64_mul_route@5: - // tests/artifacts/primitive-ops/contract.algo.ts:22 + // tests/artifacts/primitive-ops/contract.algo.ts:23 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:22 + // tests/artifacts/primitive-ops/contract.algo.ts:23 // @arc4.abimethod() callsub verify_uint64_mul itob @@ -119,20 +119,20 @@ __puya_arc4_router___verify_uint64_mul_route@5: retsub __puya_arc4_router___verify_uint64_div_route@6: - // tests/artifacts/primitive-ops/contract.algo.ts:28 + // tests/artifacts/primitive-ops/contract.algo.ts:29 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:28 + // tests/artifacts/primitive-ops/contract.algo.ts:29 // @arc4.abimethod() callsub verify_uint64_div itob @@ -144,20 +144,20 @@ __puya_arc4_router___verify_uint64_div_route@6: retsub __puya_arc4_router___verify_uint64_mod_route@7: - // tests/artifacts/primitive-ops/contract.algo.ts:34 + // tests/artifacts/primitive-ops/contract.algo.ts:35 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:34 + // tests/artifacts/primitive-ops/contract.algo.ts:35 // @arc4.abimethod() callsub verify_uint64_mod itob @@ -169,20 +169,20 @@ __puya_arc4_router___verify_uint64_mod_route@7: retsub __puya_arc4_router___verify_uint64_and_route@8: - // tests/artifacts/primitive-ops/contract.algo.ts:40 + // tests/artifacts/primitive-ops/contract.algo.ts:41 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:40 + // tests/artifacts/primitive-ops/contract.algo.ts:41 // @arc4.abimethod() callsub verify_uint64_and itob @@ -194,20 +194,20 @@ __puya_arc4_router___verify_uint64_and_route@8: retsub __puya_arc4_router___verify_uint64_or_route@9: - // tests/artifacts/primitive-ops/contract.algo.ts:46 + // tests/artifacts/primitive-ops/contract.algo.ts:47 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:46 + // tests/artifacts/primitive-ops/contract.algo.ts:47 // @arc4.abimethod() callsub verify_uint64_or itob @@ -219,20 +219,20 @@ __puya_arc4_router___verify_uint64_or_route@9: retsub __puya_arc4_router___verify_uint64_xor_route@10: - // tests/artifacts/primitive-ops/contract.algo.ts:52 + // tests/artifacts/primitive-ops/contract.algo.ts:53 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:52 + // tests/artifacts/primitive-ops/contract.algo.ts:53 // @arc4.abimethod() callsub verify_uint64_xor itob @@ -244,18 +244,18 @@ __puya_arc4_router___verify_uint64_xor_route@10: retsub __puya_arc4_router___verify_uint64_not_route@11: - // tests/artifacts/primitive-ops/contract.algo.ts:58 + // tests/artifacts/primitive-ops/contract.algo.ts:59 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:58 + // tests/artifacts/primitive-ops/contract.algo.ts:59 // @arc4.abimethod() callsub verify_uint64_not itob @@ -267,20 +267,20 @@ __puya_arc4_router___verify_uint64_not_route@11: retsub __puya_arc4_router___verify_uint64_lshift_route@12: - // tests/artifacts/primitive-ops/contract.algo.ts:64 + // tests/artifacts/primitive-ops/contract.algo.ts:65 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:64 + // tests/artifacts/primitive-ops/contract.algo.ts:65 // @arc4.abimethod() callsub verify_uint64_lshift itob @@ -292,20 +292,20 @@ __puya_arc4_router___verify_uint64_lshift_route@12: retsub __puya_arc4_router___verify_uint64_rshift_route@13: - // tests/artifacts/primitive-ops/contract.algo.ts:70 + // tests/artifacts/primitive-ops/contract.algo.ts:71 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:70 + // tests/artifacts/primitive-ops/contract.algo.ts:71 // @arc4.abimethod() callsub verify_uint64_rshift itob @@ -317,20 +317,20 @@ __puya_arc4_router___verify_uint64_rshift_route@13: retsub __puya_arc4_router___verify_uint64_pow_route@14: - // tests/artifacts/primitive-ops/contract.algo.ts:76 + // tests/artifacts/primitive-ops/contract.algo.ts:77 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:76 + // tests/artifacts/primitive-ops/contract.algo.ts:77 // @arc4.abimethod() callsub verify_uint64_pow itob @@ -342,20 +342,20 @@ __puya_arc4_router___verify_uint64_pow_route@14: retsub __puya_arc4_router___verify_uint64_eq_route@15: - // tests/artifacts/primitive-ops/contract.algo.ts:82 + // tests/artifacts/primitive-ops/contract.algo.ts:83 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:82 + // tests/artifacts/primitive-ops/contract.algo.ts:83 // @arc4.abimethod() callsub verify_uint64_eq bytec_1 // 0x00 @@ -370,20 +370,20 @@ __puya_arc4_router___verify_uint64_eq_route@15: retsub __puya_arc4_router___verify_uint64_ne_route@16: - // tests/artifacts/primitive-ops/contract.algo.ts:88 + // tests/artifacts/primitive-ops/contract.algo.ts:89 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:88 + // tests/artifacts/primitive-ops/contract.algo.ts:89 // @arc4.abimethod() callsub verify_uint64_ne bytec_1 // 0x00 @@ -398,20 +398,20 @@ __puya_arc4_router___verify_uint64_ne_route@16: retsub __puya_arc4_router___verify_uint64_lt_route@17: - // tests/artifacts/primitive-ops/contract.algo.ts:94 + // tests/artifacts/primitive-ops/contract.algo.ts:95 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:94 + // tests/artifacts/primitive-ops/contract.algo.ts:95 // @arc4.abimethod() callsub verify_uint64_lt bytec_1 // 0x00 @@ -426,20 +426,20 @@ __puya_arc4_router___verify_uint64_lt_route@17: retsub __puya_arc4_router___verify_uint64_le_route@18: - // tests/artifacts/primitive-ops/contract.algo.ts:100 + // tests/artifacts/primitive-ops/contract.algo.ts:101 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:100 + // tests/artifacts/primitive-ops/contract.algo.ts:101 // @arc4.abimethod() callsub verify_uint64_le bytec_1 // 0x00 @@ -454,20 +454,20 @@ __puya_arc4_router___verify_uint64_le_route@18: retsub __puya_arc4_router___verify_uint64_gt_route@19: - // tests/artifacts/primitive-ops/contract.algo.ts:106 + // tests/artifacts/primitive-ops/contract.algo.ts:107 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:106 + // tests/artifacts/primitive-ops/contract.algo.ts:107 // @arc4.abimethod() callsub verify_uint64_gt bytec_1 // 0x00 @@ -482,20 +482,20 @@ __puya_arc4_router___verify_uint64_gt_route@19: retsub __puya_arc4_router___verify_uint64_ge_route@20: - // tests/artifacts/primitive-ops/contract.algo.ts:112 + // tests/artifacts/primitive-ops/contract.algo.ts:113 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:112 + // tests/artifacts/primitive-ops/contract.algo.ts:113 // @arc4.abimethod() callsub verify_uint64_ge bytec_1 // 0x00 @@ -510,18 +510,18 @@ __puya_arc4_router___verify_uint64_ge_route@20: retsub __puya_arc4_router___verify_bytes_init_route@21: - // tests/artifacts/primitive-ops/contract.algo.ts:118 + // tests/artifacts/primitive-ops/contract.algo.ts:119 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:118 + // tests/artifacts/primitive-ops/contract.algo.ts:119 // @arc4.abimethod() callsub verify_bytes_init dup @@ -538,14 +538,14 @@ __puya_arc4_router___verify_bytes_init_route@21: retsub __puya_arc4_router___verify_bytes_add_route@22: - // tests/artifacts/primitive-ops/contract.algo.ts:124 + // tests/artifacts/primitive-ops/contract.algo.ts:125 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 @@ -555,7 +555,7 @@ __puya_arc4_router___verify_bytes_add_route@22: btoi txna ApplicationArgs 4 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:124 + // tests/artifacts/primitive-ops/contract.algo.ts:125 // @arc4.abimethod() callsub verify_bytes_add dup @@ -572,20 +572,20 @@ __puya_arc4_router___verify_bytes_add_route@22: retsub __puya_arc4_router___verify_bytes_eq_route@23: - // tests/artifacts/primitive-ops/contract.algo.ts:133 + // tests/artifacts/primitive-ops/contract.algo.ts:134 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:133 + // tests/artifacts/primitive-ops/contract.algo.ts:134 // @arc4.abimethod() callsub verify_bytes_eq bytec_1 // 0x00 @@ -600,20 +600,20 @@ __puya_arc4_router___verify_bytes_eq_route@23: retsub __puya_arc4_router___verify_bytes_ne_route@24: - // tests/artifacts/primitive-ops/contract.algo.ts:139 + // tests/artifacts/primitive-ops/contract.algo.ts:140 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:139 + // tests/artifacts/primitive-ops/contract.algo.ts:140 // @arc4.abimethod() callsub verify_bytes_ne bytec_1 // 0x00 @@ -628,20 +628,20 @@ __puya_arc4_router___verify_bytes_ne_route@24: retsub __puya_arc4_router___verify_bytes_and_route@25: - // tests/artifacts/primitive-ops/contract.algo.ts:145 + // tests/artifacts/primitive-ops/contract.algo.ts:146 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:145 + // tests/artifacts/primitive-ops/contract.algo.ts:146 // @arc4.abimethod() callsub verify_bytes_and dup @@ -658,20 +658,20 @@ __puya_arc4_router___verify_bytes_and_route@25: retsub __puya_arc4_router___verify_bytes_or_route@26: - // tests/artifacts/primitive-ops/contract.algo.ts:151 + // tests/artifacts/primitive-ops/contract.algo.ts:152 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:151 + // tests/artifacts/primitive-ops/contract.algo.ts:152 // @arc4.abimethod() callsub verify_bytes_or dup @@ -688,20 +688,20 @@ __puya_arc4_router___verify_bytes_or_route@26: retsub __puya_arc4_router___verify_bytes_xor_route@27: - // tests/artifacts/primitive-ops/contract.algo.ts:157 + // tests/artifacts/primitive-ops/contract.algo.ts:158 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:157 + // tests/artifacts/primitive-ops/contract.algo.ts:158 // @arc4.abimethod() callsub verify_bytes_xor dup @@ -718,20 +718,20 @@ __puya_arc4_router___verify_bytes_xor_route@27: retsub __puya_arc4_router___verify_bytes_not_route@28: - // tests/artifacts/primitive-ops/contract.algo.ts:163 + // tests/artifacts/primitive-ops/contract.algo.ts:164 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:163 + // tests/artifacts/primitive-ops/contract.algo.ts:164 // @arc4.abimethod() callsub verify_bytes_not dup @@ -748,20 +748,20 @@ __puya_arc4_router___verify_bytes_not_route@28: retsub __puya_arc4_router___verify_biguint_add_route@29: - // tests/artifacts/primitive-ops/contract.algo.ts:171 + // tests/artifacts/primitive-ops/contract.algo.ts:172 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:171 + // tests/artifacts/primitive-ops/contract.algo.ts:172 // @arc4.abimethod() callsub verify_biguint_add dup @@ -778,20 +778,20 @@ __puya_arc4_router___verify_biguint_add_route@29: retsub __puya_arc4_router___verify_biguint_add_uint64_route@30: - // tests/artifacts/primitive-ops/contract.algo.ts:179 + // tests/artifacts/primitive-ops/contract.algo.ts:180 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:179 + // tests/artifacts/primitive-ops/contract.algo.ts:180 // @arc4.abimethod() callsub verify_biguint_add_uint64 dup @@ -808,20 +808,20 @@ __puya_arc4_router___verify_biguint_add_uint64_route@30: retsub __puya_arc4_router___verify_biguint_sub_route@31: - // tests/artifacts/primitive-ops/contract.algo.ts:187 + // tests/artifacts/primitive-ops/contract.algo.ts:188 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:187 + // tests/artifacts/primitive-ops/contract.algo.ts:188 // @arc4.abimethod() callsub verify_biguint_sub dup @@ -838,20 +838,20 @@ __puya_arc4_router___verify_biguint_sub_route@31: retsub __puya_arc4_router___verify_biguint_sub_uint64_route@32: - // tests/artifacts/primitive-ops/contract.algo.ts:195 + // tests/artifacts/primitive-ops/contract.algo.ts:196 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:195 + // tests/artifacts/primitive-ops/contract.algo.ts:196 // @arc4.abimethod() callsub verify_biguint_sub_uint64 dup @@ -868,20 +868,20 @@ __puya_arc4_router___verify_biguint_sub_uint64_route@32: retsub __puya_arc4_router___verify_biguint_mul_route@33: - // tests/artifacts/primitive-ops/contract.algo.ts:203 + // tests/artifacts/primitive-ops/contract.algo.ts:204 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:203 + // tests/artifacts/primitive-ops/contract.algo.ts:204 // @arc4.abimethod() callsub verify_biguint_mul dup @@ -898,20 +898,20 @@ __puya_arc4_router___verify_biguint_mul_route@33: retsub __puya_arc4_router___verify_biguint_mul_uint64_route@34: - // tests/artifacts/primitive-ops/contract.algo.ts:211 + // tests/artifacts/primitive-ops/contract.algo.ts:212 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:211 + // tests/artifacts/primitive-ops/contract.algo.ts:212 // @arc4.abimethod() callsub verify_biguint_mul_uint64 dup @@ -928,20 +928,20 @@ __puya_arc4_router___verify_biguint_mul_uint64_route@34: retsub __puya_arc4_router___verify_biguint_div_route@35: - // tests/artifacts/primitive-ops/contract.algo.ts:219 + // tests/artifacts/primitive-ops/contract.algo.ts:220 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:219 + // tests/artifacts/primitive-ops/contract.algo.ts:220 // @arc4.abimethod() callsub verify_biguint_div dup @@ -958,20 +958,20 @@ __puya_arc4_router___verify_biguint_div_route@35: retsub __puya_arc4_router___verify_biguint_div_uint64_route@36: - // tests/artifacts/primitive-ops/contract.algo.ts:227 + // tests/artifacts/primitive-ops/contract.algo.ts:228 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:227 + // tests/artifacts/primitive-ops/contract.algo.ts:228 // @arc4.abimethod() callsub verify_biguint_div_uint64 dup @@ -988,20 +988,20 @@ __puya_arc4_router___verify_biguint_div_uint64_route@36: retsub __puya_arc4_router___verify_biguint_mod_route@37: - // tests/artifacts/primitive-ops/contract.algo.ts:235 + // tests/artifacts/primitive-ops/contract.algo.ts:236 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:235 + // tests/artifacts/primitive-ops/contract.algo.ts:236 // @arc4.abimethod() callsub verify_biguint_mod dup @@ -1018,20 +1018,20 @@ __puya_arc4_router___verify_biguint_mod_route@37: retsub __puya_arc4_router___verify_biguint_mod_uint64_route@38: - // tests/artifacts/primitive-ops/contract.algo.ts:243 + // tests/artifacts/primitive-ops/contract.algo.ts:244 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:243 + // tests/artifacts/primitive-ops/contract.algo.ts:244 // @arc4.abimethod() callsub verify_biguint_mod_uint64 dup @@ -1048,20 +1048,20 @@ __puya_arc4_router___verify_biguint_mod_uint64_route@38: retsub __puya_arc4_router___verify_biguint_and_route@39: - // tests/artifacts/primitive-ops/contract.algo.ts:251 + // tests/artifacts/primitive-ops/contract.algo.ts:252 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:251 + // tests/artifacts/primitive-ops/contract.algo.ts:252 // @arc4.abimethod() callsub verify_biguint_and dup @@ -1078,20 +1078,20 @@ __puya_arc4_router___verify_biguint_and_route@39: retsub __puya_arc4_router___verify_biguint_and_uint64_route@40: - // tests/artifacts/primitive-ops/contract.algo.ts:259 + // tests/artifacts/primitive-ops/contract.algo.ts:260 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:259 + // tests/artifacts/primitive-ops/contract.algo.ts:260 // @arc4.abimethod() callsub verify_biguint_and_uint64 dup @@ -1108,20 +1108,20 @@ __puya_arc4_router___verify_biguint_and_uint64_route@40: retsub __puya_arc4_router___verify_biguint_or_route@41: - // tests/artifacts/primitive-ops/contract.algo.ts:267 + // tests/artifacts/primitive-ops/contract.algo.ts:268 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:267 + // tests/artifacts/primitive-ops/contract.algo.ts:268 // @arc4.abimethod() callsub verify_biguint_or dup @@ -1138,20 +1138,20 @@ __puya_arc4_router___verify_biguint_or_route@41: retsub __puya_arc4_router___verify_biguint_or_uint64_route@42: - // tests/artifacts/primitive-ops/contract.algo.ts:275 + // tests/artifacts/primitive-ops/contract.algo.ts:276 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:275 + // tests/artifacts/primitive-ops/contract.algo.ts:276 // @arc4.abimethod() callsub verify_biguint_or_uint64 dup @@ -1168,20 +1168,20 @@ __puya_arc4_router___verify_biguint_or_uint64_route@42: retsub __puya_arc4_router___verify_biguint_xor_route@43: - // tests/artifacts/primitive-ops/contract.algo.ts:283 + // tests/artifacts/primitive-ops/contract.algo.ts:284 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:283 + // tests/artifacts/primitive-ops/contract.algo.ts:284 // @arc4.abimethod() callsub verify_biguint_xor dup @@ -1198,20 +1198,20 @@ __puya_arc4_router___verify_biguint_xor_route@43: retsub __puya_arc4_router___verify_biguint_xor_uint64_route@44: - // tests/artifacts/primitive-ops/contract.algo.ts:291 + // tests/artifacts/primitive-ops/contract.algo.ts:292 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:291 + // tests/artifacts/primitive-ops/contract.algo.ts:292 // @arc4.abimethod() callsub verify_biguint_xor_uint64 dup @@ -1228,20 +1228,20 @@ __puya_arc4_router___verify_biguint_xor_uint64_route@44: retsub __puya_arc4_router___verify_biguint_eq_route@45: - // tests/artifacts/primitive-ops/contract.algo.ts:299 + // tests/artifacts/primitive-ops/contract.algo.ts:300 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:299 + // tests/artifacts/primitive-ops/contract.algo.ts:300 // @arc4.abimethod() callsub verify_biguint_eq bytec_1 // 0x00 @@ -1256,20 +1256,20 @@ __puya_arc4_router___verify_biguint_eq_route@45: retsub __puya_arc4_router___verify_biguint_eq_uint64_route@46: - // tests/artifacts/primitive-ops/contract.algo.ts:307 + // tests/artifacts/primitive-ops/contract.algo.ts:308 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:307 + // tests/artifacts/primitive-ops/contract.algo.ts:308 // @arc4.abimethod() callsub verify_biguint_eq_uint64 bytec_1 // 0x00 @@ -1284,20 +1284,20 @@ __puya_arc4_router___verify_biguint_eq_uint64_route@46: retsub __puya_arc4_router___verify_biguint_ne_route@47: - // tests/artifacts/primitive-ops/contract.algo.ts:314 + // tests/artifacts/primitive-ops/contract.algo.ts:315 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:314 + // tests/artifacts/primitive-ops/contract.algo.ts:315 // @arc4.abimethod() callsub verify_biguint_ne bytec_1 // 0x00 @@ -1312,20 +1312,20 @@ __puya_arc4_router___verify_biguint_ne_route@47: retsub __puya_arc4_router___verify_biguint_ne_uint64_route@48: - // tests/artifacts/primitive-ops/contract.algo.ts:322 + // tests/artifacts/primitive-ops/contract.algo.ts:323 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:322 + // tests/artifacts/primitive-ops/contract.algo.ts:323 // @arc4.abimethod() callsub verify_biguint_ne_uint64 bytec_1 // 0x00 @@ -1340,20 +1340,20 @@ __puya_arc4_router___verify_biguint_ne_uint64_route@48: retsub __puya_arc4_router___verify_biguint_lt_route@49: - // tests/artifacts/primitive-ops/contract.algo.ts:329 + // tests/artifacts/primitive-ops/contract.algo.ts:330 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:329 + // tests/artifacts/primitive-ops/contract.algo.ts:330 // @arc4.abimethod() callsub verify_biguint_lt bytec_1 // 0x00 @@ -1368,20 +1368,20 @@ __puya_arc4_router___verify_biguint_lt_route@49: retsub __puya_arc4_router___verify_biguint_lt_uint64_route@50: - // tests/artifacts/primitive-ops/contract.algo.ts:337 + // tests/artifacts/primitive-ops/contract.algo.ts:338 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:337 + // tests/artifacts/primitive-ops/contract.algo.ts:338 // @arc4.abimethod() callsub verify_biguint_lt_uint64 bytec_1 // 0x00 @@ -1396,20 +1396,20 @@ __puya_arc4_router___verify_biguint_lt_uint64_route@50: retsub __puya_arc4_router___verify_biguint_le_route@51: - // tests/artifacts/primitive-ops/contract.algo.ts:345 + // tests/artifacts/primitive-ops/contract.algo.ts:346 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:345 + // tests/artifacts/primitive-ops/contract.algo.ts:346 // @arc4.abimethod() callsub verify_biguint_le bytec_1 // 0x00 @@ -1424,20 +1424,20 @@ __puya_arc4_router___verify_biguint_le_route@51: retsub __puya_arc4_router___verify_biguint_le_uint64_route@52: - // tests/artifacts/primitive-ops/contract.algo.ts:353 + // tests/artifacts/primitive-ops/contract.algo.ts:354 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:353 + // tests/artifacts/primitive-ops/contract.algo.ts:354 // @arc4.abimethod() callsub verify_biguint_le_uint64 bytec_1 // 0x00 @@ -1452,20 +1452,20 @@ __puya_arc4_router___verify_biguint_le_uint64_route@52: retsub __puya_arc4_router___verify_biguint_gt_route@53: - // tests/artifacts/primitive-ops/contract.algo.ts:361 + // tests/artifacts/primitive-ops/contract.algo.ts:362 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:361 + // tests/artifacts/primitive-ops/contract.algo.ts:362 // @arc4.abimethod() callsub verify_biguint_gt bytec_1 // 0x00 @@ -1480,20 +1480,20 @@ __puya_arc4_router___verify_biguint_gt_route@53: retsub __puya_arc4_router___verify_biguint_gt_uint64_route@54: - // tests/artifacts/primitive-ops/contract.algo.ts:369 + // tests/artifacts/primitive-ops/contract.algo.ts:370 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:369 + // tests/artifacts/primitive-ops/contract.algo.ts:370 // @arc4.abimethod() callsub verify_biguint_gt_uint64 bytec_1 // 0x00 @@ -1508,20 +1508,20 @@ __puya_arc4_router___verify_biguint_gt_uint64_route@54: retsub __puya_arc4_router___verify_biguint_ge_route@55: - // tests/artifacts/primitive-ops/contract.algo.ts:377 + // tests/artifacts/primitive-ops/contract.algo.ts:378 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/primitive-ops/contract.algo.ts:377 + // tests/artifacts/primitive-ops/contract.algo.ts:378 // @arc4.abimethod() callsub verify_biguint_ge bytec_1 // 0x00 @@ -1536,20 +1536,20 @@ __puya_arc4_router___verify_biguint_ge_route@55: retsub __puya_arc4_router___verify_biguint_ge_uint64_route@56: - // tests/artifacts/primitive-ops/contract.algo.ts:385 + // tests/artifacts/primitive-ops/contract.algo.ts:386 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/primitive-ops/contract.algo.ts:3 + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:385 + // tests/artifacts/primitive-ops/contract.algo.ts:386 // @arc4.abimethod() callsub verify_biguint_ge_uint64 bytec_1 // 0x00 @@ -1563,19 +1563,55 @@ __puya_arc4_router___verify_biguint_ge_uint64_route@56: intc_0 // 1 retsub -__puya_arc4_router___bare_routing@59: - // tests/artifacts/primitive-ops/contract.algo.ts:3 +__puya_arc4_router___verify_log_route@57: + // tests/artifacts/primitive-ops/contract.algo.ts:395 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/primitive-ops/contract.algo.ts:4 + // export class PrimitiveOpsContract extends arc4.Contract { + txna ApplicationArgs 1 + extract 2 0 + txna ApplicationArgs 2 + btoi + txna ApplicationArgs 3 + extract 2 0 + txna ApplicationArgs 4 + extract 2 0 + txna ApplicationArgs 5 + txna ApplicationArgs 6 + txna ApplicationArgs 7 + txna ApplicationArgs 8 + txna ApplicationArgs 9 + txna ApplicationArgs 10 + txna ApplicationArgs 11 + extract 2 0 + txna ApplicationArgs 12 + extract 2 0 + txna ApplicationArgs 13 + extract 2 0 + // tests/artifacts/primitive-ops/contract.algo.ts:395 + // @arc4.abimethod() + callsub verify_log + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@60: + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { txn OnCompletion - bnz __puya_arc4_router___after_if_else@63 + bnz __puya_arc4_router___after_if_else@64 txn ApplicationID ! - assert // is creating + assert // can only call when creating intc_0 // 1 retsub -__puya_arc4_router___after_if_else@63: - // tests/artifacts/primitive-ops/contract.algo.ts:3 +__puya_arc4_router___after_if_else@64: + // tests/artifacts/primitive-ops/contract.algo.ts:4 // export class PrimitiveOpsContract extends arc4.Contract { intc_1 // 0 retsub @@ -1583,937 +1619,990 @@ __puya_arc4_router___after_if_else@63: // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_init(raw_value: bytes) -> uint64: verify_uint64_init: - // tests/artifacts/primitive-ops/contract.algo.ts:4-5 + // tests/artifacts/primitive-ops/contract.algo.ts:5-6 // @arc4.abimethod() // public verify_uint64_init(raw_value: bytes): uint64 { proto 1 1 - // tests/artifacts/primitive-ops/contract.algo.ts:6 + // tests/artifacts/primitive-ops/contract.algo.ts:7 // const result = op.btoi(raw_value) frame_dig -1 btoi - // tests/artifacts/primitive-ops/contract.algo.ts:7 + // tests/artifacts/primitive-ops/contract.algo.ts:8 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_add(a: uint64, b: uint64) -> uint64: verify_uint64_add: - // tests/artifacts/primitive-ops/contract.algo.ts:10-11 + // tests/artifacts/primitive-ops/contract.algo.ts:11-12 // @arc4.abimethod() // public verify_uint64_add(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:12 + // tests/artifacts/primitive-ops/contract.algo.ts:13 // const result: uint64 = a + b frame_dig -2 frame_dig -1 + - // tests/artifacts/primitive-ops/contract.algo.ts:13 + // tests/artifacts/primitive-ops/contract.algo.ts:14 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_sub(a: uint64, b: uint64) -> uint64: verify_uint64_sub: - // tests/artifacts/primitive-ops/contract.algo.ts:16-17 + // tests/artifacts/primitive-ops/contract.algo.ts:17-18 // @arc4.abimethod() // public verify_uint64_sub(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:18 + // tests/artifacts/primitive-ops/contract.algo.ts:19 // const result: uint64 = a - b frame_dig -2 frame_dig -1 - - // tests/artifacts/primitive-ops/contract.algo.ts:19 + // tests/artifacts/primitive-ops/contract.algo.ts:20 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_mul(a: uint64, b: uint64) -> uint64: verify_uint64_mul: - // tests/artifacts/primitive-ops/contract.algo.ts:22-23 + // tests/artifacts/primitive-ops/contract.algo.ts:23-24 // @arc4.abimethod() // public verify_uint64_mul(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:24 + // tests/artifacts/primitive-ops/contract.algo.ts:25 // const result: uint64 = a * b frame_dig -2 frame_dig -1 * - // tests/artifacts/primitive-ops/contract.algo.ts:25 + // tests/artifacts/primitive-ops/contract.algo.ts:26 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_div(a: uint64, b: uint64) -> uint64: verify_uint64_div: - // tests/artifacts/primitive-ops/contract.algo.ts:28-29 + // tests/artifacts/primitive-ops/contract.algo.ts:29-30 // @arc4.abimethod() // public verify_uint64_div(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:30 + // tests/artifacts/primitive-ops/contract.algo.ts:31 // const result: uint64 = a / b frame_dig -2 frame_dig -1 / - // tests/artifacts/primitive-ops/contract.algo.ts:31 + // tests/artifacts/primitive-ops/contract.algo.ts:32 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_mod(a: uint64, b: uint64) -> uint64: verify_uint64_mod: - // tests/artifacts/primitive-ops/contract.algo.ts:34-35 + // tests/artifacts/primitive-ops/contract.algo.ts:35-36 // @arc4.abimethod() // public verify_uint64_mod(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:36 + // tests/artifacts/primitive-ops/contract.algo.ts:37 // const result: uint64 = a % b frame_dig -2 frame_dig -1 % - // tests/artifacts/primitive-ops/contract.algo.ts:37 + // tests/artifacts/primitive-ops/contract.algo.ts:38 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_and(a: uint64, b: uint64) -> uint64: verify_uint64_and: - // tests/artifacts/primitive-ops/contract.algo.ts:40-41 + // tests/artifacts/primitive-ops/contract.algo.ts:41-42 // @arc4.abimethod() // public verify_uint64_and(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:42 + // tests/artifacts/primitive-ops/contract.algo.ts:43 // const result: uint64 = a & b frame_dig -2 frame_dig -1 & - // tests/artifacts/primitive-ops/contract.algo.ts:43 + // tests/artifacts/primitive-ops/contract.algo.ts:44 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_or(a: uint64, b: uint64) -> uint64: verify_uint64_or: - // tests/artifacts/primitive-ops/contract.algo.ts:46-47 + // tests/artifacts/primitive-ops/contract.algo.ts:47-48 // @arc4.abimethod() // public verify_uint64_or(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:48 + // tests/artifacts/primitive-ops/contract.algo.ts:49 // const result: uint64 = a | b frame_dig -2 frame_dig -1 | - // tests/artifacts/primitive-ops/contract.algo.ts:49 + // tests/artifacts/primitive-ops/contract.algo.ts:50 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_xor(a: uint64, b: uint64) -> uint64: verify_uint64_xor: - // tests/artifacts/primitive-ops/contract.algo.ts:52-53 + // tests/artifacts/primitive-ops/contract.algo.ts:53-54 // @arc4.abimethod() // public verify_uint64_xor(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:54 + // tests/artifacts/primitive-ops/contract.algo.ts:55 // const result: uint64 = a ^ b frame_dig -2 frame_dig -1 ^ - // tests/artifacts/primitive-ops/contract.algo.ts:55 + // tests/artifacts/primitive-ops/contract.algo.ts:56 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_not(a: uint64) -> uint64: verify_uint64_not: - // tests/artifacts/primitive-ops/contract.algo.ts:58-59 + // tests/artifacts/primitive-ops/contract.algo.ts:59-60 // @arc4.abimethod() // public verify_uint64_not(a: uint64): uint64 { proto 1 1 - // tests/artifacts/primitive-ops/contract.algo.ts:60 + // tests/artifacts/primitive-ops/contract.algo.ts:61 // const result: uint64 = ~a frame_dig -1 ~ - // tests/artifacts/primitive-ops/contract.algo.ts:61 + // tests/artifacts/primitive-ops/contract.algo.ts:62 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_lshift(a: uint64, b: uint64) -> uint64: verify_uint64_lshift: - // tests/artifacts/primitive-ops/contract.algo.ts:64-65 + // tests/artifacts/primitive-ops/contract.algo.ts:65-66 // @arc4.abimethod() // public verify_uint64_lshift(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:66 + // tests/artifacts/primitive-ops/contract.algo.ts:67 // const result: uint64 = a << b frame_dig -2 frame_dig -1 shl - // tests/artifacts/primitive-ops/contract.algo.ts:67 + // tests/artifacts/primitive-ops/contract.algo.ts:68 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_rshift(a: uint64, b: uint64) -> uint64: verify_uint64_rshift: - // tests/artifacts/primitive-ops/contract.algo.ts:70-71 + // tests/artifacts/primitive-ops/contract.algo.ts:71-72 // @arc4.abimethod() // public verify_uint64_rshift(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:72 + // tests/artifacts/primitive-ops/contract.algo.ts:73 // const result: uint64 = a >> b frame_dig -2 frame_dig -1 shr - // tests/artifacts/primitive-ops/contract.algo.ts:73 + // tests/artifacts/primitive-ops/contract.algo.ts:74 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_pow(a: uint64, b: uint64) -> uint64: verify_uint64_pow: - // tests/artifacts/primitive-ops/contract.algo.ts:76-77 + // tests/artifacts/primitive-ops/contract.algo.ts:77-78 // @arc4.abimethod() // public verify_uint64_pow(a: uint64, b: uint64): uint64 { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:78 + // tests/artifacts/primitive-ops/contract.algo.ts:79 // const result: uint64 = a ** b frame_dig -2 frame_dig -1 exp - // tests/artifacts/primitive-ops/contract.algo.ts:79 + // tests/artifacts/primitive-ops/contract.algo.ts:80 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_eq(a: uint64, b: uint64) -> uint64: verify_uint64_eq: - // tests/artifacts/primitive-ops/contract.algo.ts:82-83 + // tests/artifacts/primitive-ops/contract.algo.ts:83-84 // @arc4.abimethod() // public verify_uint64_eq(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:84 + // tests/artifacts/primitive-ops/contract.algo.ts:85 // const result = a === b frame_dig -2 frame_dig -1 == - // tests/artifacts/primitive-ops/contract.algo.ts:85 + // tests/artifacts/primitive-ops/contract.algo.ts:86 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_ne(a: uint64, b: uint64) -> uint64: verify_uint64_ne: - // tests/artifacts/primitive-ops/contract.algo.ts:88-89 + // tests/artifacts/primitive-ops/contract.algo.ts:89-90 // @arc4.abimethod() // public verify_uint64_ne(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:90 + // tests/artifacts/primitive-ops/contract.algo.ts:91 // const result = a !== b frame_dig -2 frame_dig -1 != - // tests/artifacts/primitive-ops/contract.algo.ts:91 + // tests/artifacts/primitive-ops/contract.algo.ts:92 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_lt(a: uint64, b: uint64) -> uint64: verify_uint64_lt: - // tests/artifacts/primitive-ops/contract.algo.ts:94-95 + // tests/artifacts/primitive-ops/contract.algo.ts:95-96 // @arc4.abimethod() // public verify_uint64_lt(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:96 + // tests/artifacts/primitive-ops/contract.algo.ts:97 // const result = a < b frame_dig -2 frame_dig -1 < - // tests/artifacts/primitive-ops/contract.algo.ts:97 + // tests/artifacts/primitive-ops/contract.algo.ts:98 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_le(a: uint64, b: uint64) -> uint64: verify_uint64_le: - // tests/artifacts/primitive-ops/contract.algo.ts:100-101 + // tests/artifacts/primitive-ops/contract.algo.ts:101-102 // @arc4.abimethod() // public verify_uint64_le(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:102 + // tests/artifacts/primitive-ops/contract.algo.ts:103 // const result = a <= b frame_dig -2 frame_dig -1 <= - // tests/artifacts/primitive-ops/contract.algo.ts:103 + // tests/artifacts/primitive-ops/contract.algo.ts:104 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_gt(a: uint64, b: uint64) -> uint64: verify_uint64_gt: - // tests/artifacts/primitive-ops/contract.algo.ts:106-107 + // tests/artifacts/primitive-ops/contract.algo.ts:107-108 // @arc4.abimethod() // public verify_uint64_gt(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:108 + // tests/artifacts/primitive-ops/contract.algo.ts:109 // const result = a > b frame_dig -2 frame_dig -1 > - // tests/artifacts/primitive-ops/contract.algo.ts:109 + // tests/artifacts/primitive-ops/contract.algo.ts:110 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_uint64_ge(a: uint64, b: uint64) -> uint64: verify_uint64_ge: - // tests/artifacts/primitive-ops/contract.algo.ts:112-113 + // tests/artifacts/primitive-ops/contract.algo.ts:113-114 // @arc4.abimethod() // public verify_uint64_ge(a: uint64, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:114 + // tests/artifacts/primitive-ops/contract.algo.ts:115 // const result = a >= b frame_dig -2 frame_dig -1 >= - // tests/artifacts/primitive-ops/contract.algo.ts:115 + // tests/artifacts/primitive-ops/contract.algo.ts:116 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_init(raw_value: uint64) -> bytes: verify_bytes_init: - // tests/artifacts/primitive-ops/contract.algo.ts:118-119 + // tests/artifacts/primitive-ops/contract.algo.ts:119-120 // @arc4.abimethod() // public verify_bytes_init(raw_value: uint64): bytes { proto 1 1 - // tests/artifacts/primitive-ops/contract.algo.ts:120 + // tests/artifacts/primitive-ops/contract.algo.ts:121 // const result = op.itob(raw_value) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:121 + // tests/artifacts/primitive-ops/contract.algo.ts:122 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_add(a: bytes, b: bytes, pad_a_size: uint64, pad_b_size: uint64) -> bytes: verify_bytes_add: - // tests/artifacts/primitive-ops/contract.algo.ts:124-125 + // tests/artifacts/primitive-ops/contract.algo.ts:125-126 // @arc4.abimethod() // public verify_bytes_add(a: bytes, b: bytes, pad_a_size: uint64, pad_b_size: uint64): bytes { proto 4 1 - // tests/artifacts/primitive-ops/contract.algo.ts:126 + // tests/artifacts/primitive-ops/contract.algo.ts:127 // const paddedA = op.bzero(pad_a_size).concat(a) frame_dig -2 bzero frame_dig -4 concat - // tests/artifacts/primitive-ops/contract.algo.ts:127 + // tests/artifacts/primitive-ops/contract.algo.ts:128 // const paddedB = op.bzero(pad_b_size).concat(b) frame_dig -1 bzero frame_dig -3 concat - // tests/artifacts/primitive-ops/contract.algo.ts:128 + // tests/artifacts/primitive-ops/contract.algo.ts:129 // const result = paddedA.concat(paddedB) concat - // tests/artifacts/primitive-ops/contract.algo.ts:129 + // tests/artifacts/primitive-ops/contract.algo.ts:130 // const resultHash = op.sha256(result) sha256 - // tests/artifacts/primitive-ops/contract.algo.ts:130 + // tests/artifacts/primitive-ops/contract.algo.ts:131 // return resultHash retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_eq(a: bytes, b: bytes) -> uint64: verify_bytes_eq: - // tests/artifacts/primitive-ops/contract.algo.ts:133-134 + // tests/artifacts/primitive-ops/contract.algo.ts:134-135 // @arc4.abimethod() // public verify_bytes_eq(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:135 + // tests/artifacts/primitive-ops/contract.algo.ts:136 // const result = a === b frame_dig -2 frame_dig -1 == - // tests/artifacts/primitive-ops/contract.algo.ts:136 + // tests/artifacts/primitive-ops/contract.algo.ts:137 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_ne(a: bytes, b: bytes) -> uint64: verify_bytes_ne: - // tests/artifacts/primitive-ops/contract.algo.ts:139-140 + // tests/artifacts/primitive-ops/contract.algo.ts:140-141 // @arc4.abimethod() // public verify_bytes_ne(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:141 + // tests/artifacts/primitive-ops/contract.algo.ts:142 // const result = a !== b frame_dig -2 frame_dig -1 != - // tests/artifacts/primitive-ops/contract.algo.ts:142 + // tests/artifacts/primitive-ops/contract.algo.ts:143 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_and(a: bytes, b: bytes) -> bytes: verify_bytes_and: - // tests/artifacts/primitive-ops/contract.algo.ts:145-146 + // tests/artifacts/primitive-ops/contract.algo.ts:146-147 // @arc4.abimethod() // public verify_bytes_and(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:147 + // tests/artifacts/primitive-ops/contract.algo.ts:148 // const result = a.bitwiseAnd(b) frame_dig -2 frame_dig -1 b& - // tests/artifacts/primitive-ops/contract.algo.ts:148 + // tests/artifacts/primitive-ops/contract.algo.ts:149 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_or(a: bytes, b: bytes) -> bytes: verify_bytes_or: - // tests/artifacts/primitive-ops/contract.algo.ts:151-152 + // tests/artifacts/primitive-ops/contract.algo.ts:152-153 // @arc4.abimethod() // public verify_bytes_or(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:153 + // tests/artifacts/primitive-ops/contract.algo.ts:154 // const result = a.bitwiseOr(b) frame_dig -2 frame_dig -1 b| - // tests/artifacts/primitive-ops/contract.algo.ts:154 + // tests/artifacts/primitive-ops/contract.algo.ts:155 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_xor(a: bytes, b: bytes) -> bytes: verify_bytes_xor: - // tests/artifacts/primitive-ops/contract.algo.ts:157-158 + // tests/artifacts/primitive-ops/contract.algo.ts:158-159 // @arc4.abimethod() // public verify_bytes_xor(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:159 + // tests/artifacts/primitive-ops/contract.algo.ts:160 // const result = a.bitwiseXor(b) frame_dig -2 frame_dig -1 b^ - // tests/artifacts/primitive-ops/contract.algo.ts:160 + // tests/artifacts/primitive-ops/contract.algo.ts:161 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_bytes_not(a: bytes, pad_size: uint64) -> bytes: verify_bytes_not: - // tests/artifacts/primitive-ops/contract.algo.ts:163-164 + // tests/artifacts/primitive-ops/contract.algo.ts:164-165 // @arc4.abimethod() // public verify_bytes_not(a: bytes, pad_size: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:165 + // tests/artifacts/primitive-ops/contract.algo.ts:166 // const paddedA = op.bzero(pad_size).concat(a) frame_dig -1 bzero frame_dig -2 concat - // tests/artifacts/primitive-ops/contract.algo.ts:166 + // tests/artifacts/primitive-ops/contract.algo.ts:167 // const result = paddedA.bitwiseInvert() b~ - // tests/artifacts/primitive-ops/contract.algo.ts:167 + // tests/artifacts/primitive-ops/contract.algo.ts:168 // const resultHash = op.sha256(result) sha256 - // tests/artifacts/primitive-ops/contract.algo.ts:168 + // tests/artifacts/primitive-ops/contract.algo.ts:169 // return resultHash retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_add(a: bytes, b: bytes) -> bytes: verify_biguint_add: - // tests/artifacts/primitive-ops/contract.algo.ts:171-172 + // tests/artifacts/primitive-ops/contract.algo.ts:172-173 // @arc4.abimethod() // public verify_biguint_add(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:175 + // tests/artifacts/primitive-ops/contract.algo.ts:176 // const result: biguint = a_biguint + b_biguint frame_dig -2 frame_dig -1 b+ - // tests/artifacts/primitive-ops/contract.algo.ts:176 + // tests/artifacts/primitive-ops/contract.algo.ts:177 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_add_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_add_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:179-180 + // tests/artifacts/primitive-ops/contract.algo.ts:180-181 // @arc4.abimethod() // public verify_biguint_add_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:182 + // tests/artifacts/primitive-ops/contract.algo.ts:183 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:183 + // tests/artifacts/primitive-ops/contract.algo.ts:184 // const result: biguint = a_biguint + b_biguint frame_dig -2 b+ - // tests/artifacts/primitive-ops/contract.algo.ts:184 + // tests/artifacts/primitive-ops/contract.algo.ts:185 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_sub(a: bytes, b: bytes) -> bytes: verify_biguint_sub: - // tests/artifacts/primitive-ops/contract.algo.ts:187-188 + // tests/artifacts/primitive-ops/contract.algo.ts:188-189 // @arc4.abimethod() // public verify_biguint_sub(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:191 + // tests/artifacts/primitive-ops/contract.algo.ts:192 // const result: biguint = a_biguint - b_biguint frame_dig -2 frame_dig -1 b- - // tests/artifacts/primitive-ops/contract.algo.ts:192 + // tests/artifacts/primitive-ops/contract.algo.ts:193 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_sub_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_sub_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:195-196 + // tests/artifacts/primitive-ops/contract.algo.ts:196-197 // @arc4.abimethod() // public verify_biguint_sub_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:198 + // tests/artifacts/primitive-ops/contract.algo.ts:199 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:199 + // tests/artifacts/primitive-ops/contract.algo.ts:200 // const result: biguint = a_biguint - b_biguint frame_dig -2 swap b- - // tests/artifacts/primitive-ops/contract.algo.ts:200 + // tests/artifacts/primitive-ops/contract.algo.ts:201 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_mul(a: bytes, b: bytes) -> bytes: verify_biguint_mul: - // tests/artifacts/primitive-ops/contract.algo.ts:203-204 + // tests/artifacts/primitive-ops/contract.algo.ts:204-205 // @arc4.abimethod() // public verify_biguint_mul(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:207 + // tests/artifacts/primitive-ops/contract.algo.ts:208 // const result: biguint = a_biguint * b_biguint frame_dig -2 frame_dig -1 b* - // tests/artifacts/primitive-ops/contract.algo.ts:208 + // tests/artifacts/primitive-ops/contract.algo.ts:209 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_mul_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_mul_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:211-212 + // tests/artifacts/primitive-ops/contract.algo.ts:212-213 // @arc4.abimethod() // public verify_biguint_mul_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:214 + // tests/artifacts/primitive-ops/contract.algo.ts:215 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:215 + // tests/artifacts/primitive-ops/contract.algo.ts:216 // const result: biguint = a_biguint * b_biguint frame_dig -2 b* - // tests/artifacts/primitive-ops/contract.algo.ts:216 + // tests/artifacts/primitive-ops/contract.algo.ts:217 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_div(a: bytes, b: bytes) -> bytes: verify_biguint_div: - // tests/artifacts/primitive-ops/contract.algo.ts:219-220 + // tests/artifacts/primitive-ops/contract.algo.ts:220-221 // @arc4.abimethod() // public verify_biguint_div(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:223 + // tests/artifacts/primitive-ops/contract.algo.ts:224 // const result: biguint = a_biguint / b_biguint frame_dig -2 frame_dig -1 b/ - // tests/artifacts/primitive-ops/contract.algo.ts:224 + // tests/artifacts/primitive-ops/contract.algo.ts:225 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_div_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_div_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:227-228 + // tests/artifacts/primitive-ops/contract.algo.ts:228-229 // @arc4.abimethod() // public verify_biguint_div_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:230 + // tests/artifacts/primitive-ops/contract.algo.ts:231 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:231 + // tests/artifacts/primitive-ops/contract.algo.ts:232 // const result: biguint = a_biguint / b_biguint frame_dig -2 swap b/ - // tests/artifacts/primitive-ops/contract.algo.ts:232 + // tests/artifacts/primitive-ops/contract.algo.ts:233 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_mod(a: bytes, b: bytes) -> bytes: verify_biguint_mod: - // tests/artifacts/primitive-ops/contract.algo.ts:235-236 + // tests/artifacts/primitive-ops/contract.algo.ts:236-237 // @arc4.abimethod() // public verify_biguint_mod(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:239 + // tests/artifacts/primitive-ops/contract.algo.ts:240 // const result: biguint = a_biguint % b_biguint frame_dig -2 frame_dig -1 b% - // tests/artifacts/primitive-ops/contract.algo.ts:240 + // tests/artifacts/primitive-ops/contract.algo.ts:241 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_mod_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_mod_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:243-244 + // tests/artifacts/primitive-ops/contract.algo.ts:244-245 // @arc4.abimethod() // public verify_biguint_mod_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:246 + // tests/artifacts/primitive-ops/contract.algo.ts:247 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:247 + // tests/artifacts/primitive-ops/contract.algo.ts:248 // const result: biguint = a_biguint % b_biguint frame_dig -2 swap b% - // tests/artifacts/primitive-ops/contract.algo.ts:248 + // tests/artifacts/primitive-ops/contract.algo.ts:249 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_and(a: bytes, b: bytes) -> bytes: verify_biguint_and: - // tests/artifacts/primitive-ops/contract.algo.ts:251-252 + // tests/artifacts/primitive-ops/contract.algo.ts:252-253 // @arc4.abimethod() // public verify_biguint_and(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:255 + // tests/artifacts/primitive-ops/contract.algo.ts:256 // const result: biguint = a_biguint & b_biguint frame_dig -2 frame_dig -1 b& - // tests/artifacts/primitive-ops/contract.algo.ts:256 + // tests/artifacts/primitive-ops/contract.algo.ts:257 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_and_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_and_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:259-260 + // tests/artifacts/primitive-ops/contract.algo.ts:260-261 // @arc4.abimethod() // public verify_biguint_and_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:262 + // tests/artifacts/primitive-ops/contract.algo.ts:263 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:263 + // tests/artifacts/primitive-ops/contract.algo.ts:264 // const result: biguint = a_biguint & b_biguint frame_dig -2 b& - // tests/artifacts/primitive-ops/contract.algo.ts:264 + // tests/artifacts/primitive-ops/contract.algo.ts:265 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_or(a: bytes, b: bytes) -> bytes: verify_biguint_or: - // tests/artifacts/primitive-ops/contract.algo.ts:267-268 + // tests/artifacts/primitive-ops/contract.algo.ts:268-269 // @arc4.abimethod() // public verify_biguint_or(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:271 + // tests/artifacts/primitive-ops/contract.algo.ts:272 // const result: biguint = a_biguint | b_biguint frame_dig -2 frame_dig -1 b| - // tests/artifacts/primitive-ops/contract.algo.ts:272 + // tests/artifacts/primitive-ops/contract.algo.ts:273 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_or_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_or_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:275-276 + // tests/artifacts/primitive-ops/contract.algo.ts:276-277 // @arc4.abimethod() // public verify_biguint_or_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:278 + // tests/artifacts/primitive-ops/contract.algo.ts:279 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:279 + // tests/artifacts/primitive-ops/contract.algo.ts:280 // const result: biguint = a_biguint | b_biguint frame_dig -2 b| - // tests/artifacts/primitive-ops/contract.algo.ts:280 + // tests/artifacts/primitive-ops/contract.algo.ts:281 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_xor(a: bytes, b: bytes) -> bytes: verify_biguint_xor: - // tests/artifacts/primitive-ops/contract.algo.ts:283-284 + // tests/artifacts/primitive-ops/contract.algo.ts:284-285 // @arc4.abimethod() // public verify_biguint_xor(a: bytes, b: bytes): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:287 + // tests/artifacts/primitive-ops/contract.algo.ts:288 // const result: biguint = a_biguint ^ b_biguint frame_dig -2 frame_dig -1 b^ - // tests/artifacts/primitive-ops/contract.algo.ts:288 + // tests/artifacts/primitive-ops/contract.algo.ts:289 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_xor_uint64(a: bytes, b: uint64) -> bytes: verify_biguint_xor_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:291-292 + // tests/artifacts/primitive-ops/contract.algo.ts:292-293 // @arc4.abimethod() // public verify_biguint_xor_uint64(a: bytes, b: uint64): bytes { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:294 + // tests/artifacts/primitive-ops/contract.algo.ts:295 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:295 + // tests/artifacts/primitive-ops/contract.algo.ts:296 // const result: biguint = a_biguint ^ b_biguint frame_dig -2 b^ - // tests/artifacts/primitive-ops/contract.algo.ts:296 + // tests/artifacts/primitive-ops/contract.algo.ts:297 // return Bytes(result) retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_eq(a: bytes, b: bytes) -> uint64: verify_biguint_eq: - // tests/artifacts/primitive-ops/contract.algo.ts:299-300 + // tests/artifacts/primitive-ops/contract.algo.ts:300-301 // @arc4.abimethod() // public verify_biguint_eq(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:303 + // tests/artifacts/primitive-ops/contract.algo.ts:304 // const result = a_biguint === b_biguint frame_dig -2 frame_dig -1 b== - // tests/artifacts/primitive-ops/contract.algo.ts:304 + // tests/artifacts/primitive-ops/contract.algo.ts:305 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_eq_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_eq_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:307-308 + // tests/artifacts/primitive-ops/contract.algo.ts:308-309 // @arc4.abimethod() // public verify_biguint_eq_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:310 + // tests/artifacts/primitive-ops/contract.algo.ts:311 // const result = a_biguint === BigUint(b) frame_dig -1 itob frame_dig -2 b== - // tests/artifacts/primitive-ops/contract.algo.ts:311 + // tests/artifacts/primitive-ops/contract.algo.ts:312 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_ne(a: bytes, b: bytes) -> uint64: verify_biguint_ne: - // tests/artifacts/primitive-ops/contract.algo.ts:314-315 + // tests/artifacts/primitive-ops/contract.algo.ts:315-316 // @arc4.abimethod() // public verify_biguint_ne(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:318 + // tests/artifacts/primitive-ops/contract.algo.ts:319 // const result = a_biguint !== b_biguint frame_dig -2 frame_dig -1 b!= - // tests/artifacts/primitive-ops/contract.algo.ts:319 + // tests/artifacts/primitive-ops/contract.algo.ts:320 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_ne_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_ne_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:322-323 + // tests/artifacts/primitive-ops/contract.algo.ts:323-324 // @arc4.abimethod() // public verify_biguint_ne_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:325 + // tests/artifacts/primitive-ops/contract.algo.ts:326 // const result = a_biguint !== BigUint(b) frame_dig -1 itob frame_dig -2 b!= - // tests/artifacts/primitive-ops/contract.algo.ts:326 + // tests/artifacts/primitive-ops/contract.algo.ts:327 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_lt(a: bytes, b: bytes) -> uint64: verify_biguint_lt: - // tests/artifacts/primitive-ops/contract.algo.ts:329-330 + // tests/artifacts/primitive-ops/contract.algo.ts:330-331 // @arc4.abimethod() // public verify_biguint_lt(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:333 + // tests/artifacts/primitive-ops/contract.algo.ts:334 // const result = a_biguint < b_biguint frame_dig -2 frame_dig -1 b< - // tests/artifacts/primitive-ops/contract.algo.ts:334 + // tests/artifacts/primitive-ops/contract.algo.ts:335 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_lt_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_lt_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:337-338 + // tests/artifacts/primitive-ops/contract.algo.ts:338-339 // @arc4.abimethod() // public verify_biguint_lt_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:340 + // tests/artifacts/primitive-ops/contract.algo.ts:341 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:341 + // tests/artifacts/primitive-ops/contract.algo.ts:342 // const result = a_biguint < b_biguint frame_dig -2 b> - // tests/artifacts/primitive-ops/contract.algo.ts:342 + // tests/artifacts/primitive-ops/contract.algo.ts:343 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_le(a: bytes, b: bytes) -> uint64: verify_biguint_le: - // tests/artifacts/primitive-ops/contract.algo.ts:345-346 + // tests/artifacts/primitive-ops/contract.algo.ts:346-347 // @arc4.abimethod() // public verify_biguint_le(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:349 + // tests/artifacts/primitive-ops/contract.algo.ts:350 // const result = a_biguint <= b_biguint frame_dig -2 frame_dig -1 b<= - // tests/artifacts/primitive-ops/contract.algo.ts:350 + // tests/artifacts/primitive-ops/contract.algo.ts:351 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_le_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_le_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:353-354 + // tests/artifacts/primitive-ops/contract.algo.ts:354-355 // @arc4.abimethod() // public verify_biguint_le_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:356 + // tests/artifacts/primitive-ops/contract.algo.ts:357 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:357 + // tests/artifacts/primitive-ops/contract.algo.ts:358 // const result = a_biguint <= b_biguint frame_dig -2 b>= - // tests/artifacts/primitive-ops/contract.algo.ts:358 + // tests/artifacts/primitive-ops/contract.algo.ts:359 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_gt(a: bytes, b: bytes) -> uint64: verify_biguint_gt: - // tests/artifacts/primitive-ops/contract.algo.ts:361-362 + // tests/artifacts/primitive-ops/contract.algo.ts:362-363 // @arc4.abimethod() // public verify_biguint_gt(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:365 + // tests/artifacts/primitive-ops/contract.algo.ts:366 // const result = a_biguint > b_biguint frame_dig -2 frame_dig -1 b> - // tests/artifacts/primitive-ops/contract.algo.ts:366 + // tests/artifacts/primitive-ops/contract.algo.ts:367 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_gt_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_gt_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:369-370 + // tests/artifacts/primitive-ops/contract.algo.ts:370-371 // @arc4.abimethod() // public verify_biguint_gt_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:372 + // tests/artifacts/primitive-ops/contract.algo.ts:373 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:373 + // tests/artifacts/primitive-ops/contract.algo.ts:374 // const result = a_biguint > b_biguint frame_dig -2 b< - // tests/artifacts/primitive-ops/contract.algo.ts:374 + // tests/artifacts/primitive-ops/contract.algo.ts:375 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_ge(a: bytes, b: bytes) -> uint64: verify_biguint_ge: - // tests/artifacts/primitive-ops/contract.algo.ts:377-378 + // tests/artifacts/primitive-ops/contract.algo.ts:378-379 // @arc4.abimethod() // public verify_biguint_ge(a: bytes, b: bytes): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:381 + // tests/artifacts/primitive-ops/contract.algo.ts:382 // const result = a_biguint >= b_biguint frame_dig -2 frame_dig -1 b>= - // tests/artifacts/primitive-ops/contract.algo.ts:382 + // tests/artifacts/primitive-ops/contract.algo.ts:383 // return result retsub // tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_biguint_ge_uint64(a: bytes, b: uint64) -> uint64: verify_biguint_ge_uint64: - // tests/artifacts/primitive-ops/contract.algo.ts:385-386 + // tests/artifacts/primitive-ops/contract.algo.ts:386-387 // @arc4.abimethod() // public verify_biguint_ge_uint64(a: bytes, b: uint64): boolean { proto 2 1 - // tests/artifacts/primitive-ops/contract.algo.ts:388 + // tests/artifacts/primitive-ops/contract.algo.ts:389 // const b_biguint = BigUint(b) frame_dig -1 itob - // tests/artifacts/primitive-ops/contract.algo.ts:389 + // tests/artifacts/primitive-ops/contract.algo.ts:390 // const result = a_biguint >= b_biguint frame_dig -2 b<= - // tests/artifacts/primitive-ops/contract.algo.ts:390 + // tests/artifacts/primitive-ops/contract.algo.ts:391 // return result retsub + + +// tests/artifacts/primitive-ops/contract.algo.ts::PrimitiveOpsContract.verify_log(a: bytes, b: uint64, c: bytes, d: bytes, e: bytes, f: bytes, g: bytes, h: bytes, i: bytes, j: bytes, k: bytes, m: bytes, n: bytes) -> void: +verify_log: + // tests/artifacts/primitive-ops/contract.algo.ts:395-410 + // @arc4.abimethod() + // public verify_log( + // a: string, + // b: uint64, + // c: bytes, + // d: bytes, + // e: Bool, + // f: Str, + // g: UintN<64>, + // h: UintN<256>, + // i: UFixedNxM<32, 8>, + // j: UFixedNxM<256, 16>, + // k: bytes, + // m: bytes, + // n: bytes, + // ) { + proto 13 0 + // tests/artifacts/primitive-ops/contract.algo.ts:415 + // log(a, b, c, d_biguint, e, f, g, h, i, j, arc4_k, arc4_m, arc4_n) + frame_dig -12 + itob + frame_dig -13 + swap + concat + frame_dig -11 + concat + frame_dig -10 + concat + frame_dig -9 + concat + frame_dig -8 + concat + frame_dig -7 + concat + frame_dig -6 + concat + frame_dig -5 + concat + frame_dig -4 + concat + frame_dig -3 + concat + frame_dig -2 + concat + frame_dig -1 + concat + log + retsub diff --git a/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc32.json b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc32.json index 26d987d..8649c5e 100644 --- a/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc32.json +++ b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc32.json @@ -274,10 +274,15 @@ "call_config": { "no_op": "CALL" } + }, + "verify_log(string,uint64,byte[],byte[],bool,string,uint64,uint256,ufixed32x8,ufixed256x16,byte[],byte[],byte[])void": { + "call_config": { + "no_op": "CALL" + } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OQogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIC8vIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9pbml0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfYWRkKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3N1Yih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9tdWwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZGl2KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X21vZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9hbmQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfb3IodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfeG9yKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X25vdCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xzaGlmdCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9yc2hpZnQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfcG93KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2VxKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9uZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbHQodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2xlKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9ndCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZ2UodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfaW5pdCh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfYWRkKGJ5dGVbXSxieXRlW10sdWludDY0LHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19uZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19hbmQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19vcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX3hvcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX25vdChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYWRkKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hZGRfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9zdWIoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X211bChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZGl2KGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9kaXZfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tb2QoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FuZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfb3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfeG9yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF94b3JfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9lcShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X25lKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbHQoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sdF91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2d0KGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ2UoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9nZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9pbml0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9hZGRfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3N1Yl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbXVsX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9kaXZfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X21vZF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYW5kX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9vcl9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfeG9yX3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbm90X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHNoaWZ0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfcnNoaWZ0X3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfcG93X3JvdXRlQDE0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZXFfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9uZV9yb3V0ZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2x0X3JvdXRlQDE3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbGVfcm91dGVAMTggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ndF9yb3V0ZUAxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2dlX3JvdXRlQDIwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19pbml0X3JvdXRlQDIxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19hZGRfcm91dGVAMjIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2VxX3JvdXRlQDIzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19uZV9yb3V0ZUAyNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfYW5kX3JvdXRlQDI1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19vcl9yb3V0ZUAyNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfeG9yX3JvdXRlQDI3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19ub3Rfcm91dGVAMjggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYWRkX3JvdXRlQDI5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRfcm91dGVAMzAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfc3ViX3JvdXRlQDMxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjRfcm91dGVAMzIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3JvdXRlQDMzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X211bF91aW50NjRfcm91dGVAMzQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZGl2X3JvdXRlQDM1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRfcm91dGVAMzYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbW9kX3JvdXRlQDM3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X21vZF91aW50NjRfcm91dGVAMzggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3JvdXRlQDM5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FuZF91aW50NjRfcm91dGVANDAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfb3Jfcm91dGVANDEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0X3JvdXRlQDQyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3hvcl9yb3V0ZUA0MyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF94b3JfdWludDY0X3JvdXRlQDQ0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2VxX3JvdXRlQDQ1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NF9yb3V0ZUA0NiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9uZV9yb3V0ZUA0NyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9uZV91aW50NjRfcm91dGVANDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbHRfcm91dGVANDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0X3JvdXRlQDUwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2xlX3JvdXRlQDUxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2xlX3VpbnQ2NF9yb3V0ZUA1MiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9ndF9yb3V0ZUA1MyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9ndF91aW50NjRfcm91dGVANTQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ2Vfcm91dGVANTUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0X3JvdXRlQDU2CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2luaXRfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2luaXQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYWRkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfYWRkCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3N1Yl9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X3N1YgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9tdWxfcm91dGVANToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9tdWwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZGl2X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfZGl2CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X21vZF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X21vZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9hbmRfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9hbmQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfb3Jfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9vcgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF94b3Jfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfeG9yCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X25vdF9yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9ub3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHNoaWZ0X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2xzaGlmdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9yc2hpZnRfcm91dGVAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfcnNoaWZ0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3Bvd19yb3V0ZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9wb3cKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZXFfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X25lX3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X25lCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9sdF9yb3V0ZUAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9sdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbGVfcm91dGVAMTg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9sZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZ3Rfcm91dGVAMTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9ndAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZ2Vfcm91dGVAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9nZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19pbml0X3JvdXRlQDIxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19pbml0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2FkZF9yb3V0ZUAyMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19hZGQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfZXFfcm91dGVAMjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbmVfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfbmUKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfYW5kX3JvdXRlQDI1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2FuZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19vcl9yb3V0ZUAyNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19vcgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc194b3Jfcm91dGVAMjc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfeG9yCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX25vdF9yb3V0ZUAyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX25vdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FkZF9yb3V0ZUAyOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FkZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRfcm91dGVAMzA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9zdWJfcm91dGVAMzE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9zdWIKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9zdWJfdWludDY0X3JvdXRlQDMyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9zdWJfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3JvdXRlQDMzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbXVsCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NF9yb3V0ZUAzNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2Rpdl9yb3V0ZUAzNToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2RpdgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRfcm91dGVAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tb2Rfcm91dGVAMzc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tb2QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tb2RfdWludDY0X3JvdXRlQDM4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tb2RfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3JvdXRlQDM5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfYW5kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NF9yb3V0ZUA0MDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X29yX3JvdXRlQDQxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfb3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl91aW50NjRfcm91dGVANDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3hvcl9yb3V0ZUA0MzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X3hvcgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRfcm91dGVANDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MwogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9lcV9yb3V0ZUA0NToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2VxCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0X3JvdXRlQDQ2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9lcV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9uZV9yb3V0ZUA0NzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X25lCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0X3JvdXRlQDQ4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9uZV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sdF9yb3V0ZUA0OToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2x0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0X3JvdXRlQDUwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sdF91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sZV9yb3V0ZUA1MToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2xlCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0X3JvdXRlQDUyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sZV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9ndF9yb3V0ZUA1MzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2d0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0X3JvdXRlQDU0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9ndF91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9nZV9yb3V0ZUA1NToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozCiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2dlCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0X3JvdXRlQDU2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9nZV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANTk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NC01CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2FkZChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9hZGQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgKyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9zdWIoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2LTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfc3ViKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOAogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIC0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbXVsKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMi0yMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X211bChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2RpdihhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjgtMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9kaXYoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgLyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tb2QoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0LTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbW9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNgogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhICUgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYW5kKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X2FuZChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAmIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X29yKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2LTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfb3IoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgfCBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgfAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3IoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUyLTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfeG9yKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1NAogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIF4gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIF4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTgtNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ub3QoYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2MAogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSB+YQogICAgZnJhbWVfZGlnIC0xCiAgICB+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2xzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQtNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgPDwgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2NwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9yc2hpZnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwLTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfcnNoaWZ0KGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3MgogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhID4+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfcG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3Ni03NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X3BvdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2VxKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyLTgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZXEoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA9PT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg4LTg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbmUoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gY29uc3QgcmVzdWx0ID0gYSAhPT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2x0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk0LTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbHQoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NgogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xlKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMC0xMDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8PSBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2d0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNi0xMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ndChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwOAogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwOQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZShhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2dlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTItMTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZ2UoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPj0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2luaXQocmF3X3ZhbHVlOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYnl0ZXNfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE4LTExOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfaW5pdChyYXdfdmFsdWU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLml0b2IocmF3X3ZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2FkZChhOiBieXRlcywgYjogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCwgcGFkX2Jfc2l6ZTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI0LTEyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byA0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBwYWRkZWRBID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGNvbnN0IHBhZGRlZEIgPSBvcC5iemVybyhwYWRfYl9zaXplKS5jb25jYXQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOAogICAgLy8gY29uc3QgcmVzdWx0ID0gcGFkZGVkQS5jb25jYXQocGFkZGVkQikKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzMtMTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzktMTQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgIT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ1LTE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZUFuZChiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTUxLTE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfb3IoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gY29uc3QgcmVzdWx0ID0gYS5iaXR3aXNlT3IoYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc194b3IoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU3LTE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZVhvcihiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2My0xNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjUKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IHBhZGRlZEEuYml0d2lzZUludmVydCgpCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MS0xNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCArIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3OS0xODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4Ny0xODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAtIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5NS0xOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OAogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tdWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMy0yMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAqIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMS0yMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2RpdihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxOS0yMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAvIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyNy0yMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMAogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC8gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNS0yMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAlIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0My0yNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NgogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICUgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1MS0yNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTUKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAmIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1NgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1OS0yNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MgogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICYgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjctMjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzEKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCB8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzUtMjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3OAogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4My0yODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODcKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5MS0yOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IF4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjk5LTMwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA9PT0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwNAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDctMzA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgPT09IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNC0zMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbmUoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgIT09IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMTkKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIyLTMyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9uZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNQogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ICE9PSBCaWdVaW50KGIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjktMzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2x0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50IDwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzNy0zMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ1LTM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9sZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUwCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1My0zNTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ3QoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjEtMzYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2d0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ID4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9ndF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2OS0zNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2dlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc3LTM3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9nZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4NS0zODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODgKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5MAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2MAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZTAwN2MxMGIgLy8gbWV0aG9kICJ2ZXJpZnlfdWludDY0X2luaXQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9hZGQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfc3ViKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X211bCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9kaXYodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbW9kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FuZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9vcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF94b3IodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbm90KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbHNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3JzaGlmdCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9wb3codWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZXEodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X25lKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sdCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbGUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2d0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9nZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19pbml0KHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19hZGQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2VxKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX25lKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FuZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfeG9yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbm90KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hZGQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3N1YihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbXVsKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWxfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9kaXYoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X21vZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmRfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF94b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2VxKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2xlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndF91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2luaXRfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2FkZF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfc3ViX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9tdWxfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2Rpdl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbW9kX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9hbmRfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X29yX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF94b3Jfcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ub3Rfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9sc2hpZnRfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9yc2hpZnRfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9wb3dfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9lcV9yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X25lX3JvdXRlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHRfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9sZV9yb3V0ZUAxOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2d0X3JvdXRlQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZ2Vfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2luaXRfcm91dGVAMjEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2FkZF9yb3V0ZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfZXFfcm91dGVAMjMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX25lX3JvdXRlQDI0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19hbmRfcm91dGVAMjUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX29yX3JvdXRlQDI2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc194b3Jfcm91dGVAMjcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX25vdF9yb3V0ZUAyOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hZGRfcm91dGVAMjkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NF9yb3V0ZUAzMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9zdWJfcm91dGVAMzEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NF9yb3V0ZUAzMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tdWxfcm91dGVAMzMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NF9yb3V0ZUAzNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9kaXZfcm91dGVAMzUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NF9yb3V0ZUAzNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tb2Rfcm91dGVAMzcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NF9yb3V0ZUAzOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hbmRfcm91dGVAMzkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NF9yb3V0ZUA0MCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl9yb3V0ZUA0MSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl91aW50NjRfcm91dGVANDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfeG9yX3JvdXRlQDQzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRfcm91dGVANDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZXFfcm91dGVANDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0X3JvdXRlQDQ2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X25lX3JvdXRlQDQ3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NF9yb3V0ZUA0OCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sdF9yb3V0ZUA0OSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sdF91aW50NjRfcm91dGVANTAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbGVfcm91dGVANTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0X3JvdXRlQDUyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2d0X3JvdXRlQDUzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NF9yb3V0ZUA1NCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9nZV9yb3V0ZUA1NSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9nZV91aW50NjRfcm91dGVANTYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2xvZ19yb3V0ZUA1NwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9pbml0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2luaXQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYWRkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9hZGQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfc3ViX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9zdWIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbXVsX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9tdWwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZGl2X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9kaXYKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbW9kX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9tb2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYW5kX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9hbmQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfb3Jfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X29yCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3hvcl9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X3hvcgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ub3Rfcm91dGVAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9ub3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHNoaWZ0X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfbHNoaWZ0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3JzaGlmdF9yb3V0ZUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X3JzaGlmdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9wb3dfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9wb3cKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZXFfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9lcQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbmVfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9uZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHRfcm91dGVAMTc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9sdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbGVfcm91dGVAMTg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2xlCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ndF9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfZ3QKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2dlX3JvdXRlQDIwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9nZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19pbml0X3JvdXRlQDIxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2luaXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfYWRkX3JvdXRlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfYWRkCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2VxX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbmVfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19uZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19hbmRfcm91dGVAMjU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19hbmQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfb3Jfcm91dGVAMjY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19vcgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc194b3Jfcm91dGVAMjc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc194b3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbm90X3JvdXRlQDI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19ub3QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hZGRfcm91dGVAMjk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FkZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRfcm91dGVAMzA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3N1Yl9yb3V0ZUAzMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfc3ViCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NF9yb3V0ZUAzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9zdWJfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3JvdXRlQDMzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tdWwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tdWxfdWludDY0X3JvdXRlQDM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9kaXZfcm91dGVAMzU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2RpdgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRfcm91dGVAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X21vZF9yb3V0ZUAzNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbW9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NF9yb3V0ZUAzODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tb2RfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3JvdXRlQDM5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9hbmQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hbmRfdWludDY0X3JvdXRlQDQwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl9yb3V0ZUA0MToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfb3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl91aW50NjRfcm91dGVANDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfeG9yX3JvdXRlQDQzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF94b3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF94b3JfdWludDY0X3JvdXRlQDQ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9lcV9yb3V0ZUA0NToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9lcV91aW50NjRfcm91dGVANDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbmVfcm91dGVANDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X25lCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0X3JvdXRlQDQ4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2x0X3JvdXRlQDQ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NF9yb3V0ZUA1MDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sdF91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sZV9yb3V0ZUA1MToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbGUKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sZV91aW50NjRfcm91dGVANTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ3Rfcm91dGVANTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2d0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0X3JvdXRlQDU0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2dlX3JvdXRlQDU1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9nZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NF9yb3V0ZUA1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9nZV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfbG9nX3JvdXRlQDU3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9sb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2MDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2NAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NS02CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2FkZChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9hZGQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgKyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9zdWIoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfc3ViKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIC0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbXVsKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X211bChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2RpdihhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjktMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9kaXYoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgLyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tb2QoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1LTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbW9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNwogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhICUgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYW5kKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MS00MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X2FuZChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAmIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X29yKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfb3IoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgfCBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgfAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3IoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUzLTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfeG9yKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIF4gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIF4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTktNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ub3QoYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSB+YQogICAgZnJhbWVfZGlnIC0xCiAgICB+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2xzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUtNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgPDwgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2OAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9yc2hpZnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxLTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfcnNoaWZ0KGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhID4+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfcG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3Ny03OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X3BvdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2VxKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzLTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZXEoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4NQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA9PT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbmUoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSAhPT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2x0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1LTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbHQoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xlKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMS0xMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8PSBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2d0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNy0xMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ndChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwOQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZShhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2dlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTMtMTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZ2UoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPj0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2luaXQocmF3X3ZhbHVlOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYnl0ZXNfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE5LTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfaW5pdChyYXdfdmFsdWU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLml0b2IocmF3X3ZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2FkZChhOiBieXRlcywgYjogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCwgcGFkX2Jfc2l6ZTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI1LTEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byA0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBjb25zdCBwYWRkZWRBID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjgKICAgIC8vIGNvbnN0IHBhZGRlZEIgPSBvcC5iemVybyhwYWRfYl9zaXplKS5jb25jYXQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gY29uc3QgcmVzdWx0ID0gcGFkZGVkQS5jb25jYXQocGFkZGVkQikKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzQtMTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDAtMTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgIT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZUFuZChiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTUyLTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfb3IoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gY29uc3QgcmVzdWx0ID0gYS5iaXR3aXNlT3IoYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc194b3IoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU4LTE1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZVhvcihiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2NC0xNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IHBhZGRlZEEuYml0d2lzZUludmVydCgpCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3Mi0xNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzYKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCArIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MC0xODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OC0xODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAtIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5Ni0xOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tdWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNC0yMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAqIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMi0yMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2RpdihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMC0yMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjQKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAvIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOC0yMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC8gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNi0yMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAlIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0MQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NC0yNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICUgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1Mi0yNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAmIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICYgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjgtMjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCB8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYtMjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NC0yODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5Mi0yOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IF4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAwLTMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA9PT0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwNQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDgtMzA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgPT09IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNS0zMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbmUoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgIT09IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIzLTMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9uZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ICE9PSBCaWdVaW50KGIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMzAtMzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2x0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50IDwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzOC0zMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ2LTM0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9sZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NC0zNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ3QoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjItMzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2d0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ID4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9ndF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3MC0zNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2dlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc4LTM3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9nZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4Ni0zODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2xvZyhhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcywgZDogYnl0ZXMsIGU6IGJ5dGVzLCBmOiBieXRlcywgZzogYnl0ZXMsIGg6IGJ5dGVzLCBpOiBieXRlcywgajogYnl0ZXMsIGs6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NS00MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2xvZygKICAgIC8vICAgYTogc3RyaW5nLAogICAgLy8gICBiOiB1aW50NjQsCiAgICAvLyAgIGM6IGJ5dGVzLAogICAgLy8gICBkOiBieXRlcywKICAgIC8vICAgZTogQm9vbCwKICAgIC8vICAgZjogU3RyLAogICAgLy8gICBnOiBVaW50Tjw2ND4sCiAgICAvLyAgIGg6IFVpbnROPDI1Nj4sCiAgICAvLyAgIGk6IFVGaXhlZE54TTwzMiwgOD4sCiAgICAvLyAgIGo6IFVGaXhlZE54TTwyNTYsIDE2PiwKICAgIC8vICAgazogYnl0ZXMsCiAgICAvLyAgIG06IGJ5dGVzLAogICAgLy8gICBuOiBieXRlcywKICAgIC8vICkgewogICAgcHJvdG8gMTMgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24pCiAgICBmcmFtZV9kaWcgLTEyCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTkKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC04CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -1233,6 +1238,67 @@ "returns": { "type": "bool" } + }, + { + "name": "verify_log", + "args": [ + { + "type": "string", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + }, + { + "type": "byte[]", + "name": "d" + }, + { + "type": "bool", + "name": "e" + }, + { + "type": "string", + "name": "f" + }, + { + "type": "uint64", + "name": "g" + }, + { + "type": "uint256", + "name": "h" + }, + { + "type": "ufixed32x8", + "name": "i" + }, + { + "type": "ufixed256x16", + "name": "j" + }, + { + "type": "byte[]", + "name": "k" + }, + { + "type": "byte[]", + "name": "m" + }, + { + "type": "byte[]", + "name": "n" + } + ], + "readonly": false, + "returns": { + "type": "void" + } } ], "networks": {} diff --git a/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc56.json b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc56.json new file mode 100644 index 0000000..e03b9b5 --- /dev/null +++ b/tests/artifacts/primitive-ops/data/PrimitiveOpsContract.arc56.json @@ -0,0 +1,1624 @@ +{ + "name": "PrimitiveOpsContract", + "structs": {}, + "methods": [ + { + "name": "verify_uint64_init", + "args": [ + { + "type": "byte[]", + "name": "raw_value" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_add", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_sub", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_mul", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_div", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_mod", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_and", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_or", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_xor", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_not", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_lshift", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_rshift", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_pow", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_eq", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_ne", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_lt", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_le", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_gt", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_uint64_ge", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_init", + "args": [ + { + "type": "uint64", + "name": "raw_value" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_add", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "pad_a_size" + }, + { + "type": "uint64", + "name": "pad_b_size" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_eq", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_ne", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_and", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_or", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_xor", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_bytes_not", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "pad_size" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_add", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_add_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_sub", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_sub_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_mul", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_mul_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_div", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_div_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_mod", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_mod_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_and", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_and_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_or", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_or_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_xor", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_xor_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_eq", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_eq_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_ne", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_ne_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_lt", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_lt_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_le", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_le_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_gt", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_gt_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_ge", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_biguint_ge_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_log", + "args": [ + { + "type": "string", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + }, + { + "type": "byte[]", + "name": "d" + }, + { + "type": "bool", + "name": "e" + }, + { + "type": "string", + "name": "f" + }, + { + "type": "uint64", + "name": "g" + }, + { + "type": "uint256", + "name": "h" + }, + { + "type": "ufixed32x8", + "name": "i" + }, + { + "type": "ufixed256x16", + "name": "j" + }, + { + "type": "byte[]", + "name": "k" + }, + { + "type": "byte[]", + "name": "m" + }, + { + "type": "byte[]", + "name": "n" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 430, + 453, + 478, + 503, + 528, + 553, + 578, + 603, + 628, + 653, + 674, + 699, + 724, + 749, + 778, + 807, + 836, + 865, + 894, + 923, + 951, + 995, + 1028, + 1061, + 1097, + 1133, + 1169, + 1203, + 1239, + 1273, + 1309, + 1343, + 1379, + 1413, + 1449, + 1483, + 1519, + 1553, + 1589, + 1623, + 1659, + 1693, + 1729, + 1763, + 1796, + 1827, + 1860, + 1891, + 1924, + 1955, + 1988, + 2019, + 2052, + 2083, + 2116, + 2147 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 2222 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 433, + 456, + 481, + 506, + 531, + 556, + 581, + 606, + 631, + 656, + 677, + 702, + 727, + 752, + 781, + 810, + 839, + 868, + 897, + 926, + 954, + 998, + 1031, + 1064, + 1100, + 1136, + 1172, + 1206, + 1242, + 1276, + 1312, + 1346, + 1382, + 1416, + 1452, + 1486, + 1522, + 1556, + 1592, + 1626, + 1662, + 1696, + 1732, + 1766, + 1799, + 1830, + 1863, + 1894, + 1927, + 1958, + 1991, + 2022, + 2055, + 2086, + 2119, + 2150 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2MAogICAgcHVzaGJ5dGVzcyAweDcyNWM2OTJiIDB4MTczMTQ1NTkgMHg1M2YzNDg5MyAweDg4YzhiMjY5IDB4YTQ2NGI3YWIgMHg5YzhiMTFiOCAweDZmNDA2NTRlIDB4ZWM5YTI5NzQgMHhjNzkzNzA4ZiAweDdkZGI3NDk5IDB4YTIxYzQ0M2QgMHg2ZTdmYjIxMiAweGIwMDdmY2IwIDB4MmViYzIwZDQgMHhiMDk1NGI2NiAweGRkMTQwYWVmIDB4YWNlNDc0ZGEgMHhiYTY5NDk5MCAweDZkYjU4MWMwIDB4OTFjOGRiODkgMHhkYmU3NzE1OCAweDlhMGYyMmUxIDB4NjQwMzNkMzcgMHgyYTcyMzdjNSAweGUzYTk0NDU4IDB4NDJmODdmN2QgMHgyYjU1NDJhNCAweDliZTJmYmU5IDB4MWNkOTI1MTUgMHg2NGUxNzA1YyAweGYxMjcxYzUwIDB4MmFiNjNiNzAgMHg4MzRiYjdkMiAweDUzMTYyMGQ3IDB4M2ZiOWU3NjkgMHhmYThkYjBiYyAweGE3MmVhNDg1IDB4YjdiMGJhMTkgMHg3NDQ2MGM0MiAweGFiMzIwNzM4IDB4NTJhZDQ2NTQgMHgxMDE1NjM5OSAweDBmMDc1OTU3IDB4YmQ4NDNkZmYgMHhiMzc3ZDM4MSAweDg5NzY3MjY1IDB4NDU2YjRiMjMgMHgzM2QxYjg4YyAweDZiZjk3M2VhIDB4NjdjZDZiYjIgMHgzZjU4ODA1YSAweDFlMTMwMDM5IDB4NTA5ZGM5MWQgMHhhNTY0YTIwMiAweDIzNjUwNzYzIDB4ZTAwN2MxMGIgLy8gbWV0aG9kICJ2ZXJpZnlfdWludDY0X2luaXQoYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9hZGQodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfc3ViKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X211bCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9kaXYodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbW9kKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2FuZCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9vcih1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF94b3IodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbm90KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbHNoaWZ0KHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X3JzaGlmdCh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9wb3codWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV91aW50NjRfZXEodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X25lKHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9sdCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV91aW50NjRfbGUodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfdWludDY0X2d0KHVpbnQ2NCx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X3VpbnQ2NF9nZSh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9ieXRlc19pbml0KHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9ieXRlc19hZGQoYnl0ZVtdLGJ5dGVbXSx1aW50NjQsdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2VxKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX25lKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX2FuZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2J5dGVzX29yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfeG9yKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYnl0ZXNfbm90KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hZGQoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3N1YihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbXVsKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9tdWxfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9kaXYoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X21vZChieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NChieXRlW10sdWludDY0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfYW5kKGJ5dGVbXSxieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9hbmRfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9vcihieXRlW10sYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0KGJ5dGVbXSx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF94b3IoYnl0ZVtdLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQoYnl0ZVtdLHVpbnQ2NClieXRlW10iLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2VxKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbmUoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9uZV91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9sdChieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2xlKGJ5dGVbXSxieXRlW10pYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0KGJ5dGVbXSx1aW50NjQpYm9vbCIsIG1ldGhvZCAidmVyaWZ5X2JpZ3VpbnRfZ3QoYnl0ZVtdLGJ5dGVbXSlib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9ndF91aW50NjQoYnl0ZVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYmlndWludF9nZShieXRlW10sYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NChieXRlW10sdWludDY0KWJvb2wiLCBtZXRob2QgInZlcmlmeV9sb2coc3RyaW5nLHVpbnQ2NCxieXRlW10sYnl0ZVtdLGJvb2wsc3RyaW5nLHVpbnQ2NCx1aW50MjU2LHVmaXhlZDMyeDgsdWZpeGVkMjU2eDE2LGJ5dGVbXSxieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2luaXRfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2FkZF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfc3ViX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9tdWxfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2Rpdl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbW9kX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9hbmRfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X29yX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF94b3Jfcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ub3Rfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9sc2hpZnRfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9yc2hpZnRfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9wb3dfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9lcV9yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X25lX3JvdXRlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHRfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9sZV9yb3V0ZUAxOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2d0X3JvdXRlQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZ2Vfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2luaXRfcm91dGVAMjEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2FkZF9yb3V0ZUAyMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfZXFfcm91dGVAMjMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX25lX3JvdXRlQDI0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19hbmRfcm91dGVAMjUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX29yX3JvdXRlQDI2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc194b3Jfcm91dGVAMjcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX25vdF9yb3V0ZUAyOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hZGRfcm91dGVAMjkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NF9yb3V0ZUAzMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9zdWJfcm91dGVAMzEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NF9yb3V0ZUAzMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tdWxfcm91dGVAMzMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NF9yb3V0ZUAzNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9kaXZfcm91dGVAMzUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NF9yb3V0ZUAzNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tb2Rfcm91dGVAMzcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NF9yb3V0ZUAzOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hbmRfcm91dGVAMzkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NF9yb3V0ZUA0MCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl9yb3V0ZUA0MSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl91aW50NjRfcm91dGVANDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfeG9yX3JvdXRlQDQzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3hvcl91aW50NjRfcm91dGVANDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZXFfcm91dGVANDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0X3JvdXRlQDQ2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X25lX3JvdXRlQDQ3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NF9yb3V0ZUA0OCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sdF9yb3V0ZUA0OSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sdF91aW50NjRfcm91dGVANTAgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbGVfcm91dGVANTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0X3JvdXRlQDUyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2d0X3JvdXRlQDUzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NF9yb3V0ZUA1NCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9nZV9yb3V0ZUA1NSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9nZV91aW50NjRfcm91dGVANTYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2xvZ19yb3V0ZUA1NwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9pbml0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2luaXQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYWRkX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9hZGQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfc3ViX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9zdWIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbXVsX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9tdWwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZGl2X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9kaXYKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbW9kX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9tb2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfYW5kX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9hbmQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfb3Jfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X29yCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3hvcl9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X3hvcgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ub3Rfcm91dGVAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9ub3QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHNoaWZ0X3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfbHNoaWZ0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X3JzaGlmdF9yb3V0ZUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X3JzaGlmdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9wb3dfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9wb3cKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfZXFfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9lcQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbmVfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9uZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbHRfcm91dGVAMTc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9sdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV91aW50NjRfbGVfcm91dGVAMTg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfdWludDY0X2xlCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3VpbnQ2NF9ndF9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV91aW50NjRfZ3QKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfdWludDY0X2dlX3JvdXRlQDIwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3VpbnQ2NF9nZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19pbml0X3JvdXRlQDIxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2J5dGVzX2luaXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfYWRkX3JvdXRlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfYWRkCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2J5dGVzX2VxX3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYnl0ZXNfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbmVfcm91dGVAMjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19uZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc19hbmRfcm91dGVAMjU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19hbmQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfb3Jfcm91dGVAMjY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19vcgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9ieXRlc194b3Jfcm91dGVAMjc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc194b3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYnl0ZXNfbm90X3JvdXRlQDI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9ieXRlc19ub3QKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hZGRfcm91dGVAMjk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FkZAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2FkZF91aW50NjRfcm91dGVAMzA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X3N1Yl9yb3V0ZUAzMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfc3ViCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NF9yb3V0ZUAzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9zdWJfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbXVsX3JvdXRlQDMzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tdWwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9tdWxfdWludDY0X3JvdXRlQDM0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X211bF91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9kaXZfcm91dGVAMzU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2RpdgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjRfcm91dGVAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X21vZF9yb3V0ZUAzNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbW9kCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NF9yb3V0ZUAzODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9tb2RfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfYW5kX3JvdXRlQDM5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9hbmQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9hbmRfdWludDY0X3JvdXRlQDQwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl9yb3V0ZUA0MToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfb3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9vcl91aW50NjRfcm91dGVANDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfeG9yX3JvdXRlQDQzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF94b3IKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF94b3JfdWludDY0X3JvdXRlQDQ0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9lcV9yb3V0ZUA0NToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZXEKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9lcV91aW50NjRfcm91dGVANDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbmVfcm91dGVANDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X25lCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfbmVfdWludDY0X3JvdXRlQDQ4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2x0X3JvdXRlQDQ5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2x0X3VpbnQ2NF9yb3V0ZUA1MDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9sdF91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sZV9yb3V0ZUA1MToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbGUKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYmlndWludF9sZV91aW50NjRfcm91dGVANTI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ3Rfcm91dGVANTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgUHJpbWl0aXZlT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2d0CiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0X3JvdXRlQDU0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9iaWd1aW50X2d0X3VpbnQ2NAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2dlX3JvdXRlQDU1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9nZQogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9iaWd1aW50X2dlX3VpbnQ2NF9yb3V0ZUA1NjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYmlndWludF9nZV91aW50NjQKICAgIGJ5dGVjXzEgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfbG9nX3JvdXRlQDU3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9sb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2MDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIFByaW1pdGl2ZU9wc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA2NAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBQcmltaXRpdmVPcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NS02CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfaW5pdChyYXdfdmFsdWU6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3CiAgICAvLyBjb25zdCByZXN1bHQgPSBvcC5idG9pKHJhd192YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2FkZChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9hZGQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgKyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9zdWIoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfc3ViKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIC0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbXVsKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbXVsOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X211bChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2RpdihhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2RpdjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjktMzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9kaXYoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgLyBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgLwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9tb2QoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1LTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbW9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNwogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhICUgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfYW5kKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfYW5kOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MS00MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X2FuZChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAmIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAmCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X29yKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfb3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfb3IoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgfCBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgfAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF94b3IoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUzLTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfeG9yKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhIF4gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIF4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfbm90KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X25vdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTktNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ub3QoYTogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSB+YQogICAgZnJhbWVfZGlnIC0xCiAgICB+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xzaGlmdChhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2xzaGlmdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjUtNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBjb25zdCByZXN1bHQ6IHVpbnQ2NCA9IGEgPDwgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHNobAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo2OAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9yc2hpZnQoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X3VpbnQ2NF9yc2hpZnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxLTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfcnNoaWZ0KGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gY29uc3QgcmVzdWx0OiB1aW50NjQgPSBhID4+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBzaHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV91aW50NjRfcG93KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfcG93OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo3Ny03OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfdWludDY0X3BvdyhhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIGNvbnN0IHJlc3VsdDogdWludDY0ID0gYSAqKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgZXhwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2VxKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZXE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzLTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZXEoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo4NQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA9PT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X25lKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbmUoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSAhPT0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2x0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbHQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk1LTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfbHQoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2xlKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfbGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMS0xMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9sZShhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA8PSBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfdWludDY0X2d0KGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV91aW50NjRfZ3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNy0xMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X3VpbnQ2NF9ndChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwOQogICAgLy8gY29uc3QgcmVzdWx0ID0gYSA+IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X3VpbnQ2NF9nZShhOiB1aW50NjQsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfdWludDY0X2dlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTMtMTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV91aW50NjRfZ2UoYTogdWludDY0LCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPj0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2luaXQocmF3X3ZhbHVlOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYnl0ZXNfaW5pdDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE5LTEyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfaW5pdChyYXdfdmFsdWU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjEKICAgIC8vIGNvbnN0IHJlc3VsdCA9IG9wLml0b2IocmF3X3ZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMgogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX2FkZChhOiBieXRlcywgYjogYnl0ZXMsIHBhZF9hX3NpemU6IHVpbnQ2NCwgcGFkX2Jfc2l6ZTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FkZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI1LTEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcywgcGFkX2Ffc2l6ZTogdWludDY0LCBwYWRfYl9zaXplOiB1aW50NjQpOiBieXRlcyB7CiAgICBwcm90byA0IDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI3CiAgICAvLyBjb25zdCBwYWRkZWRBID0gb3AuYnplcm8ocGFkX2Ffc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjgKICAgIC8vIGNvbnN0IHBhZGRlZEIgPSBvcC5iemVybyhwYWRfYl9zaXplKS5jb25jYXQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gY29uc3QgcmVzdWx0ID0gcGFkZGVkQS5jb25jYXQocGFkZGVkQikKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX2VxOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzQtMTM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzYKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgPT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2J5dGVzX25lOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDAtMTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9ieXRlc19uZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEgIT09IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc19hbmQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX2FuZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZUFuZChiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19vcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTUyLTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfb3IoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gY29uc3QgcmVzdWx0ID0gYS5iaXR3aXNlT3IoYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9ieXRlc194b3IoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2J5dGVzX3hvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU4LTE1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYnl0ZXNfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGEuYml0d2lzZVhvcihiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9ieXRlc19ub3Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2NC0xNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2J5dGVzX25vdChhOiBieXRlcywgcGFkX3NpemU6IHVpbnQ2NCk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHBhZGRlZEEgPSBvcC5iemVybyhwYWRfc2l6ZSkuY29uY2F0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjcKICAgIC8vIGNvbnN0IHJlc3VsdCA9IHBhZGRlZEEuYml0d2lzZUludmVydCgpCiAgICBifgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIGNvbnN0IHJlc3VsdEhhc2ggPSBvcC5zaGEyNTYocmVzdWx0KQogICAgc2hhMjU2CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gcmV0dXJuIHJlc3VsdEhhc2gKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hZGQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3Mi0xNzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzYKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCArIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FkZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MC0xODEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYWRkX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICsgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9zdWI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OC0xODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTIKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAtIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3N1Yl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5Ni0xOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfc3ViX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGItCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tdWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNC0yMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAqIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X211bF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X211bF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMi0yMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbXVsX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICogYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGIqCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2RpdihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9kaXY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMC0yMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjQKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAvIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyNQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2Rpdl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyOC0yMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZGl2X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IC8gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIvCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9tb2Q6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNi0yMzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAlIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0MQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X21vZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NC0yNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbW9kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0OAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICUgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGIlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZChhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF9hbmQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1Mi0yNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCAmIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X2FuZF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfYW5kX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50ICYgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGImCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X29yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjgtMjY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCB8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2JpZ3VpbnRfb3JfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYtMjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X29yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IHwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ8CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4MQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYmlndWludF94b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NC0yODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yKGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIGNvbnN0IHJlc3VsdDogYmlndWludCA9IGFfYmlndWludCBeIGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9iaWd1aW50X3hvcl91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5Mi0yOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfeG9yX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gY29uc3QgYl9iaWd1aW50ID0gQmlnVWludChiKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gY29uc3QgcmVzdWx0OiBiaWd1aW50ID0gYV9iaWd1aW50IF4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGJeCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gcmV0dXJuIEJ5dGVzKHJlc3VsdCkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2VxKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9lcToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAwLTMwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9lcShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA9PT0gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj09CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwNQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfZXFfdWludDY0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMDgtMzA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2VxX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgPT09IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBiPT0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEyCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9uZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2JpZ3VpbnRfbmU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNS0zMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbmUoYTogYnl0ZXMsIGI6IGJ5dGVzKTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyBjb25zdCByZXN1bHQgPSBhX2JpZ3VpbnQgIT09IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGIhPQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMjAKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X25lX3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIzLTMyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9uZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ICE9PSBCaWdVaW50KGIpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgYiE9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfbHQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2x0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozMzAtMzMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2x0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzNAogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50IDwgYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYjwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sdF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sdF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzOC0zMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbHRfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2xlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQ2LTM0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9sZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9sZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9sZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NC0zNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfbGVfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA8PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYj49CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2JpZ3VpbnRfZ3QoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9iaWd1aW50X2d0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNjItMzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9iaWd1aW50X2d0KGE6IGJ5dGVzLCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2NgogICAgLy8gY29uc3QgcmVzdWx0ID0gYV9iaWd1aW50ID4gYl9iaWd1aW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYj4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9ndF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9ndF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3MC0zNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ3RfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzMKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+IGJfYmlndWludAogICAgZnJhbWVfZGlnIC0yCiAgICBiPAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIHJldHVybiByZXN1bHQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlByaW1pdGl2ZU9wc0NvbnRyYWN0LnZlcmlmeV9iaWd1aW50X2dlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc4LTM3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYmlndWludF9nZShhOiBieXRlcywgYjogYnl0ZXMpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODIKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9wcmltaXRpdmUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzgzCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC52ZXJpZnlfYmlndWludF9nZV91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYmlndWludF9nZV91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4Ni0zODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2JpZ3VpbnRfZ2VfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIGNvbnN0IGJfYmlndWludCA9IEJpZ1VpbnQoYikKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czozOTAKICAgIC8vIGNvbnN0IHJlc3VsdCA9IGFfYmlndWludCA+PSBiX2JpZ3VpbnQKICAgIGZyYW1lX2RpZyAtMgogICAgYjw9CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo6UHJpbWl0aXZlT3BzQ29udHJhY3QudmVyaWZ5X2xvZyhhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcywgZDogYnl0ZXMsIGU6IGJ5dGVzLCBmOiBieXRlcywgZzogYnl0ZXMsIGg6IGJ5dGVzLCBpOiBieXRlcywgajogYnl0ZXMsIGs6IGJ5dGVzLCBtOiBieXRlcywgbjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9sb2c6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NS00MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2xvZygKICAgIC8vICAgYTogc3RyaW5nLAogICAgLy8gICBiOiB1aW50NjQsCiAgICAvLyAgIGM6IGJ5dGVzLAogICAgLy8gICBkOiBieXRlcywKICAgIC8vICAgZTogQm9vbCwKICAgIC8vICAgZjogU3RyLAogICAgLy8gICBnOiBVaW50Tjw2ND4sCiAgICAvLyAgIGg6IFVpbnROPDI1Nj4sCiAgICAvLyAgIGk6IFVGaXhlZE54TTwzMiwgOD4sCiAgICAvLyAgIGo6IFVGaXhlZE54TTwyNTYsIDE2PiwKICAgIC8vICAgazogYnl0ZXMsCiAgICAvLyAgIG06IGJ5dGVzLAogICAgLy8gICBuOiBieXRlcywKICAgIC8vICkgewogICAgcHJvdG8gMTMgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3ByaW1pdGl2ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGxvZyhhLCBiLCBjLCBkX2JpZ3VpbnQsIGUsIGYsIGcsIGgsIGksIGosIGFyYzRfaywgYXJjNF9tLCBhcmM0X24pCiAgICBmcmFtZV9kaWcgLTEyCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xMAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTkKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC04CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvcHJpbWl0aXZlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpQcmltaXRpdmVPcHNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/contract.algo.ts b/tests/artifacts/state-ops/contract.algo.ts index 328cd36..ac97863 100644 --- a/tests/artifacts/state-ops/contract.algo.ts +++ b/tests/artifacts/state-ops/contract.algo.ts @@ -17,6 +17,7 @@ import { Uint64, uint64, } from '@algorandfoundation/algorand-typescript' +import { Address, Bool, Byte, DynamicBytes, Str, UintN128, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' function get_1st_ref_index(): uint64 { return op.btoi(Txn.applicationArgs(1)) @@ -48,13 +49,12 @@ export class StateAcctParamsGetContract extends arc4.Contract { } @arc4.abimethod() - public verify_acct_auth_addr(a: Account): Account { + public verify_acct_auth_addr(a: Account): Address { const [value, funded] = op.AcctParams.acctAuthAddr(a) const [value_index, funded_index] = op.AcctParams.acctAuthAddr(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(funded === funded_index, 'expected funded by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() @@ -218,53 +218,48 @@ export class StateAssetParamsContract extends arc4.Contract { } @arc4.abimethod() - public verify_asset_params_get_manager(a: Asset): Account { + public verify_asset_params_get_manager(a: Asset): Address { const [value, exists] = op.AssetParams.assetManager(a) const [value_index, exists_index] = op.AssetParams.assetManager(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() - public verify_asset_params_get_reserve(a: Asset): Account { + public verify_asset_params_get_reserve(a: Asset): Address { const [value, exists] = op.AssetParams.assetReserve(a) const [value_index, exists_index] = op.AssetParams.assetReserve(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() - public verify_asset_params_get_freeze(a: Asset): Account { + public verify_asset_params_get_freeze(a: Asset): Address { const [value, exists] = op.AssetParams.assetFreeze(a) const [value_index, exists_index] = op.AssetParams.assetFreeze(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() - public verify_asset_params_get_clawback(a: Asset): Account { + public verify_asset_params_get_clawback(a: Asset): Address { const [value, exists] = op.AssetParams.assetClawback(a) const [value_index, exists_index] = op.AssetParams.assetClawback(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() - public verify_asset_params_get_creator(a: Asset): Account { + public verify_asset_params_get_creator(a: Asset): Address { const [value, exists] = op.AssetParams.assetCreator(a) const [value_index, exists_index] = op.AssetParams.assetCreator(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } } @@ -333,24 +328,21 @@ export class StateAppParamsContract extends arc4.Contract { } @arc4.abimethod() - public verify_app_params_get_creator(a: Application): Account { + public verify_app_params_get_creator(a: Application): Address { const [value, exists] = op.AppParams.appCreator(a) const [value_index, exists_index] = op.AppParams.appCreator(get_1st_ref_index()) assert(value === value_index, 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } @arc4.abimethod() - public verify_app_params_get_address(a: Application): Account { + public verify_app_params_get_address(a: Application): Address { const [value, exists] = op.AppParams.appAddress(a) const [value_index, exists_index] = op.AppParams.appAddress(get_1st_ref_index()) - // TODO: recompile when puya ts is ready assert(value.bytes.toString() === value_index.bytes.toString(), 'expected value by index to match') assert(exists === exists_index, 'expected exists by index to match') - // TODO: return arc4.Address(value) - return value + return new Address(value) } } @@ -359,9 +351,8 @@ export class StateAppGlobalExContract extends arc4.Contract { globalBytes = GlobalState({ key: Bytes('global_bytes'), initialValue: Bytes('dummy_bytes') }) global_uint64_explicit = GlobalState({ initialValue: Uint64(2) }) global_bytes_explicit = GlobalState({ initialValue: Bytes('dummy_bytes') }) - // TODO: uncomment when arc4 types are ready - // globalArc4Bytes = GlobalState({ key: Bytes('global_arc4_bytes'), initialValue: arc4.DynamicBytes('dummy_arc4_bytes') }) - // global_arc4_bytes_explicit = GlobalState({ initialValue: arc4.DynamicBytes('dummy_arc4_bytes') }) + globalArc4Bytes = GlobalState({ key: Bytes('global_arc4_bytes'), initialValue: new DynamicBytes('dummy_arc4_bytes') }) + global_arc4_bytes_explicit = GlobalState({ initialValue: new DynamicBytes('dummy_arc4_bytes') }) } export class StateAppGlobalContract extends arc4.Contract { @@ -409,16 +400,13 @@ export class StateAppGlobalContract extends arc4.Contract { export class StateAppLocalExContract extends arc4.Contract { localUint64 = LocalState({ key: 'local_uint64' }) localBytes = LocalState({ key: 'local_bytes' }) - - // TODO: uncomment when arc4 types are ready - // localArc4Bytes = LocalState({ key: "local_arc4_bytes" }) + localArc4Bytes = LocalState({ key: 'local_arc4_bytes' }) @arc4.abimethod({ allowActions: ['OptIn'] }) - optIn(): void { + opt_in(): void { this.localBytes(Global.creatorAddress).value = Bytes('dummy_bytes_from_external_contract') this.localUint64(Global.creatorAddress).value = Uint64(99) - // TODO: uncomment when arc4 types are ready - // this.localArc4Bytes(Global.creatorAddress).value = arc4.DynamicBytes("dummy_arc4_bytes") + this.localArc4Bytes(Global.creatorAddress).value = new DynamicBytes('dummy_arc4_bytes') } } @@ -600,5 +588,277 @@ export class ItxnDemoContract extends BaseContract { } } -// TODO: add GlobalStateContract when arc4 types are ready -// TODO: add LocalStateContract when arc4 types are ready +export class GlobalStateContract extends arc4.Contract { + // Implicit key state variables + implicitKeyArc4UintN64 = GlobalState({ initialValue: new UintN64(1337) }) + implicitKeyArc4Str = GlobalState({ initialValue: new Str('Hello') }) + implicitKeyArc4Byte = GlobalState({ initialValue: new Byte(0) }) + implicitKeyArc4Bool = GlobalState({ initialValue: new Bool(true) }) + implicitKeyArc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress) }) + implicitKeyArc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n) }) + implicitKeyArc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes') }) + + // Explicit key state variables + arc4UintN64 = GlobalState({ initialValue: new UintN64(1337), key: 'explicit_key_arc4_uintn64' }) + arc4Str = GlobalState({ initialValue: new Str('Hello'), key: 'explicit_key_arc4_str' }) + arc4Byte = GlobalState({ initialValue: new Byte(0), key: 'explicit_key_arc4_byte' }) + arc4Bool = GlobalState({ initialValue: new Bool(true), key: 'explicit_key_arc4_bool' }) + arc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress), key: 'explicit_key_arc4_address' }) + arc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n), key: 'explicit_key_arc4_uintn128' }) + arc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes'), key: 'explicit_key_arc4_dynamic_bytes' }) + + // Getter methods for implicit key state variables + @arc4.abimethod() + get_implicit_key_arc4_uintn64(): UintN64 { + return this.implicitKeyArc4UintN64.value + } + + @arc4.abimethod() + get_implicit_key_arc4_str(): Str { + return this.implicitKeyArc4Str.value + } + + @arc4.abimethod() + get_implicit_key_arc4_byte(): Byte { + return this.implicitKeyArc4Byte.value + } + + @arc4.abimethod() + get_implicit_key_arc4_bool(): arc4.Bool { + return this.implicitKeyArc4Bool.value + } + + @arc4.abimethod() + get_implicit_key_arc4_address(): Address { + return this.implicitKeyArc4Address.value + } + + @arc4.abimethod() + get_implicit_key_arc4_uintn128(): UintN128 { + return this.implicitKeyArc4UintN128.value + } + + @arc4.abimethod() + get_implicit_key_arc4_dynamic_bytes(): DynamicBytes { + return this.implicitKeyArc4DynamicBytes.value + } + + // Getter methods for explicit key state variables + @arc4.abimethod() + get_arc4_uintn64(): UintN64 { + return this.arc4UintN64.value + } + + @arc4.abimethod() + get_arc4_str(): Str { + return this.arc4Str.value + } + + @arc4.abimethod() + get_arc4_byte(): Byte { + return this.arc4Byte.value + } + + @arc4.abimethod() + get_arc4_bool(): arc4.Bool { + return this.arc4Bool.value + } + + @arc4.abimethod() + get_arc4_address(): Address { + return this.arc4Address.value + } + + @arc4.abimethod() + get_arc4_uintn128(): UintN128 { + return this.arc4UintN128.value + } + + @arc4.abimethod() + get_arc4_dynamic_bytes(): DynamicBytes { + return this.arc4DynamicBytes.value + } + + // Setter methods for implicit key state variables + @arc4.abimethod() + set_implicit_key_arc4_uintn64(value: UintN64) { + this.implicitKeyArc4UintN64.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_str(value: Str) { + this.implicitKeyArc4Str.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_byte(value: Byte) { + this.implicitKeyArc4Byte.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_bool(value: Bool) { + this.implicitKeyArc4Bool.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_address(value: Address) { + this.implicitKeyArc4Address.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_uintn128(value: UintN128) { + this.implicitKeyArc4UintN128.value = value + } + + @arc4.abimethod() + set_implicit_key_arc4_dynamic_bytes(value: DynamicBytes) { + this.implicitKeyArc4DynamicBytes.value = value + } + + // Setter methods for explicit key state variables + @arc4.abimethod() + set_arc4_uintn64(value: UintN64) { + this.arc4UintN64.value = value + } + + @arc4.abimethod() + set_arc4_str(value: Str) { + this.arc4Str.value = value + } + + @arc4.abimethod() + set_arc4_byte(value: Byte) { + this.arc4Byte.value = value + } + + @arc4.abimethod() + set_arc4_bool(value: Bool) { + this.arc4Bool.value = value + } + + @arc4.abimethod() + set_arc4_address(value: Address) { + this.arc4Address.value = value + } + + @arc4.abimethod() + set_arc4_uintn128(value: UintN128) { + this.arc4UintN128.value = value + } + + @arc4.abimethod() + set_arc4_dynamic_bytes(value: DynamicBytes) { + this.arc4DynamicBytes.value = value + } +} + +export class LocalStateContract extends arc4.Contract { + // Implicit key state variables + implicitKeyArc4UintN64 = LocalState() + implicitKeyArc4Str = LocalState() + implicitKeyArc4Byte = LocalState() + implicitKeyArc4Bool = LocalState() + implicitKeyArc4Address = LocalState
() + implicitKeyArc4UintN128 = LocalState() + implicitKeyArc4DynamicBytes = LocalState() + + // Explicit key state variables + arc4UintN64 = LocalState({ key: 'explicit_key_arc4_uintn64' }) + arc4Str = LocalState({ key: 'explicit_key_arc4_str' }) + arc4Byte = LocalState({ key: 'explicit_key_arc4_byte' }) + arc4Bool = LocalState({ key: 'explicit_key_arc4_bool' }) + arc4Address = LocalState
({ key: 'explicit_key_arc4_address' }) + arc4UintN128 = LocalState({ key: 'explicit_key_arc4_uintn128' }) + arc4DynamicBytes = LocalState({ key: 'explicit_key_arc4_dynamic_bytes' }) + + @arc4.abimethod({ allowActions: ['OptIn'] }) + opt_in(): void { + this.implicitKeyArc4UintN64(Global.creatorAddress).value = new UintN64(1337) + this.implicitKeyArc4Str(Global.creatorAddress).value = new Str('Hello') + this.implicitKeyArc4Byte(Global.creatorAddress).value = new Byte(0) + this.implicitKeyArc4Bool(Global.creatorAddress).value = new Bool(true) + this.implicitKeyArc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + this.implicitKeyArc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + this.implicitKeyArc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + + this.arc4UintN64(Global.creatorAddress).value = new UintN64(1337) + this.arc4Str(Global.creatorAddress).value = new Str('Hello') + this.arc4Byte(Global.creatorAddress).value = new Byte(0) + this.arc4Bool(Global.creatorAddress).value = new Bool(true) + this.arc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + this.arc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + this.arc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + } + + // Getter methods for implicit key state variables + @arc4.abimethod() + get_implicit_key_arc4_uintn64(a: Account): UintN64 { + return this.implicitKeyArc4UintN64(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_str(a: Account): Str { + return this.implicitKeyArc4Str(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_byte(a: Account): Byte { + return this.implicitKeyArc4Byte(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_bool(a: Account): Bool { + return this.implicitKeyArc4Bool(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_address(a: Account): Address { + return this.implicitKeyArc4Address(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_uintn128(a: Account): UintN128 { + return this.implicitKeyArc4UintN128(a).value + } + + @arc4.abimethod() + get_implicit_key_arc4_dynamic_bytes(a: Account): DynamicBytes { + return this.implicitKeyArc4DynamicBytes(a).value + } + + // Getter methods for explicit key state variables + @arc4.abimethod() + get_arc4_uintn64(a: Account): arc4.UintN64 { + return this.arc4UintN64(a).value + } + + @arc4.abimethod() + get_arc4_str(a: Account): Str { + return this.arc4Str(a).value + } + + @arc4.abimethod() + get_arc4_byte(a: Account): Byte { + return this.arc4Byte(a).value + } + + @arc4.abimethod() + get_arc4_bool(a: Account): Bool { + return this.arc4Bool(a).value + } + + @arc4.abimethod() + get_arc4_address(a: Account): Address { + return this.arc4Address(a).value + } + + @arc4.abimethod() + get_arc4_uintn128(a: Account): UintN128 { + return this.arc4UintN128(a).value + } + + @arc4.abimethod() + get_arc4_dynamic_bytes(a: Account): DynamicBytes { + return this.arc4DynamicBytes(a).value + } +} diff --git a/tests/artifacts/state-ops/data/GlobalStateContract.approval.teal b/tests/artifacts/state-ops/data/GlobalStateContract.approval.teal new file mode 100644 index 0000000..caeee01 --- /dev/null +++ b/tests/artifacts/state-ops/data/GlobalStateContract.approval.teal @@ -0,0 +1,1073 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 "implicitKeyArc4UintN64" "implicitKeyArc4Str" "implicitKeyArc4Byte" "implicitKeyArc4Bool" "implicitKeyArc4Address" "implicitKeyArc4UintN128" "implicitKeyArc4DynamicBytes" "explicit_key_arc4_uintn64" "explicit_key_arc4_str" "explicit_key_arc4_byte" "explicit_key_arc4_bool" "explicit_key_arc4_address" "explicit_key_arc4_uintn128" "explicit_key_arc4_dynamic_bytes" 0x0000000000000539 0x000548656c6c6f 0x00000010000000000000000000000000 0x000d64796e616d6963206279746573 + txn ApplicationID + bnz main_after_if_else@2 + callsub constructor + +main_after_if_else@2: + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.constructor() -> void: +constructor: + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + proto 0 0 + // tests/artifacts/state-ops/contract.algo.ts:593 + // implicitKeyArc4UintN64 = GlobalState({ initialValue: new UintN64(1337) }) + bytec_1 // "implicitKeyArc4UintN64" + bytec 15 // 0x0000000000000539 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:594 + // implicitKeyArc4Str = GlobalState({ initialValue: new Str('Hello') }) + bytec_2 // "implicitKeyArc4Str" + bytec 16 // 0x000548656c6c6f + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:595 + // implicitKeyArc4Byte = GlobalState({ initialValue: new Byte(0) }) + bytec_3 // "implicitKeyArc4Byte" + pushbytes 0x00 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:596 + // implicitKeyArc4Bool = GlobalState({ initialValue: new Bool(true) }) + bytec 4 // "implicitKeyArc4Bool" + pushbytes 0x80 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:597 + // implicitKeyArc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress) }) + bytec 5 // "implicitKeyArc4Address" + global CreatorAddress + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:598 + // implicitKeyArc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n) }) + bytec 6 // "implicitKeyArc4UintN128" + bytec 17 // 0x00000010000000000000000000000000 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:599 + // implicitKeyArc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes') }) + bytec 7 // "implicitKeyArc4DynamicBytes" + bytec 18 // 0x000d64796e616d6963206279746573 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:602 + // arc4UintN64 = GlobalState({ initialValue: new UintN64(1337), key: 'explicit_key_arc4_uintn64' }) + bytec 8 // "explicit_key_arc4_uintn64" + bytec 15 // 0x0000000000000539 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:603 + // arc4Str = GlobalState({ initialValue: new Str('Hello'), key: 'explicit_key_arc4_str' }) + bytec 9 // "explicit_key_arc4_str" + bytec 16 // 0x000548656c6c6f + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:604 + // arc4Byte = GlobalState({ initialValue: new Byte(0), key: 'explicit_key_arc4_byte' }) + bytec 10 // "explicit_key_arc4_byte" + pushbytes 0x00 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:605 + // arc4Bool = GlobalState({ initialValue: new Bool(true), key: 'explicit_key_arc4_bool' }) + bytec 11 // "explicit_key_arc4_bool" + pushbytes 0x80 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:606 + // arc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress), key: 'explicit_key_arc4_address' }) + bytec 12 // "explicit_key_arc4_address" + global CreatorAddress + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:607 + // arc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n), key: 'explicit_key_arc4_uintn128' }) + bytec 13 // "explicit_key_arc4_uintn128" + bytec 17 // 0x00000010000000000000000000000000 + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:608 + // arc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes'), key: 'explicit_key_arc4_dynamic_bytes' }) + bytec 14 // "explicit_key_arc4_dynamic_bytes" + bytec 18 // 0x000d64796e616d6963206279746573 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + proto 0 1 + txn NumAppArgs + bz __puya_arc4_router___bare_routing@32 + pushbytess 0x8ab7f8bf 0x86ec24f3 0x69128e90 0x68d590e2 0x44ef0681 0x5c21bd60 0xaac8ecb1 0xa15288ce 0x5f23acfd 0xded75033 0x66279e93 0x096e927b 0x106bc00b 0x6ea3f996 0x3df0a2cd 0x8c4d8f80 0x5ec3116d 0x20f56eee 0x1c149a43 0x8e6a1dde 0x87f0869b 0x026469a1 0xf054ab7b 0xd2e646ef 0xe674a270 0xa87e540d 0x58a7404a 0x257708f7 // method "get_implicit_key_arc4_uintn64()uint64", method "get_implicit_key_arc4_str()string", method "get_implicit_key_arc4_byte()byte", method "get_implicit_key_arc4_bool()bool", method "get_implicit_key_arc4_address()address", method "get_implicit_key_arc4_uintn128()uint128", method "get_implicit_key_arc4_dynamic_bytes()byte[]", method "get_arc4_uintn64()uint64", method "get_arc4_str()string", method "get_arc4_byte()byte", method "get_arc4_bool()bool", method "get_arc4_address()address", method "get_arc4_uintn128()uint128", method "get_arc4_dynamic_bytes()byte[]", method "set_implicit_key_arc4_uintn64(uint64)void", method "set_implicit_key_arc4_str(string)void", method "set_implicit_key_arc4_byte(byte)void", method "set_implicit_key_arc4_bool(bool)void", method "set_implicit_key_arc4_address(address)void", method "set_implicit_key_arc4_uintn128(uint128)void", method "set_implicit_key_arc4_dynamic_bytes(byte[])void", method "set_arc4_uintn64(uint64)void", method "set_arc4_str(string)void", method "set_arc4_byte(byte)void", method "set_arc4_bool(bool)void", method "set_arc4_address(address)void", method "set_arc4_uintn128(uint128)void", method "set_arc4_dynamic_bytes(byte[])void" + txna ApplicationArgs 0 + match __puya_arc4_router___get_implicit_key_arc4_uintn64_route@2 __puya_arc4_router___get_implicit_key_arc4_str_route@3 __puya_arc4_router___get_implicit_key_arc4_byte_route@4 __puya_arc4_router___get_implicit_key_arc4_bool_route@5 __puya_arc4_router___get_implicit_key_arc4_address_route@6 __puya_arc4_router___get_implicit_key_arc4_uintn128_route@7 __puya_arc4_router___get_implicit_key_arc4_dynamic_bytes_route@8 __puya_arc4_router___get_arc4_uintn64_route@9 __puya_arc4_router___get_arc4_str_route@10 __puya_arc4_router___get_arc4_byte_route@11 __puya_arc4_router___get_arc4_bool_route@12 __puya_arc4_router___get_arc4_address_route@13 __puya_arc4_router___get_arc4_uintn128_route@14 __puya_arc4_router___get_arc4_dynamic_bytes_route@15 __puya_arc4_router___set_implicit_key_arc4_uintn64_route@16 __puya_arc4_router___set_implicit_key_arc4_str_route@17 __puya_arc4_router___set_implicit_key_arc4_byte_route@18 __puya_arc4_router___set_implicit_key_arc4_bool_route@19 __puya_arc4_router___set_implicit_key_arc4_address_route@20 __puya_arc4_router___set_implicit_key_arc4_uintn128_route@21 __puya_arc4_router___set_implicit_key_arc4_dynamic_bytes_route@22 __puya_arc4_router___set_arc4_uintn64_route@23 __puya_arc4_router___set_arc4_str_route@24 __puya_arc4_router___set_arc4_byte_route@25 __puya_arc4_router___set_arc4_bool_route@26 __puya_arc4_router___set_arc4_address_route@27 __puya_arc4_router___set_arc4_uintn128_route@28 __puya_arc4_router___set_arc4_dynamic_bytes_route@29 + intc_1 // 0 + retsub + +__puya_arc4_router___get_implicit_key_arc4_uintn64_route@2: + // tests/artifacts/state-ops/contract.algo.ts:611 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_uintn64 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_str_route@3: + // tests/artifacts/state-ops/contract.algo.ts:616 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_str + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_byte_route@4: + // tests/artifacts/state-ops/contract.algo.ts:621 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_byte + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_bool_route@5: + // tests/artifacts/state-ops/contract.algo.ts:626 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_bool + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_address_route@6: + // tests/artifacts/state-ops/contract.algo.ts:631 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_address + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_uintn128_route@7: + // tests/artifacts/state-ops/contract.algo.ts:636 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_uintn128 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_dynamic_bytes_route@8: + // tests/artifacts/state-ops/contract.algo.ts:641 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_implicit_key_arc4_dynamic_bytes + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_uintn64_route@9: + // tests/artifacts/state-ops/contract.algo.ts:647 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_uintn64 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_str_route@10: + // tests/artifacts/state-ops/contract.algo.ts:652 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_str + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_byte_route@11: + // tests/artifacts/state-ops/contract.algo.ts:657 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_byte + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_bool_route@12: + // tests/artifacts/state-ops/contract.algo.ts:662 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_bool + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_address_route@13: + // tests/artifacts/state-ops/contract.algo.ts:667 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_address + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_uintn128_route@14: + // tests/artifacts/state-ops/contract.algo.ts:672 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_uintn128 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_dynamic_bytes_route@15: + // tests/artifacts/state-ops/contract.algo.ts:677 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_arc4_dynamic_bytes + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_uintn64_route@16: + // tests/artifacts/state-ops/contract.algo.ts:683 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:683 + // @arc4.abimethod() + callsub set_implicit_key_arc4_uintn64 + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_str_route@17: + // tests/artifacts/state-ops/contract.algo.ts:688 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:688 + // @arc4.abimethod() + callsub set_implicit_key_arc4_str + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_byte_route@18: + // tests/artifacts/state-ops/contract.algo.ts:693 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:693 + // @arc4.abimethod() + callsub set_implicit_key_arc4_byte + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_bool_route@19: + // tests/artifacts/state-ops/contract.algo.ts:698 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:698 + // @arc4.abimethod() + callsub set_implicit_key_arc4_bool + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_address_route@20: + // tests/artifacts/state-ops/contract.algo.ts:703 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:703 + // @arc4.abimethod() + callsub set_implicit_key_arc4_address + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_uintn128_route@21: + // tests/artifacts/state-ops/contract.algo.ts:708 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:708 + // @arc4.abimethod() + callsub set_implicit_key_arc4_uintn128 + intc_0 // 1 + retsub + +__puya_arc4_router___set_implicit_key_arc4_dynamic_bytes_route@22: + // tests/artifacts/state-ops/contract.algo.ts:713 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:713 + // @arc4.abimethod() + callsub set_implicit_key_arc4_dynamic_bytes + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_uintn64_route@23: + // tests/artifacts/state-ops/contract.algo.ts:719 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:719 + // @arc4.abimethod() + callsub set_arc4_uintn64 + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_str_route@24: + // tests/artifacts/state-ops/contract.algo.ts:724 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:724 + // @arc4.abimethod() + callsub set_arc4_str + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_byte_route@25: + // tests/artifacts/state-ops/contract.algo.ts:729 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:729 + // @arc4.abimethod() + callsub set_arc4_byte + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_bool_route@26: + // tests/artifacts/state-ops/contract.algo.ts:734 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:734 + // @arc4.abimethod() + callsub set_arc4_bool + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_address_route@27: + // tests/artifacts/state-ops/contract.algo.ts:739 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:739 + // @arc4.abimethod() + callsub set_arc4_address + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_uintn128_route@28: + // tests/artifacts/state-ops/contract.algo.ts:744 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:744 + // @arc4.abimethod() + callsub set_arc4_uintn128 + intc_0 // 1 + retsub + +__puya_arc4_router___set_arc4_dynamic_bytes_route@29: + // tests/artifacts/state-ops/contract.algo.ts:749 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:749 + // @arc4.abimethod() + callsub set_arc4_dynamic_bytes + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@32: + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + txn OnCompletion + bnz __puya_arc4_router___after_if_else@36 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@36: + // tests/artifacts/state-ops/contract.algo.ts:591 + // export class GlobalStateContract extends arc4.Contract { + intc_1 // 0 + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_uintn64() -> bytes: +get_implicit_key_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:611-612 + // @arc4.abimethod() + // get_implicit_key_arc4_uintn64(): UintN64 { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:613 + // return this.implicitKeyArc4UintN64.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:593 + // implicitKeyArc4UintN64 = GlobalState({ initialValue: new UintN64(1337) }) + bytec_1 // "implicitKeyArc4UintN64" + // tests/artifacts/state-ops/contract.algo.ts:613 + // return this.implicitKeyArc4UintN64.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_str() -> bytes: +get_implicit_key_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:616-617 + // @arc4.abimethod() + // get_implicit_key_arc4_str(): Str { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:618 + // return this.implicitKeyArc4Str.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:594 + // implicitKeyArc4Str = GlobalState({ initialValue: new Str('Hello') }) + bytec_2 // "implicitKeyArc4Str" + // tests/artifacts/state-ops/contract.algo.ts:618 + // return this.implicitKeyArc4Str.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_byte() -> bytes: +get_implicit_key_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:621-622 + // @arc4.abimethod() + // get_implicit_key_arc4_byte(): Byte { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:623 + // return this.implicitKeyArc4Byte.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:595 + // implicitKeyArc4Byte = GlobalState({ initialValue: new Byte(0) }) + bytec_3 // "implicitKeyArc4Byte" + // tests/artifacts/state-ops/contract.algo.ts:623 + // return this.implicitKeyArc4Byte.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_bool() -> bytes: +get_implicit_key_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:626-627 + // @arc4.abimethod() + // get_implicit_key_arc4_bool(): arc4.Bool { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:628 + // return this.implicitKeyArc4Bool.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:596 + // implicitKeyArc4Bool = GlobalState({ initialValue: new Bool(true) }) + bytec 4 // "implicitKeyArc4Bool" + // tests/artifacts/state-ops/contract.algo.ts:628 + // return this.implicitKeyArc4Bool.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_address() -> bytes: +get_implicit_key_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:631-632 + // @arc4.abimethod() + // get_implicit_key_arc4_address(): Address { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:633 + // return this.implicitKeyArc4Address.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:597 + // implicitKeyArc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress) }) + bytec 5 // "implicitKeyArc4Address" + // tests/artifacts/state-ops/contract.algo.ts:633 + // return this.implicitKeyArc4Address.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_uintn128() -> bytes: +get_implicit_key_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:636-637 + // @arc4.abimethod() + // get_implicit_key_arc4_uintn128(): UintN128 { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:638 + // return this.implicitKeyArc4UintN128.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:598 + // implicitKeyArc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n) }) + bytec 6 // "implicitKeyArc4UintN128" + // tests/artifacts/state-ops/contract.algo.ts:638 + // return this.implicitKeyArc4UintN128.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_implicit_key_arc4_dynamic_bytes() -> bytes: +get_implicit_key_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:641-642 + // @arc4.abimethod() + // get_implicit_key_arc4_dynamic_bytes(): DynamicBytes { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:643 + // return this.implicitKeyArc4DynamicBytes.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:599 + // implicitKeyArc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes') }) + bytec 7 // "implicitKeyArc4DynamicBytes" + // tests/artifacts/state-ops/contract.algo.ts:643 + // return this.implicitKeyArc4DynamicBytes.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_uintn64() -> bytes: +get_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:647-648 + // @arc4.abimethod() + // get_arc4_uintn64(): UintN64 { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:649 + // return this.arc4UintN64.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:602 + // arc4UintN64 = GlobalState({ initialValue: new UintN64(1337), key: 'explicit_key_arc4_uintn64' }) + bytec 8 // "explicit_key_arc4_uintn64" + // tests/artifacts/state-ops/contract.algo.ts:649 + // return this.arc4UintN64.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_str() -> bytes: +get_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:652-653 + // @arc4.abimethod() + // get_arc4_str(): Str { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:654 + // return this.arc4Str.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:603 + // arc4Str = GlobalState({ initialValue: new Str('Hello'), key: 'explicit_key_arc4_str' }) + bytec 9 // "explicit_key_arc4_str" + // tests/artifacts/state-ops/contract.algo.ts:654 + // return this.arc4Str.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_byte() -> bytes: +get_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:657-658 + // @arc4.abimethod() + // get_arc4_byte(): Byte { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:659 + // return this.arc4Byte.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:604 + // arc4Byte = GlobalState({ initialValue: new Byte(0), key: 'explicit_key_arc4_byte' }) + bytec 10 // "explicit_key_arc4_byte" + // tests/artifacts/state-ops/contract.algo.ts:659 + // return this.arc4Byte.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_bool() -> bytes: +get_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:662-663 + // @arc4.abimethod() + // get_arc4_bool(): arc4.Bool { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:664 + // return this.arc4Bool.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:605 + // arc4Bool = GlobalState({ initialValue: new Bool(true), key: 'explicit_key_arc4_bool' }) + bytec 11 // "explicit_key_arc4_bool" + // tests/artifacts/state-ops/contract.algo.ts:664 + // return this.arc4Bool.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_address() -> bytes: +get_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:667-668 + // @arc4.abimethod() + // get_arc4_address(): Address { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:669 + // return this.arc4Address.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:606 + // arc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress), key: 'explicit_key_arc4_address' }) + bytec 12 // "explicit_key_arc4_address" + // tests/artifacts/state-ops/contract.algo.ts:669 + // return this.arc4Address.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_uintn128() -> bytes: +get_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:672-673 + // @arc4.abimethod() + // get_arc4_uintn128(): UintN128 { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:674 + // return this.arc4UintN128.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:607 + // arc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n), key: 'explicit_key_arc4_uintn128' }) + bytec 13 // "explicit_key_arc4_uintn128" + // tests/artifacts/state-ops/contract.algo.ts:674 + // return this.arc4UintN128.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.get_arc4_dynamic_bytes() -> bytes: +get_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:677-678 + // @arc4.abimethod() + // get_arc4_dynamic_bytes(): DynamicBytes { + proto 0 1 + // tests/artifacts/state-ops/contract.algo.ts:679 + // return this.arc4DynamicBytes.value + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:608 + // arc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes'), key: 'explicit_key_arc4_dynamic_bytes' }) + bytec 14 // "explicit_key_arc4_dynamic_bytes" + // tests/artifacts/state-ops/contract.algo.ts:679 + // return this.arc4DynamicBytes.value + app_global_get_ex + assert // check GlobalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_uintn64(value: bytes) -> void: +set_implicit_key_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:683-684 + // @arc4.abimethod() + // set_implicit_key_arc4_uintn64(value: UintN64) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:593 + // implicitKeyArc4UintN64 = GlobalState({ initialValue: new UintN64(1337) }) + bytec_1 // "implicitKeyArc4UintN64" + // tests/artifacts/state-ops/contract.algo.ts:685 + // this.implicitKeyArc4UintN64.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_str(value: bytes) -> void: +set_implicit_key_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:688-689 + // @arc4.abimethod() + // set_implicit_key_arc4_str(value: Str) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:594 + // implicitKeyArc4Str = GlobalState({ initialValue: new Str('Hello') }) + bytec_2 // "implicitKeyArc4Str" + // tests/artifacts/state-ops/contract.algo.ts:690 + // this.implicitKeyArc4Str.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_byte(value: bytes) -> void: +set_implicit_key_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:693-694 + // @arc4.abimethod() + // set_implicit_key_arc4_byte(value: Byte) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:595 + // implicitKeyArc4Byte = GlobalState({ initialValue: new Byte(0) }) + bytec_3 // "implicitKeyArc4Byte" + // tests/artifacts/state-ops/contract.algo.ts:695 + // this.implicitKeyArc4Byte.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_bool(value: bytes) -> void: +set_implicit_key_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:698-699 + // @arc4.abimethod() + // set_implicit_key_arc4_bool(value: Bool) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:596 + // implicitKeyArc4Bool = GlobalState({ initialValue: new Bool(true) }) + bytec 4 // "implicitKeyArc4Bool" + // tests/artifacts/state-ops/contract.algo.ts:700 + // this.implicitKeyArc4Bool.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_address(value: bytes) -> void: +set_implicit_key_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:703-704 + // @arc4.abimethod() + // set_implicit_key_arc4_address(value: Address) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:597 + // implicitKeyArc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress) }) + bytec 5 // "implicitKeyArc4Address" + // tests/artifacts/state-ops/contract.algo.ts:705 + // this.implicitKeyArc4Address.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_uintn128(value: bytes) -> void: +set_implicit_key_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:708-709 + // @arc4.abimethod() + // set_implicit_key_arc4_uintn128(value: UintN128) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:598 + // implicitKeyArc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n) }) + bytec 6 // "implicitKeyArc4UintN128" + // tests/artifacts/state-ops/contract.algo.ts:710 + // this.implicitKeyArc4UintN128.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_implicit_key_arc4_dynamic_bytes(value: bytes) -> void: +set_implicit_key_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:713-714 + // @arc4.abimethod() + // set_implicit_key_arc4_dynamic_bytes(value: DynamicBytes) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:599 + // implicitKeyArc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes') }) + bytec 7 // "implicitKeyArc4DynamicBytes" + // tests/artifacts/state-ops/contract.algo.ts:715 + // this.implicitKeyArc4DynamicBytes.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_uintn64(value: bytes) -> void: +set_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:719-720 + // @arc4.abimethod() + // set_arc4_uintn64(value: UintN64) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:602 + // arc4UintN64 = GlobalState({ initialValue: new UintN64(1337), key: 'explicit_key_arc4_uintn64' }) + bytec 8 // "explicit_key_arc4_uintn64" + // tests/artifacts/state-ops/contract.algo.ts:721 + // this.arc4UintN64.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_str(value: bytes) -> void: +set_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:724-725 + // @arc4.abimethod() + // set_arc4_str(value: Str) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:603 + // arc4Str = GlobalState({ initialValue: new Str('Hello'), key: 'explicit_key_arc4_str' }) + bytec 9 // "explicit_key_arc4_str" + // tests/artifacts/state-ops/contract.algo.ts:726 + // this.arc4Str.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_byte(value: bytes) -> void: +set_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:729-730 + // @arc4.abimethod() + // set_arc4_byte(value: Byte) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:604 + // arc4Byte = GlobalState({ initialValue: new Byte(0), key: 'explicit_key_arc4_byte' }) + bytec 10 // "explicit_key_arc4_byte" + // tests/artifacts/state-ops/contract.algo.ts:731 + // this.arc4Byte.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_bool(value: bytes) -> void: +set_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:734-735 + // @arc4.abimethod() + // set_arc4_bool(value: Bool) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:605 + // arc4Bool = GlobalState({ initialValue: new Bool(true), key: 'explicit_key_arc4_bool' }) + bytec 11 // "explicit_key_arc4_bool" + // tests/artifacts/state-ops/contract.algo.ts:736 + // this.arc4Bool.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_address(value: bytes) -> void: +set_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:739-740 + // @arc4.abimethod() + // set_arc4_address(value: Address) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:606 + // arc4Address = GlobalState({ initialValue: new Address(Global.creatorAddress), key: 'explicit_key_arc4_address' }) + bytec 12 // "explicit_key_arc4_address" + // tests/artifacts/state-ops/contract.algo.ts:741 + // this.arc4Address.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_uintn128(value: bytes) -> void: +set_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:744-745 + // @arc4.abimethod() + // set_arc4_uintn128(value: UintN128) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:607 + // arc4UintN128 = GlobalState({ initialValue: new UintN128(2n ** 100n), key: 'explicit_key_arc4_uintn128' }) + bytec 13 // "explicit_key_arc4_uintn128" + // tests/artifacts/state-ops/contract.algo.ts:746 + // this.arc4UintN128.value = value + frame_dig -1 + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.set_arc4_dynamic_bytes(value: bytes) -> void: +set_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:749-750 + // @arc4.abimethod() + // set_arc4_dynamic_bytes(value: DynamicBytes) { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:608 + // arc4DynamicBytes = GlobalState({ initialValue: new DynamicBytes('dynamic bytes'), key: 'explicit_key_arc4_dynamic_bytes' }) + bytec 14 // "explicit_key_arc4_dynamic_bytes" + // tests/artifacts/state-ops/contract.algo.ts:751 + // this.arc4DynamicBytes.value = value + frame_dig -1 + app_global_put + retsub diff --git a/tests/artifacts/state-ops/data/GlobalStateContract.arc32.json b/tests/artifacts/state-ops/data/GlobalStateContract.arc32.json new file mode 100644 index 0000000..84d439a --- /dev/null +++ b/tests/artifacts/state-ops/data/GlobalStateContract.arc32.json @@ -0,0 +1,528 @@ +{ + "hints": { + "get_implicit_key_arc4_uintn64()uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_str()string": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_byte()byte": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_bool()bool": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_address()address": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_uintn128()uint128": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_dynamic_bytes()byte[]": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_uintn64()uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_str()string": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_byte()byte": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_bool()bool": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_address()address": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_uintn128()uint128": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_dynamic_bytes()byte[]": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_uintn64(uint64)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_str(string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_byte(byte)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_bool(bool)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_address(address)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_uintn128(uint128)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_implicit_key_arc4_dynamic_bytes(byte[])void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_uintn64(uint64)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_str(string)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_byte(byte)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_bool(bool)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_address(address)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_uintn128(uint128)void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_arc4_dynamic_bytes(byte[])void": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IiAiaW1wbGljaXRLZXlBcmM0U3RyIiAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIgImltcGxpY2l0S2V5QXJjNEJvb2wiICJpbXBsaWNpdEtleUFyYzRBZGRyZXNzIiAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludG4xMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIGNvbnN0cnVjdG9yCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5jb25zdHJ1Y3RvcigpIC0+IHZvaWQ6CmNvbnN0cnVjdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MwogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSB9KQogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRLZXlBcmM0VWludE42NCIKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIGltcGxpY2l0S2V5QXJjNFN0ciA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgU3RyKCdIZWxsbycpIH0pCiAgICBieXRlY18yIC8vICJpbXBsaWNpdEtleUFyYzRTdHIiCiAgICBieXRlYyAxNiAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQnl0ZSgwKSB9KQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gaW1wbGljaXRLZXlBcmM0Qm9vbCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQm9vbCh0cnVlKSB9KQogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRLZXlBcmM0Qm9vbCIKICAgIHB1c2hieXRlcyAweDgwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NwogICAgLy8gaW1wbGljaXRLZXlBcmM0QWRkcmVzcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpIH0pCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdEtleUFyYzRBZGRyZXNzIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5OAogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE4xMjggPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pIH0pCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjEyOCIKICAgIGJ5dGVjIDE3IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk5CiAgICAvLyBpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpIH0pCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiCiAgICBieXRlYyAxOCAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDIKICAgIC8vIGFyYzRVaW50TjY0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjY0KDEzMzcpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCIKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIgogICAgYnl0ZWMgMTYgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIGFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDUKICAgIC8vIGFyYzRCb29sID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCb29sKHRydWUpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ib29sJyB9KQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIGFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbiksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4JyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IgogICAgYnl0ZWMgMTcgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIGFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxOCAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDMyCiAgICBwdXNoYnl0ZXNzIDB4OGFiN2Y4YmYgMHg4NmVjMjRmMyAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDVjMjFiZDYwIDB4YWFjOGVjYjEgMHhhMTUyODhjZSAweDVmMjNhY2ZkIDB4ZGVkNzUwMzMgMHg2NjI3OWU5MyAweDA5NmU5MjdiIDB4MTA2YmMwMGIgMHg2ZWEzZjk5NiAweDNkZjBhMmNkIDB4OGM0ZDhmODAgMHg1ZWMzMTE2ZCAweDIwZjU2ZWVlIDB4MWMxNDlhNDMgMHg4ZTZhMWRkZSAweDg3ZjA4NjliIDB4MDI2NDY5YTEgMHhmMDU0YWI3YiAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDU4YTc0MDRhIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludG42NCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHIoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludG4xMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCh1aW50MTI4KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50bjY0KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnRuMTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG42NF9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3N0cl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ieXRlX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2Jvb2xfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYWRkcmVzc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjEyOF9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDE1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVfcm91dGVAMTggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4X3JvdXRlQDIxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDIyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuNjRfcm91dGVAMjMgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfc3RyX3JvdXRlQDI0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2J5dGVfcm91dGVAMjUgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfYm9vbF9yb3V0ZUAyNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDI3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuMTI4X3JvdXRlQDI4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMjkKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjY0X3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcmM0X3VpbnRuNjQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3N0cl9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FyYzRfc3RyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ieXRlX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9ib29sCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjEyOF9yb3V0ZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyX3JvdXRlQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF91aW50bjY0X3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X3VpbnRuNjQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3N0cl9yb3V0ZUAyNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfYXJjNF9zdHIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2J5dGVfcm91dGVAMjU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2FyYzRfYnl0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfYm9vbF9yb3V0ZUAyNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfYXJjNF9ib29sCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDI3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X2FkZHJlc3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuMTI4X3JvdXRlQDI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X3VpbnRuMTI4CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDI5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAzNgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NCgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTEtNjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoKTogVWludE42NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkzCiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjY0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjY0KDEzMzcpIH0pCiAgICBieXRlY18xIC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjE2LTYxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoKTogU3RyIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYxOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NAogICAgLy8gaW1wbGljaXRLZXlBcmM0U3RyID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBTdHIoJ0hlbGxvJykgfSkKICAgIGJ5dGVjXzIgLy8gImltcGxpY2l0S2V5QXJjNFN0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTgKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFN0ci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjEtNjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoKTogQnl0ZSB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk1CiAgICAvLyBpbXBsaWNpdEtleUFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApIH0pCiAgICBieXRlY18zIC8vICJpbXBsaWNpdEtleUFyYzRCeXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjYtNjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSkgfSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjI4CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRCb29sLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzMS02MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcygpOiBBZGRyZXNzIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0QWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKSB9KQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0QWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzYtNjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KCk6IFVpbnROMTI4IHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk4CiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbikgfSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0S2V5QXJjNFVpbnROMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQxLTY0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKCk6IER5bmFtaWNCeXRlcyB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykgfSkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcy52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50bjY0KCkgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuNjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQ3LTY0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuNjQoKTogVWludE42NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDkKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjY0LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwMgogICAgLy8gYXJjNFVpbnRONjQgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnRONjQoMTMzNyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQnIH0pCiAgICBieXRlYyA4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY0OQogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFVpbnRONjQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyKCkgLT4gYnl0ZXM6CmdldF9hcmM0X3N0cjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTItNjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfc3RyKCk6IFN0ciB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRTdHIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAzCiAgICAvLyBhcmM0U3RyID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBTdHIoJ0hlbGxvJyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3N0cicgfSkKICAgIGJ5dGVjIDkgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRTdHIudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZSgpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY1Ny02NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ieXRlKCk6IEJ5dGUgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0Qnl0ZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIGFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0Qnl0ZS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sKCkgLT4gYnl0ZXM6CmdldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYyLTY2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X2Jvb2woKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2wudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA1CiAgICAvLyBhcmM0Qm9vbCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQm9vbCh0cnVlKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfYm9vbCcgfSkKICAgIGJ5dGVjIDExIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2wudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzcygpIC0+IGJ5dGVzOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2Ny02NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9hZGRyZXNzKCk6IEFkZHJlc3MgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0QWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIHJldHVybiB0aGlzLmFyYzRBZGRyZXNzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRuMTI4KCkgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuMTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3Mi02NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF91aW50bjEyOCgpOiBVaW50TjEyOCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIGFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbiksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4JyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFVpbnROMTI4LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzctNjc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpOiBEeW5hbWljQnl0ZXMgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njc5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0RHluYW1pY0J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwOAogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzkKICAgIC8vIHJldHVybiB0aGlzLmFyYzREeW5hbWljQnl0ZXMudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODMtNjg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodmFsdWU6IFVpbnRONjQpIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MwogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSB9KQogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRLZXlBcmM0VWludE42NCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NC52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cih2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIodmFsdWU6IFN0cikgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBpbXBsaWNpdEtleUFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSB9KQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRLZXlBcmM0U3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRTdHIudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkzLTY5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKHZhbHVlOiBCeXRlKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTUKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJ5dGUgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJ5dGUoMCkgfSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0S2V5QXJjNEJ5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk1CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk4LTY5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKHZhbHVlOiBCb29sKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSkgfSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2wudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAzLTcwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKHZhbHVlOiBBZGRyZXNzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKSB9KQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0QWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MDUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0QWRkcmVzcy52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwOC03MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgodmFsdWU6IFVpbnROMTI4KSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTgKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnROMTI4ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjEyOCgybiAqKiAxMDBuKSB9KQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzEwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxMy03MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogRHluYW1pY0J5dGVzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykgfSkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzLnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF91aW50bjY0KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTktNzIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfdWludG42NCh2YWx1ZTogVWludE42NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAyCiAgICAvLyBhcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCcgfSkKICAgIGJ5dGVjIDggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIxCiAgICAvLyB0aGlzLmFyYzRVaW50TjY0LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9zdHIodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI0LTcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X3N0cih2YWx1ZTogU3RyKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcyNgogICAgLy8gdGhpcy5hcmM0U3RyLnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9ieXRlKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MjktNzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfYnl0ZSh2YWx1ZTogQnl0ZSkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA0CiAgICAvLyBhcmM0Qnl0ZSA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQnl0ZSgwKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfYnl0ZScgfSkKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczMQogICAgLy8gdGhpcy5hcmM0Qnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzM0LTczNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X2Jvb2wodmFsdWU6IEJvb2wpIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwNQogICAgLy8gYXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzYKICAgIC8vIHRoaXMuYXJjNEJvb2wudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2FkZHJlc3ModmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczOS03NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfYXJjNF9hZGRyZXNzKHZhbHVlOiBBZGRyZXNzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDEKICAgIC8vIHRoaXMuYXJjNEFkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRuMTI4KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfdWludG4xMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQ0LTc0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X3VpbnRuMTI4KHZhbHVlOiBVaW50TjEyOCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA3CiAgICAvLyBhcmM0VWludE4xMjggPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDYKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9keW5hbWljX2J5dGVzKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDktNzUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogRHluYW1pY0J5dGVzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIGFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyB0aGlzLmFyYzREeW5hbWljQnl0ZXMudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "state": { + "global": { + "num_byte_slices": 14, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": { + "arc4Address": { + "type": "bytes", + "key": "explicit_key_arc4_address" + }, + "arc4Bool": { + "type": "bytes", + "key": "explicit_key_arc4_bool" + }, + "arc4Byte": { + "type": "bytes", + "key": "explicit_key_arc4_byte" + }, + "arc4DynamicBytes": { + "type": "bytes", + "key": "explicit_key_arc4_dynamic_bytes" + }, + "arc4Str": { + "type": "bytes", + "key": "explicit_key_arc4_str" + }, + "arc4UintN128": { + "type": "bytes", + "key": "explicit_key_arc4_uintn128" + }, + "arc4UintN64": { + "type": "bytes", + "key": "explicit_key_arc4_uintn64" + }, + "implicitKeyArc4Address": { + "type": "bytes", + "key": "implicitKeyArc4Address" + }, + "implicitKeyArc4Bool": { + "type": "bytes", + "key": "implicitKeyArc4Bool" + }, + "implicitKeyArc4Byte": { + "type": "bytes", + "key": "implicitKeyArc4Byte" + }, + "implicitKeyArc4DynamicBytes": { + "type": "bytes", + "key": "implicitKeyArc4DynamicBytes" + }, + "implicitKeyArc4Str": { + "type": "bytes", + "key": "implicitKeyArc4Str" + }, + "implicitKeyArc4UintN128": { + "type": "bytes", + "key": "implicitKeyArc4UintN128" + }, + "implicitKeyArc4UintN64": { + "type": "bytes", + "key": "implicitKeyArc4UintN64" + } + }, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "GlobalStateContract", + "methods": [ + { + "name": "get_implicit_key_arc4_uintn64", + "args": [], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "get_implicit_key_arc4_str", + "args": [], + "readonly": false, + "returns": { + "type": "string" + } + }, + { + "name": "get_implicit_key_arc4_byte", + "args": [], + "readonly": false, + "returns": { + "type": "byte" + } + }, + { + "name": "get_implicit_key_arc4_bool", + "args": [], + "readonly": false, + "returns": { + "type": "bool" + } + }, + { + "name": "get_implicit_key_arc4_address", + "args": [], + "readonly": false, + "returns": { + "type": "address" + } + }, + { + "name": "get_implicit_key_arc4_uintn128", + "args": [], + "readonly": false, + "returns": { + "type": "uint128" + } + }, + { + "name": "get_implicit_key_arc4_dynamic_bytes", + "args": [], + "readonly": false, + "returns": { + "type": "byte[]" + } + }, + { + "name": "get_arc4_uintn64", + "args": [], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "get_arc4_str", + "args": [], + "readonly": false, + "returns": { + "type": "string" + } + }, + { + "name": "get_arc4_byte", + "args": [], + "readonly": false, + "returns": { + "type": "byte" + } + }, + { + "name": "get_arc4_bool", + "args": [], + "readonly": false, + "returns": { + "type": "bool" + } + }, + { + "name": "get_arc4_address", + "args": [], + "readonly": false, + "returns": { + "type": "address" + } + }, + { + "name": "get_arc4_uintn128", + "args": [], + "readonly": false, + "returns": { + "type": "uint128" + } + }, + { + "name": "get_arc4_dynamic_bytes", + "args": [], + "readonly": false, + "returns": { + "type": "byte[]" + } + }, + { + "name": "set_implicit_key_arc4_uintn64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_str", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_byte", + "args": [ + { + "type": "byte", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_bool", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_address", + "args": [ + { + "type": "address", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_uintn128", + "args": [ + { + "type": "uint128", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_implicit_key_arc4_dynamic_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_uintn64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_str", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_byte", + "args": [ + { + "type": "byte", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_bool", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_address", + "args": [ + { + "type": "address", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_uintn128", + "args": [ + { + "type": "uint128", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "set_arc4_dynamic_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "readonly": false, + "returns": { + "type": "void" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/GlobalStateContract.arc56.json b/tests/artifacts/state-ops/data/GlobalStateContract.arc56.json new file mode 100644 index 0000000..261d8c7 --- /dev/null +++ b/tests/artifacts/state-ops/data/GlobalStateContract.arc56.json @@ -0,0 +1,736 @@ +{ + "name": "GlobalStateContract", + "structs": {}, + "methods": [ + { + "name": "get_implicit_key_arc4_uintn64", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_str", + "args": [], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_byte", + "args": [], + "returns": { + "type": "byte" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_bool", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_address", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_uintn128", + "args": [], + "returns": { + "type": "uint128" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_dynamic_bytes", + "args": [], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_uintn64", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_str", + "args": [], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_byte", + "args": [], + "returns": { + "type": "byte" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_bool", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_address", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_uintn128", + "args": [], + "returns": { + "type": "uint128" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_dynamic_bytes", + "args": [], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_uintn64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_str", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_byte", + "args": [ + { + "type": "byte", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_bool", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_address", + "args": [ + { + "type": "address", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_uintn128", + "args": [ + { + "type": "uint128", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_implicit_key_arc4_dynamic_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_uintn64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_str", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_byte", + "args": [ + { + "type": "byte", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_bool", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_address", + "args": [ + { + "type": "address", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_uintn128", + "args": [ + { + "type": "uint128", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "set_arc4_dynamic_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 14 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "implicitKeyArc4UintN64": { + "keyType": "AVMString", + "valueType": "uint64", + "key": "aW1wbGljaXRLZXlBcmM0VWludE42NA==" + }, + "implicitKeyArc4Str": { + "keyType": "AVMString", + "valueType": "string", + "key": "aW1wbGljaXRLZXlBcmM0U3Ry" + }, + "implicitKeyArc4Byte": { + "keyType": "AVMString", + "valueType": "byte", + "key": "aW1wbGljaXRLZXlBcmM0Qnl0ZQ==" + }, + "implicitKeyArc4Bool": { + "keyType": "AVMString", + "valueType": "bool", + "key": "aW1wbGljaXRLZXlBcmM0Qm9vbA==" + }, + "implicitKeyArc4Address": { + "keyType": "AVMString", + "valueType": "address", + "key": "aW1wbGljaXRLZXlBcmM0QWRkcmVzcw==" + }, + "implicitKeyArc4UintN128": { + "keyType": "AVMString", + "valueType": "uint128", + "key": "aW1wbGljaXRLZXlBcmM0VWludE4xMjg=" + }, + "implicitKeyArc4DynamicBytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "aW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVz" + }, + "arc4UintN64": { + "keyType": "AVMString", + "valueType": "uint64", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfdWludG42NA==" + }, + "arc4Str": { + "keyType": "AVMString", + "valueType": "string", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfc3Ry" + }, + "arc4Byte": { + "keyType": "AVMString", + "valueType": "byte", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ==" + }, + "arc4Bool": { + "keyType": "AVMString", + "valueType": "bool", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA==" + }, + "arc4Address": { + "keyType": "AVMString", + "valueType": "address", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw==" + }, + "arc4UintN128": { + "keyType": "AVMString", + "valueType": "uint128", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfdWludG4xMjg=" + }, + "arc4DynamicBytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw==" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 701, + 717, + 733, + 749, + 765, + 781, + 797, + 813, + 829, + 845, + 861, + 877, + 893, + 909, + 925, + 940, + 955, + 970, + 985, + 1000, + 1015, + 1030, + 1045, + 1060, + 1075, + 1090, + 1105, + 1120 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 1140 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 704, + 720, + 736, + 752, + 768, + 784, + 800, + 816, + 832, + 848, + 864, + 880, + 896, + 912, + 928, + 943, + 958, + 973, + 988, + 1003, + 1018, + 1033, + 1048, + 1063, + 1078, + 1093, + 1108, + 1123 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1151, + 1159, + 1167, + 1176, + 1185, + 1194, + 1203, + 1212, + 1221, + 1230, + 1239, + 1248, + 1257, + 1266 + ], + "errorMessage": "check GlobalState exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IiAiaW1wbGljaXRLZXlBcmM0U3RyIiAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIgImltcGxpY2l0S2V5QXJjNEJvb2wiICJpbXBsaWNpdEtleUFyYzRBZGRyZXNzIiAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0IiAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIiAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIgImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiICJleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzIiAiZXhwbGljaXRfa2V5X2FyYzRfdWludG4xMjgiICJleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzIiAweDAwMDAwMDAwMDAwMDA1MzkgMHgwMDA1NDg2NTZjNmM2ZiAweDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICBjYWxsc3ViIGNvbnN0cnVjdG9yCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5jb25zdHJ1Y3RvcigpIC0+IHZvaWQ6CmNvbnN0cnVjdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MwogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSB9KQogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRLZXlBcmM0VWludE42NCIKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTQKICAgIC8vIGltcGxpY2l0S2V5QXJjNFN0ciA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgU3RyKCdIZWxsbycpIH0pCiAgICBieXRlY18yIC8vICJpbXBsaWNpdEtleUFyYzRTdHIiCiAgICBieXRlYyAxNiAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQnl0ZSgwKSB9KQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NgogICAgLy8gaW1wbGljaXRLZXlBcmM0Qm9vbCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQm9vbCh0cnVlKSB9KQogICAgYnl0ZWMgNCAvLyAiaW1wbGljaXRLZXlBcmM0Qm9vbCIKICAgIHB1c2hieXRlcyAweDgwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NwogICAgLy8gaW1wbGljaXRLZXlBcmM0QWRkcmVzcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpIH0pCiAgICBieXRlYyA1IC8vICJpbXBsaWNpdEtleUFyYzRBZGRyZXNzIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5OAogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE4xMjggPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pIH0pCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjEyOCIKICAgIGJ5dGVjIDE3IC8vIDB4MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk5CiAgICAvLyBpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpIH0pCiAgICBieXRlYyA3IC8vICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiCiAgICBieXRlYyAxOCAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDIKICAgIC8vIGFyYzRVaW50TjY0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjY0KDEzMzcpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCIKICAgIGJ5dGVjIDE1IC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIgogICAgYnl0ZWMgMTYgLy8gMHgwMDA1NDg2NTZjNmM2ZgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIGFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDUKICAgIC8vIGFyYzRCb29sID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCb29sKHRydWUpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ib29sJyB9KQogICAgYnl0ZWMgMTEgLy8gImV4cGxpY2l0X2tleV9hcmM0X2Jvb2wiCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIGFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbiksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4JyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IgogICAgYnl0ZWMgMTcgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIGFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICBieXRlYyAxOCAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDMyCiAgICBwdXNoYnl0ZXNzIDB4OGFiN2Y4YmYgMHg4NmVjMjRmMyAweDY5MTI4ZTkwIDB4NjhkNTkwZTIgMHg0NGVmMDY4MSAweDVjMjFiZDYwIDB4YWFjOGVjYjEgMHhhMTUyODhjZSAweDVmMjNhY2ZkIDB4ZGVkNzUwMzMgMHg2NjI3OWU5MyAweDA5NmU5MjdiIDB4MTA2YmMwMGIgMHg2ZWEzZjk5NiAweDNkZjBhMmNkIDB4OGM0ZDhmODAgMHg1ZWMzMTE2ZCAweDIwZjU2ZWVlIDB4MWMxNDlhNDMgMHg4ZTZhMWRkZSAweDg3ZjA4NjliIDB4MDI2NDY5YTEgMHhmMDU0YWI3YiAweGQyZTY0NmVmIDB4ZTY3NGEyNzAgMHhhODdlNTQwZCAweDU4YTc0MDRhIDB4MjU3NzA4ZjcgLy8gbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NCgpdWludDY0IiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKClieXRlIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCgpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludG42NCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHIoKXN0cmluZyIsIG1ldGhvZCAiZ2V0X2FyYzRfYnl0ZSgpYnl0ZSIsIG1ldGhvZCAiZ2V0X2FyYzRfYm9vbCgpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcygpYWRkcmVzcyIsIG1ldGhvZCAiZ2V0X2FyYzRfdWludG4xMjgoKXVpbnQxMjgiLCBtZXRob2QgImdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodWludDY0KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGJ5dGUpdm9pZCIsIG1ldGhvZCAic2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYm9vbCl2b2lkIiwgbWV0aG9kICJzZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCh1aW50MTI4KXZvaWQiLCBtZXRob2QgInNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF91aW50bjY0KHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9zdHIoc3RyaW5nKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X2J5dGUoYnl0ZSl2b2lkIiwgbWV0aG9kICJzZXRfYXJjNF9ib29sKGJvb2wpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfYWRkcmVzcyhhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldF9hcmM0X3VpbnRuMTI4KHVpbnQxMjgpdm9pZCIsIG1ldGhvZCAic2V0X2FyYzRfZHluYW1pY19ieXRlcyhieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG42NF9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3N0cl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ieXRlX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2Jvb2xfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYWRkcmVzc19yb3V0ZUAxMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjEyOF9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDE1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDE2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJfcm91dGVAMTcgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGVfcm91dGVAMTggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVAMjAgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4X3JvdXRlQDIxIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDIyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuNjRfcm91dGVAMjMgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfc3RyX3JvdXRlQDI0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2J5dGVfcm91dGVAMjUgX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfYm9vbF9yb3V0ZUAyNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDI3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuMTI4X3JvdXRlQDI4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMjkKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjY0X3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcmM0X3VpbnRuNjQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3N0cl9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FyYzRfc3RyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ieXRlX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9ib29sCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXJjNF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF91aW50bjEyOF9yb3V0ZUAxNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDE2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyX3JvdXRlQDE3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDE4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUAxOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3Nfcm91dGVAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUAyMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzA4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDIyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF91aW50bjY0X3JvdXRlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X3VpbnRuNjQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3N0cl9yb3V0ZUAyNDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfYXJjNF9zdHIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X2J5dGVfcm91dGVAMjU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2FyYzRfYnl0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2FyYzRfYm9vbF9yb3V0ZUAyNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRfYXJjNF9ib29sCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9hZGRyZXNzX3JvdXRlQDI3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X2FkZHJlc3MKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NldF9hcmM0X3VpbnRuMTI4X3JvdXRlQDI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X3VpbnRuMTI4CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDI5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gZXhwb3J0IGNsYXNzIEdsb2JhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHNldF9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AzMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTEKICAgIC8vIGV4cG9ydCBjbGFzcyBHbG9iYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAzNgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkxCiAgICAvLyBleHBvcnQgY2xhc3MgR2xvYmFsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NCgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTEtNjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoKTogVWludE42NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTkzCiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjY0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjY0KDEzMzcpIH0pCiAgICBieXRlY18xIC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjE2LTYxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoKTogU3RyIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYxOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5NAogICAgLy8gaW1wbGljaXRLZXlBcmM0U3RyID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBTdHIoJ0hlbGxvJykgfSkKICAgIGJ5dGVjXzIgLy8gImltcGxpY2l0S2V5QXJjNFN0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MTgKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFN0ci52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZSgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjEtNjIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGUoKTogQnl0ZSB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk1CiAgICAvLyBpbXBsaWNpdEtleUFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApIH0pCiAgICBieXRlY18zIC8vICJpbXBsaWNpdEtleUFyYzRCeXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbCgpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MjYtNjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYyOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qm9vbC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSkgfSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjI4CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRCb29sLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzMS02MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcygpOiBBZGRyZXNzIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzMwogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0QWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKSB9KQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0QWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KCkgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MzYtNjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KCk6IFVpbnROMTI4IHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk4CiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbikgfSkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0S2V5QXJjNFVpbnROMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYzOAogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQxLTY0MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKCk6IER5bmFtaWNCeXRlcyB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykgfSkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcy52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF91aW50bjY0KCkgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuNjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjQ3LTY0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuNjQoKTogVWludE42NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NDkKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjY0LnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwMgogICAgLy8gYXJjNFVpbnRONjQgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnRONjQoMTMzNyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQnIH0pCiAgICBieXRlYyA4IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY0OQogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFVpbnRONjQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfc3RyKCkgLT4gYnl0ZXM6CmdldF9hcmM0X3N0cjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTItNjUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfc3RyKCk6IFN0ciB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRTdHIudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAzCiAgICAvLyBhcmM0U3RyID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBTdHIoJ0hlbGxvJyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3N0cicgfSkKICAgIGJ5dGVjIDkgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRTdHIudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYnl0ZSgpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY1Ny02NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ieXRlKCk6IEJ5dGUgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0Qnl0ZS52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDQKICAgIC8vIGFyYzRCeXRlID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBCeXRlKDApLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTAgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0Qnl0ZS52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9ib29sKCkgLT4gYnl0ZXM6CmdldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYyLTY2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X2Jvb2woKTogYXJjNC5Cb29sIHsKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2wudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA1CiAgICAvLyBhcmM0Qm9vbCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQm9vbCh0cnVlKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfYm9vbCcgfSkKICAgIGJ5dGVjIDExIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2wudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfYWRkcmVzcygpIC0+IGJ5dGVzOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY2Ny02NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9hZGRyZXNzKCk6IEFkZHJlc3MgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjY5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0QWRkcmVzcy52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NjkKICAgIC8vIHJldHVybiB0aGlzLmFyYzRBZGRyZXNzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRuMTI4KCkgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuMTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3Mi02NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF91aW50bjEyOCgpOiBVaW50TjEyOCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzQKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOC52YWx1ZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDcKICAgIC8vIGFyYzRVaW50TjEyOCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE4xMjgoMm4gKiogMTAwbiksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4JyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY3NAogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFVpbnROMTI4LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2R5bmFtaWNfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzctNjc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfZHluYW1pY19ieXRlcygpOiBEeW5hbWljQnl0ZXMgewogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njc5CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0RHluYW1pY0J5dGVzLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwOAogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NzkKICAgIC8vIHJldHVybiB0aGlzLmFyYzREeW5hbWljQnl0ZXMudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODMtNjg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQodmFsdWU6IFVpbnRONjQpIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjU5MwogICAgLy8gaW1wbGljaXRLZXlBcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSB9KQogICAgYnl0ZWNfMSAvLyAiaW1wbGljaXRLZXlBcmM0VWludE42NCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2ODUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NC52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cih2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIodmFsdWU6IFN0cikgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTk0CiAgICAvLyBpbXBsaWNpdEtleUFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSB9KQogICAgYnl0ZWNfMiAvLyAiaW1wbGljaXRLZXlBcmM0U3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjY5MAogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRTdHIudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkzLTY5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKHZhbHVlOiBCeXRlKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTUKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJ5dGUgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJ5dGUoMCkgfSkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0S2V5QXJjNEJ5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk1CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Njk4LTY5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sKHZhbHVlOiBCb29sKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSkgfSkKICAgIGJ5dGVjIDQgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2wudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X2FkZHJlc3M6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzAzLTcwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzKHZhbHVlOiBBZGRyZXNzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKSB9KQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0QWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MDUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0QWRkcmVzcy52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcwOC03MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgodmFsdWU6IFVpbnROMTI4KSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTgKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnROMTI4ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBVaW50TjEyOCgybiAqKiAxMDBuKSB9KQogICAgYnl0ZWMgNiAvLyAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzEwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxMy03MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogRHluYW1pY0J5dGVzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1OTkKICAgIC8vIGltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykgfSkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTUKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzLnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF91aW50bjY0KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MTktNzIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfdWludG42NCh2YWx1ZTogVWludE42NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAyCiAgICAvLyBhcmM0VWludE42NCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgVWludE42NCgxMzM3KSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCcgfSkKICAgIGJ5dGVjIDggLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIxCiAgICAvLyB0aGlzLmFyYzRVaW50TjY0LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9zdHIodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzI0LTcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X3N0cih2YWx1ZTogU3RyKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDMKICAgIC8vIGFyYzRTdHIgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFN0cignSGVsbG8nKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgOSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfc3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcyNgogICAgLy8gdGhpcy5hcmM0U3RyLnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9ieXRlKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfYnl0ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MjktNzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfYnl0ZSh2YWx1ZTogQnl0ZSkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA0CiAgICAvLyBhcmM0Qnl0ZSA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgQnl0ZSgwKSwga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfYnl0ZScgfSkKICAgIGJ5dGVjIDEwIC8vICJleHBsaWNpdF9rZXlfYXJjNF9ieXRlIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczMQogICAgLy8gdGhpcy5hcmM0Qnl0ZS52YWx1ZSA9IHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3Quc2V0X2FyYzRfYm9vbCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CnNldF9hcmM0X2Jvb2w6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzM0LTczNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X2Jvb2wodmFsdWU6IEJvb2wpIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwNQogICAgLy8gYXJjNEJvb2wgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IEJvb2wodHJ1ZSksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxMSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3MzYKICAgIC8vIHRoaXMuYXJjNEJvb2wudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X2FkZHJlc3ModmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjczOS03NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBzZXRfYXJjNF9hZGRyZXNzKHZhbHVlOiBBZGRyZXNzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDYKICAgIC8vIGFyYzRBZGRyZXNzID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcyksIGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxMiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDEKICAgIC8vIHRoaXMuYXJjNEFkZHJlc3MudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpHbG9iYWxTdGF0ZUNvbnRyYWN0LnNldF9hcmM0X3VpbnRuMTI4KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfdWludG4xMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQ0LTc0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHNldF9hcmM0X3VpbnRuMTI4KHZhbHVlOiBVaW50TjEyOCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjA3CiAgICAvLyBhcmM0VWludE4xMjggPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDYKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4LnZhbHVlID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6R2xvYmFsU3RhdGVDb250cmFjdC5zZXRfYXJjNF9keW5hbWljX2J5dGVzKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKc2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NDktNzUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gc2V0X2FyYzRfZHluYW1pY19ieXRlcyh2YWx1ZTogRHluYW1pY0J5dGVzKSB7CiAgICBwcm90byAxIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MDgKICAgIC8vIGFyYzREeW5hbWljQnl0ZXMgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpLCBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzUxCiAgICAvLyB0aGlzLmFyYzREeW5hbWljQnl0ZXMudmFsdWUgPSB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Okdsb2JhbFN0YXRlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/GlobalStateContract.clear.teal b/tests/artifacts/state-ops/data/GlobalStateContract.clear.teal new file mode 100644 index 0000000..cccf7dc --- /dev/null +++ b/tests/artifacts/state-ops/data/GlobalStateContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::GlobalStateContract.clearStateProgram: + pushint 1 // 1 + return diff --git a/tests/artifacts/state-ops/data/ITxnOpsContract.approval.teal b/tests/artifacts/state-ops/data/ITxnOpsContract.approval.teal new file mode 100644 index 0000000..52978e5 --- /dev/null +++ b/tests/artifacts/state-ops/data/ITxnOpsContract.approval.teal @@ -0,0 +1,134 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::ITxnOpsContract.approvalProgram: + intcblock 1 0 6 1000 + bytecblock 0x068101 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::ITxnOpsContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:469 + // export class ITxnOpsContract extends arc4.Contract { + proto 0 1 + txn NumAppArgs + bz __puya_arc4_router___bare_routing@5 + pushbytes 0x4e7cd9cb // method "verify_itxn_ops()void" + txna ApplicationArgs 0 + match __puya_arc4_router___verify_itxn_ops_route@2 + intc_1 // 0 + retsub + +__puya_arc4_router___verify_itxn_ops_route@2: + // tests/artifacts/state-ops/contract.algo.ts:470 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub verify_itxn_ops + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@5: + // tests/artifacts/state-ops/contract.algo.ts:469 + // export class ITxnOpsContract extends arc4.Contract { + txn OnCompletion + bnz __puya_arc4_router___after_if_else@9 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@9: + // tests/artifacts/state-ops/contract.algo.ts:469 + // export class ITxnOpsContract extends arc4.Contract { + intc_1 // 0 + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::ITxnOpsContract.verify_itxn_ops() -> void: +verify_itxn_ops: + // tests/artifacts/state-ops/contract.algo.ts:470-471 + // @arc4.abimethod() + // public verify_itxn_ops() { + proto 0 0 + // tests/artifacts/state-ops/contract.algo.ts:472 + // op.ITxnCreate.begin() + itxn_begin + // tests/artifacts/state-ops/contract.algo.ts:473 + // op.ITxnCreate.setTypeEnum(TransactionType.ApplicationCall) + intc_2 // 6 + itxn_field TypeEnum + // tests/artifacts/state-ops/contract.algo.ts:474 + // op.ITxnCreate.setOnCompletion(arc4.OnCompleteAction.DeleteApplication) + pushint 5 // 5 + itxn_field OnCompletion + // tests/artifacts/state-ops/contract.algo.ts:475 + // op.ITxnCreate.setApprovalProgram(Bytes.fromHex('068101')) + bytec_0 // 0x068101 + itxn_field ApprovalProgram + // tests/artifacts/state-ops/contract.algo.ts:478 + // op.ITxnCreate.setApprovalProgramPages(Bytes.fromHex('068101')) + bytec_0 // 0x068101 + itxn_field ApprovalProgramPages + // tests/artifacts/state-ops/contract.algo.ts:479 + // op.ITxnCreate.setClearStateProgram(Bytes.fromHex('068101')) + bytec_0 // 0x068101 + itxn_field ClearStateProgram + // tests/artifacts/state-ops/contract.algo.ts:480 + // op.ITxnCreate.setFee(op.Global.minTxnFee) + global MinTxnFee + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:481 + // op.ITxnCreate.next() + itxn_next + // tests/artifacts/state-ops/contract.algo.ts:482 + // op.ITxnCreate.setTypeEnum(TransactionType.Payment) + intc_0 // 1 + itxn_field TypeEnum + // tests/artifacts/state-ops/contract.algo.ts:483 + // op.ITxnCreate.setReceiver(op.Global.creatorAddress) + global CreatorAddress + itxn_field Receiver + // tests/artifacts/state-ops/contract.algo.ts:484 + // op.ITxnCreate.setAmount(Uint64(1000)) + intc_3 // 1000 + itxn_field Amount + // tests/artifacts/state-ops/contract.algo.ts:485 + // op.ITxnCreate.submit() + itxn_submit + // tests/artifacts/state-ops/contract.algo.ts:487 + // assert(op.ITxn.receiver === op.Global.creatorAddress) + itxn Receiver + global CreatorAddress + == + assert + // tests/artifacts/state-ops/contract.algo.ts:488 + // assert(op.ITxn.amount === Uint64(1000)) + itxn Amount + intc_3 // 1000 + == + assert + // tests/artifacts/state-ops/contract.algo.ts:489 + // assert(op.ITxn.typeEnum === TransactionType.Payment) + itxn TypeEnum + intc_0 // 1 + == + assert + // tests/artifacts/state-ops/contract.algo.ts:491 + // assert(op.GITxn.typeEnum(0) === TransactionType.ApplicationCall) + gitxn 0 TypeEnum + intc_2 // 6 + == + assert + // tests/artifacts/state-ops/contract.algo.ts:492 + // assert(op.GITxn.typeEnum(1) === TransactionType.Payment) + gitxn 1 TypeEnum + intc_0 // 1 + == + assert + retsub diff --git a/tests/artifacts/state-ops/data/ITxnOpsContract.arc32.json b/tests/artifacts/state-ops/data/ITxnOpsContract.arc32.json new file mode 100644 index 0000000..7d19134 --- /dev/null +++ b/tests/artifacts/state-ops/data/ITxnOpsContract.arc32.json @@ -0,0 +1,50 @@ +{ + "hints": { + "verify_itxn_ops()void": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpJVHhuT3BzQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gZXhwb3J0IGNsYXNzIElUeG5PcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweDRlN2NkOWNiIC8vIG1ldGhvZCAidmVyaWZ5X2l0eG5fb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9pdHhuX29wc19yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB2ZXJpZnlfaXR4bl9vcHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gZXhwb3J0IGNsYXNzIElUeG5PcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIGV4cG9ydCBjbGFzcyBJVHhuT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHMoKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDcwLTQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfaXR4bl9vcHMoKSB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIG9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0T25Db21wbGV0aW9uKGFyYzQuT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbikKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHByb3ZhbFByb2dyYW0oQnl0ZXMuZnJvbUhleCgnMDY4MTAxJykpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHByb3ZhbFByb2dyYW1QYWdlcyhCeXRlcy5mcm9tSGV4KCcwNjgxMDEnKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q2xlYXJTdGF0ZVByb2dyYW0oQnl0ZXMuZnJvbUhleCgnMDY4MTAxJykpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDgwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShvcC5HbG9iYWwubWluVHhuRmVlKQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIG9wLklUeG5DcmVhdGUubmV4dCgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRSZWNlaXZlcihvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KFVpbnQ2NCgxMDAwKSkKICAgIGludGNfMyAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODcKICAgIC8vIGFzc2VydChvcC5JVHhuLnJlY2VpdmVyID09PSBvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBpdHhuIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODgKICAgIC8vIGFzc2VydChvcC5JVHhuLmFtb3VudCA9PT0gVWludDY0KDEwMDApKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMyAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBhc3NlcnQob3AuSVR4bi50eXBlRW51bSA9PT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gYXNzZXJ0KG9wLkdJVHhuLnR5cGVFbnVtKDApID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18yIC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGFzc2VydChvcC5HSVR4bi50eXBlRW51bSgxKSA9PT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBnaXR4biAxIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": {}, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "ITxnOpsContract", + "methods": [ + { + "name": "verify_itxn_ops", + "args": [], + "readonly": false, + "returns": { + "type": "void" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/ITxnOpsContract.arc56.json b/tests/artifacts/state-ops/data/ITxnOpsContract.arc56.json new file mode 100644 index 0000000..185eb45 --- /dev/null +++ b/tests/artifacts/state-ops/data/ITxnOpsContract.arc56.json @@ -0,0 +1,90 @@ +{ + "name": "ITxnOpsContract", + "structs": {}, + "methods": [ + { + "name": "verify_itxn_ops", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 44 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 61 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 47 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYgMTAwMAogICAgYnl0ZWNibG9jayAweDA2ODEwMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpJVHhuT3BzQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gZXhwb3J0IGNsYXNzIElUeG5PcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweDRlN2NkOWNiIC8vIG1ldGhvZCAidmVyaWZ5X2l0eG5fb3BzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2l0eG5fb3BzX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9pdHhuX29wc19yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB2ZXJpZnlfaXR4bl9vcHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gZXhwb3J0IGNsYXNzIElUeG5PcHNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIGV4cG9ydCBjbGFzcyBJVHhuT3BzQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC52ZXJpZnlfaXR4bl9vcHMoKSAtPiB2b2lkOgp2ZXJpZnlfaXR4bl9vcHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDcwLTQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfaXR4bl9vcHMoKSB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIG9wLklUeG5DcmVhdGUuYmVnaW4oKQogICAgaXR4bl9iZWdpbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgaW50Y18yIC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0T25Db21wbGV0aW9uKGFyYzQuT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbikKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHByb3ZhbFByb2dyYW0oQnl0ZXMuZnJvbUhleCgnMDY4MTAxJykpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHByb3ZhbFByb2dyYW1QYWdlcyhCeXRlcy5mcm9tSGV4KCcwNjgxMDEnKSkKICAgIGJ5dGVjXzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NzkKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q2xlYXJTdGF0ZVByb2dyYW0oQnl0ZXMuZnJvbUhleCgnMDY4MTAxJykpCiAgICBieXRlY18wIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDgwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShvcC5HbG9iYWwubWluVHhuRmVlKQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIG9wLklUeG5DcmVhdGUubmV4dCgpCiAgICBpdHhuX25leHQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODIKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0VHlwZUVudW0oVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpbnRjXzAgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRSZWNlaXZlcihvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KFVpbnQ2NCgxMDAwKSkKICAgIGludGNfMyAvLyAxMDAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODcKICAgIC8vIGFzc2VydChvcC5JVHhuLnJlY2VpdmVyID09PSBvcC5HbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBpdHhuIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0ODgKICAgIC8vIGFzc2VydChvcC5JVHhuLmFtb3VudCA9PT0gVWludDY0KDEwMDApKQogICAgaXR4biBBbW91bnQKICAgIGludGNfMyAvLyAxMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBhc3NlcnQob3AuSVR4bi50eXBlRW51bSA9PT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBpdHhuIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gYXNzZXJ0KG9wLkdJVHhuLnR5cGVFbnVtKDApID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsKQogICAgZ2l0eG4gMCBUeXBlRW51bQogICAgaW50Y18yIC8vIDYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGFzc2VydChvcC5HSVR4bi50eXBlRW51bSgxKSA9PT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpCiAgICBnaXR4biAxIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OklUeG5PcHNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/ITxnOpsContract.clear.teal b/tests/artifacts/state-ops/data/ITxnOpsContract.clear.teal new file mode 100644 index 0000000..b00b7bf --- /dev/null +++ b/tests/artifacts/state-ops/data/ITxnOpsContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::ITxnOpsContract.clearStateProgram: + pushint 1 // 1 + return diff --git a/tests/artifacts/state-ops/data/ItxnDemoContract.approval.teal b/tests/artifacts/state-ops/data/ItxnDemoContract.approval.teal new file mode 100644 index 0000000..a844d3a --- /dev/null +++ b/tests/artifacts/state-ops/data/ItxnDemoContract.approval.teal @@ -0,0 +1,485 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::ItxnDemoContract.approvalProgram: + intcblock 0 3 1 1000 + bytecblock "name" "unit" 0x098101 "AST1" "AST2" "AST3" "3rd" "with args param set" "\t\xc2\x81\x01" + txn ApplicationID + bnz main_after_if_else@2 + callsub constructor + +main_after_if_else@2: + // tests/artifacts/state-ops/contract.algo.ts:501 + // if (Txn.numAppArgs) { + txn NumAppArgs + bz main_after_if_else@15 + // tests/artifacts/state-ops/contract.algo.ts:502 + // switch (Txn.applicationArgs(0)) { + intc_0 // 0 + txnas ApplicationArgs + // tests/artifacts/state-ops/contract.algo.ts:503 + // case Bytes('test1'): + pushbytess "test1" "test2" "test3" "test4" // "test1", "test2", "test3", "test4" + // tests/artifacts/state-ops/contract.algo.ts:502-512 + // switch (Txn.applicationArgs(0)) { + // case Bytes('test1'): + // this.test1() + // break + // case Bytes('test2'): + // this.test2() + // break + // case Bytes('test3'): + // case Bytes('test4'): + // break + // } + uncover 4 + match main_switch_case_0@4 main_switch_case_1@6 main_after_if_else@15 main_after_if_else@15 + // tests/artifacts/state-ops/contract.algo.ts:514 + // return true + intc_2 // 1 + return + +main_switch_case_0@4: + // tests/artifacts/state-ops/contract.algo.ts:504 + // this.test1() + callsub test1 + // tests/artifacts/state-ops/contract.algo.ts:505 + // break + b main_after_if_else@15 + +main_switch_case_1@6: + // tests/artifacts/state-ops/contract.algo.ts:507 + // this.test2() + callsub test2 + +main_after_if_else@15: + // tests/artifacts/state-ops/contract.algo.ts:514 + // return true + intc_2 // 1 + return + + +// tests/artifacts/state-ops/contract.algo.ts::ItxnDemoContract.constructor() -> void: +constructor: + // tests/artifacts/state-ops/contract.algo.ts:497 + // export class ItxnDemoContract extends BaseContract { + proto 0 0 + // tests/artifacts/state-ops/contract.algo.ts:498 + // name = GlobalState({ initialValue: Bytes() }) + bytec_0 // "name" + pushbytes 0x + app_global_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::ItxnDemoContract.test1() -> void: +test1: + // tests/artifacts/state-ops/contract.algo.ts:517 + // private test1() { + proto 0 0 + // tests/artifacts/state-ops/contract.algo.ts:498 + // name = GlobalState({ initialValue: Bytes() }) + bytec_0 // "name" + // tests/artifacts/state-ops/contract.algo.ts:518 + // this.name.value = Bytes('AST1') + bytec_3 // "AST1" + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:522 + // assetName: this.name.value, + intc_0 // 0 + // tests/artifacts/state-ops/contract.algo.ts:498 + // name = GlobalState({ initialValue: Bytes() }) + bytec_0 // "name" + // tests/artifacts/state-ops/contract.algo.ts:522 + // assetName: this.name.value, + app_global_get_ex + assert // check GlobalState exists + // tests/artifacts/state-ops/contract.algo.ts:525 + // manager: Global.currentApplicationAddress, + global CurrentApplicationAddress + // tests/artifacts/state-ops/contract.algo.ts:526 + // reserve: Global.currentApplicationAddress, + dup + // tests/artifacts/state-ops/contract.algo.ts:498 + // name = GlobalState({ initialValue: Bytes() }) + bytec_0 // "name" + // tests/artifacts/state-ops/contract.algo.ts:529 + // this.name.value = Bytes('AST2') + bytec 4 // "AST2" + app_global_put + // tests/artifacts/state-ops/contract.algo.ts:530 + // const asset1_txn = assetParams.submit() + itxn_begin + dup + itxn_field ConfigAssetReserve + dig 1 + itxn_field ConfigAssetManager + // tests/artifacts/state-ops/contract.algo.ts:524 + // decimals: 3, + intc_1 // 3 + itxn_field ConfigAssetDecimals + // tests/artifacts/state-ops/contract.algo.ts:523 + // unitName: 'unit', + bytec_1 // "unit" + itxn_field ConfigAssetUnitName + uncover 2 + itxn_field ConfigAssetName + // tests/artifacts/state-ops/contract.algo.ts:521 + // total: 1000, + intc_3 // 1000 + itxn_field ConfigAssetTotal + // tests/artifacts/state-ops/contract.algo.ts:520-527 + // const assetParams = itxn.assetConfig({ + // total: 1000, + // assetName: this.name.value, + // unitName: 'unit', + // decimals: 3, + // manager: Global.currentApplicationAddress, + // reserve: Global.currentApplicationAddress, + // }) + intc_1 // 3 + itxn_field TypeEnum + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:530 + // const asset1_txn = assetParams.submit() + itxn_submit + itxn ConfigAssetName + itxn CreatedAssetID + // tests/artifacts/state-ops/contract.algo.ts:532 + // assetName: this.name.value, + intc_0 // 0 + // tests/artifacts/state-ops/contract.algo.ts:498 + // name = GlobalState({ initialValue: Bytes() }) + bytec_0 // "name" + // tests/artifacts/state-ops/contract.algo.ts:532 + // assetName: this.name.value, + app_global_get_ex + assert // check GlobalState exists + // tests/artifacts/state-ops/contract.algo.ts:534 + // const asset2_txn = assetParams.submit() + itxn_begin + dig 3 + itxn_field ConfigAssetReserve + dig 4 + itxn_field ConfigAssetManager + // tests/artifacts/state-ops/contract.algo.ts:524 + // decimals: 3, + intc_1 // 3 + itxn_field ConfigAssetDecimals + // tests/artifacts/state-ops/contract.algo.ts:523 + // unitName: 'unit', + bytec_1 // "unit" + itxn_field ConfigAssetUnitName + itxn_field ConfigAssetName + // tests/artifacts/state-ops/contract.algo.ts:521 + // total: 1000, + intc_3 // 1000 + itxn_field ConfigAssetTotal + // tests/artifacts/state-ops/contract.algo.ts:520-527 + // const assetParams = itxn.assetConfig({ + // total: 1000, + // assetName: this.name.value, + // unitName: 'unit', + // decimals: 3, + // manager: Global.currentApplicationAddress, + // reserve: Global.currentApplicationAddress, + // }) + intc_1 // 3 + itxn_field TypeEnum + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:534 + // const asset2_txn = assetParams.submit() + itxn_submit + itxn ConfigAssetName + itxn CreatedAssetID + // tests/artifacts/state-ops/contract.algo.ts:536 + // assert(asset1_txn.assetName === Bytes('AST1'), 'asset1_txn is correct') + uncover 3 + bytec_3 // "AST1" + == + assert // asset1_txn is correct + // tests/artifacts/state-ops/contract.algo.ts:537 + // assert(asset2_txn.assetName === Bytes('AST2'), 'asset2_txn is correct') + swap + bytec 4 // "AST2" + == + assert // asset2_txn is correct + // tests/artifacts/state-ops/contract.algo.ts:538 + // assert(asset1_txn.createdAsset.name === Bytes('AST1'), 'created asset 1 is correct') + swap + asset_params_get AssetName + assert // asset exists + bytec_3 // "AST1" + == + assert // created asset 1 is correct + // tests/artifacts/state-ops/contract.algo.ts:539 + // assert(asset2_txn.createdAsset.name === Bytes('AST2'), 'created asset 2 is correct') + asset_params_get AssetName + assert // asset exists + bytec 4 // "AST2" + == + assert // created asset 2 is correct + // tests/artifacts/state-ops/contract.algo.ts:551 + // const [appCreateTxn, asset3_txn] = itxn.submitGroup(appCreateParams, assetParams) + itxn_begin + // tests/artifacts/state-ops/contract.algo.ts:543 + // clearStateProgram: Bytes.fromHex('098101'), + bytec_2 // 0x098101 + itxn_field ClearStateProgramPages + // tests/artifacts/state-ops/contract.algo.ts:542 + // approvalProgram: Bytes.fromHex('098101'), + bytec_2 // 0x098101 + itxn_field ApprovalProgramPages + // tests/artifacts/state-ops/contract.algo.ts:541-545 + // const appCreateParams = itxn.applicationCall({ + // approvalProgram: Bytes.fromHex('098101'), + // clearStateProgram: Bytes.fromHex('098101'), + // fee: 0, + // }) + pushint 6 // 6 + itxn_field TypeEnum + // tests/artifacts/state-ops/contract.algo.ts:544 + // fee: 0, + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:551 + // const [appCreateTxn, asset3_txn] = itxn.submitGroup(appCreateParams, assetParams) + itxn_next + dup + itxn_field ConfigAssetReserve + dig 1 + itxn_field ConfigAssetManager + // tests/artifacts/state-ops/contract.algo.ts:524 + // decimals: 3, + intc_1 // 3 + itxn_field ConfigAssetDecimals + // tests/artifacts/state-ops/contract.algo.ts:523 + // unitName: 'unit', + bytec_1 // "unit" + itxn_field ConfigAssetUnitName + // tests/artifacts/state-ops/contract.algo.ts:548 + // assetName: 'AST3', + bytec 5 // "AST3" + itxn_field ConfigAssetName + // tests/artifacts/state-ops/contract.algo.ts:521 + // total: 1000, + intc_3 // 1000 + itxn_field ConfigAssetTotal + // tests/artifacts/state-ops/contract.algo.ts:520-527 + // const assetParams = itxn.assetConfig({ + // total: 1000, + // assetName: this.name.value, + // unitName: 'unit', + // decimals: 3, + // manager: Global.currentApplicationAddress, + // reserve: Global.currentApplicationAddress, + // }) + intc_1 // 3 + itxn_field TypeEnum + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:551 + // const [appCreateTxn, asset3_txn] = itxn.submitGroup(appCreateParams, assetParams) + itxn_submit + itxn ConfigAssetName + gitxn 0 ApplicationID + // tests/artifacts/state-ops/contract.algo.ts:553 + // assert(appCreateTxn.appId, 'app is created') + assert // app is created + // tests/artifacts/state-ops/contract.algo.ts:554 + // assert(asset3_txn.assetName === Bytes('AST3'), 'asset3_txn is correct') + bytec 5 // "AST3" + == + assert // asset3_txn is correct + // tests/artifacts/state-ops/contract.algo.ts:562 + // itxn.submitGroup(appCreateParams, assetParams) + itxn_begin + // tests/artifacts/state-ops/contract.algo.ts:557 + // note: '3rd', + bytec 6 // "3rd" + itxn_field Note + // tests/artifacts/state-ops/contract.algo.ts:543 + // clearStateProgram: Bytes.fromHex('098101'), + bytec_2 // 0x098101 + itxn_field ClearStateProgramPages + // tests/artifacts/state-ops/contract.algo.ts:542 + // approvalProgram: Bytes.fromHex('098101'), + bytec_2 // 0x098101 + itxn_field ApprovalProgramPages + // tests/artifacts/state-ops/contract.algo.ts:541-545 + // const appCreateParams = itxn.applicationCall({ + // approvalProgram: Bytes.fromHex('098101'), + // clearStateProgram: Bytes.fromHex('098101'), + // fee: 0, + // }) + pushint 6 // 6 + itxn_field TypeEnum + // tests/artifacts/state-ops/contract.algo.ts:544 + // fee: 0, + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:562 + // itxn.submitGroup(appCreateParams, assetParams) + itxn_next + // tests/artifacts/state-ops/contract.algo.ts:560 + // note: '3rd', + bytec 6 // "3rd" + itxn_field Note + itxn_field ConfigAssetReserve + itxn_field ConfigAssetManager + // tests/artifacts/state-ops/contract.algo.ts:524 + // decimals: 3, + intc_1 // 3 + itxn_field ConfigAssetDecimals + // tests/artifacts/state-ops/contract.algo.ts:523 + // unitName: 'unit', + bytec_1 // "unit" + itxn_field ConfigAssetUnitName + // tests/artifacts/state-ops/contract.algo.ts:548 + // assetName: 'AST3', + bytec 5 // "AST3" + itxn_field ConfigAssetName + // tests/artifacts/state-ops/contract.algo.ts:521 + // total: 1000, + intc_3 // 1000 + itxn_field ConfigAssetTotal + // tests/artifacts/state-ops/contract.algo.ts:520-527 + // const assetParams = itxn.assetConfig({ + // total: 1000, + // assetName: this.name.value, + // unitName: 'unit', + // decimals: 3, + // manager: Global.currentApplicationAddress, + // reserve: Global.currentApplicationAddress, + // }) + intc_1 // 3 + itxn_field TypeEnum + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:562 + // itxn.submitGroup(appCreateParams, assetParams) + itxn_submit + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::ItxnDemoContract.test2() -> void: +test2: + // tests/artifacts/state-ops/contract.algo.ts:565 + // private test2() { + proto 0 0 + intc_0 // 0 + dupn 2 + pushbytes "" + dupn 2 + // tests/artifacts/state-ops/contract.algo.ts:567 + // if (Txn.numAppArgs) { + txn NumAppArgs + bz test2_else_body@2 + // tests/artifacts/state-ops/contract.algo.ts:568 + // const args = [Bytes('1'), Bytes('2')] as const + pushbytes "1" + frame_bury 0 + pushbytes "2" + frame_bury 1 + // tests/artifacts/state-ops/contract.algo.ts:572 + // appArgs: args, + pushint 2 // 2 + frame_bury 3 + // tests/artifacts/state-ops/contract.algo.ts:573 + // onCompletion: arc4.OnCompleteAction.NoOp, + intc_0 // 0 + frame_bury 5 + intc_2 // 1 + frame_bury 4 + // tests/artifacts/state-ops/contract.algo.ts:574 + // note: 'with args param set', + bytec 7 // "with args param set" + b test2_after_if_else@3 + +test2_else_body@2: + // tests/artifacts/state-ops/contract.algo.ts:580 + // appArgs: [Bytes('3'), '4', Bytes('5')], + pushbytes "3" + frame_bury 0 + pushbytes "4" + frame_bury 1 + pushbytes "5" + frame_bury 2 + intc_1 // 3 + frame_bury 3 + // tests/artifacts/state-ops/contract.algo.ts:581 + // note: 'no args param set', + pushbytes "no args param set" + // tests/artifacts/state-ops/contract.algo.ts:577 + // createAppParams = itxn.applicationCall({ + intc_0 // 0 + frame_bury 4 + +test2_after_if_else@3: + // tests/artifacts/state-ops/contract.algo.ts:584 + // const createAppTxn = createAppParams.submit() + itxn_begin + itxn_field Note + frame_dig 4 + intc_2 // 1 + >= + bz test2_next_field@5 + frame_dig 5 + itxn_field OnCompletion + +test2_next_field@5: + frame_dig 0 + itxn_field ApplicationArgs + frame_dig 1 + itxn_field ApplicationArgs + frame_dig 3 + intc_1 // 3 + >= + // tests/artifacts/state-ops/contract.algo.ts:584 + // const createAppTxn = createAppParams.submit() + bz test2_next_field@7 + frame_dig 2 + itxn_field ApplicationArgs + +test2_next_field@7: + // tests/artifacts/state-ops/contract.algo.ts:496 + // const APPROVE = Bytes('\x09\x81\x01') + bytec 8 // "\t\xc2\x81\x01" + itxn_field ClearStateProgramPages + bytec 8 // "\t\xc2\x81\x01" + itxn_field ApprovalProgramPages + // tests/artifacts/state-ops/contract.algo.ts:569-575 + // createAppParams = itxn.applicationCall({ + // approvalProgram: APPROVE, + // clearStateProgram: APPROVE, + // appArgs: args, + // onCompletion: arc4.OnCompleteAction.NoOp, + // note: 'with args param set', + // }) + pushint 6 // 6 + itxn_field TypeEnum + intc_0 // 0 + itxn_field Fee + // tests/artifacts/state-ops/contract.algo.ts:584 + // const createAppTxn = createAppParams.submit() + itxn_submit + itxn Note + // tests/artifacts/state-ops/contract.algo.ts:585 + // assert(createAppTxn.appArgs(0) === Bytes('1'), 'correct args used 1') + itxna ApplicationArgs 0 + pushbytes "1" + == + assert // correct args used 1 + // tests/artifacts/state-ops/contract.algo.ts:586 + // assert(createAppTxn.appArgs(1) === Bytes('2'), 'correct args used 2') + itxna ApplicationArgs 1 + pushbytes "2" + == + assert // correct args used 2 + // tests/artifacts/state-ops/contract.algo.ts:587 + // assert(createAppTxn.note === Bytes('with args param set')) + bytec 7 // "with args param set" + == + assert + retsub diff --git a/tests/artifacts/state-ops/data/ItxnDemoContract.clear.teal b/tests/artifacts/state-ops/data/ItxnDemoContract.clear.teal new file mode 100644 index 0000000..d7fd8f9 --- /dev/null +++ b/tests/artifacts/state-ops/data/ItxnDemoContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::ItxnDemoContract.clearStateProgram: + pushint 1 // 1 + return diff --git a/tests/artifacts/state-ops/data/LocalStateContract.approval.teal b/tests/artifacts/state-ops/data/LocalStateContract.approval.teal new file mode 100644 index 0000000..625363e --- /dev/null +++ b/tests/artifacts/state-ops/data/LocalStateContract.approval.teal @@ -0,0 +1,802 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 "implicitKeyArc4UintN64" 0x0000000000000539 "implicitKeyArc4Str" 0x000548656c6c6f "implicitKeyArc4Byte" "implicitKeyArc4Bool" "implicitKeyArc4Address" "implicitKeyArc4UintN128" 0x00000010000000000000000000000000 "implicitKeyArc4DynamicBytes" 0x000d64796e616d6963206279746573 "explicit_key_arc4_uintn64" "explicit_key_arc4_str" "explicit_key_arc4_byte" "explicit_key_arc4_bool" "explicit_key_arc4_address" "explicit_key_arc4_uintn128" "explicit_key_arc4_dynamic_bytes" + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + proto 0 1 + txn NumAppArgs + bz __puya_arc4_router___bare_routing@19 + pushbytess 0x30c6d58a 0xeecdf0a0 0x6c6f17da 0xecf633b0 0x3e531223 0x3ed6799d 0x6fecdd80 0x676a87c2 0x1e0f8951 0x42e85fd7 0x6521d49b 0xe07c56cd 0xaa19d2b5 0xb922312d 0xfc0feed9 // method "opt_in()void", method "get_implicit_key_arc4_uintn64(account)uint64", method "get_implicit_key_arc4_str(account)string", method "get_implicit_key_arc4_byte(account)byte", method "get_implicit_key_arc4_bool(account)bool", method "get_implicit_key_arc4_address(account)address", method "get_implicit_key_arc4_uintn128(account)uint128", method "get_implicit_key_arc4_dynamic_bytes(account)byte[]", method "get_arc4_uintn64(account)uint64", method "get_arc4_str(account)string", method "get_arc4_byte(account)byte", method "get_arc4_bool(account)bool", method "get_arc4_address(account)address", method "get_arc4_uintn128(account)uint128", method "get_arc4_dynamic_bytes(account)byte[]" + txna ApplicationArgs 0 + match __puya_arc4_router___opt_in_route@2 __puya_arc4_router___get_implicit_key_arc4_uintn64_route@3 __puya_arc4_router___get_implicit_key_arc4_str_route@4 __puya_arc4_router___get_implicit_key_arc4_byte_route@5 __puya_arc4_router___get_implicit_key_arc4_bool_route@6 __puya_arc4_router___get_implicit_key_arc4_address_route@7 __puya_arc4_router___get_implicit_key_arc4_uintn128_route@8 __puya_arc4_router___get_implicit_key_arc4_dynamic_bytes_route@9 __puya_arc4_router___get_arc4_uintn64_route@10 __puya_arc4_router___get_arc4_str_route@11 __puya_arc4_router___get_arc4_byte_route@12 __puya_arc4_router___get_arc4_bool_route@13 __puya_arc4_router___get_arc4_address_route@14 __puya_arc4_router___get_arc4_uintn128_route@15 __puya_arc4_router___get_arc4_dynamic_bytes_route@16 + intc_1 // 0 + retsub + +__puya_arc4_router___opt_in_route@2: + // tests/artifacts/state-ops/contract.algo.ts:774 + // @arc4.abimethod({ allowActions: ['OptIn'] }) + txn OnCompletion + intc_0 // OptIn + == + assert // OnCompletion is not OptIn + txn ApplicationID + assert // can only call when not creating + callsub opt_in + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_uintn64_route@3: + // tests/artifacts/state-ops/contract.algo.ts:794 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:794 + // @arc4.abimethod() + callsub get_implicit_key_arc4_uintn64 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_str_route@4: + // tests/artifacts/state-ops/contract.algo.ts:799 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:799 + // @arc4.abimethod() + callsub get_implicit_key_arc4_str + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_byte_route@5: + // tests/artifacts/state-ops/contract.algo.ts:804 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:804 + // @arc4.abimethod() + callsub get_implicit_key_arc4_byte + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_bool_route@6: + // tests/artifacts/state-ops/contract.algo.ts:809 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:809 + // @arc4.abimethod() + callsub get_implicit_key_arc4_bool + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_address_route@7: + // tests/artifacts/state-ops/contract.algo.ts:814 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:814 + // @arc4.abimethod() + callsub get_implicit_key_arc4_address + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_uintn128_route@8: + // tests/artifacts/state-ops/contract.algo.ts:819 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:819 + // @arc4.abimethod() + callsub get_implicit_key_arc4_uintn128 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_implicit_key_arc4_dynamic_bytes_route@9: + // tests/artifacts/state-ops/contract.algo.ts:824 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:824 + // @arc4.abimethod() + callsub get_implicit_key_arc4_dynamic_bytes + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_uintn64_route@10: + // tests/artifacts/state-ops/contract.algo.ts:830 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:830 + // @arc4.abimethod() + callsub get_arc4_uintn64 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_str_route@11: + // tests/artifacts/state-ops/contract.algo.ts:835 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:835 + // @arc4.abimethod() + callsub get_arc4_str + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_byte_route@12: + // tests/artifacts/state-ops/contract.algo.ts:840 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:840 + // @arc4.abimethod() + callsub get_arc4_byte + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_bool_route@13: + // tests/artifacts/state-ops/contract.algo.ts:845 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:845 + // @arc4.abimethod() + callsub get_arc4_bool + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_address_route@14: + // tests/artifacts/state-ops/contract.algo.ts:850 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:850 + // @arc4.abimethod() + callsub get_arc4_address + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_uintn128_route@15: + // tests/artifacts/state-ops/contract.algo.ts:855 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:855 + // @arc4.abimethod() + callsub get_arc4_uintn128 + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___get_arc4_dynamic_bytes_route@16: + // tests/artifacts/state-ops/contract.algo.ts:860 + // @arc4.abimethod() + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txna ApplicationArgs 1 + btoi + txnas Accounts + // tests/artifacts/state-ops/contract.algo.ts:860 + // @arc4.abimethod() + callsub get_arc4_dynamic_bytes + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + retsub + +__puya_arc4_router___bare_routing@19: + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + txn OnCompletion + bnz __puya_arc4_router___after_if_else@23 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@23: + // tests/artifacts/state-ops/contract.algo.ts:755 + // export class LocalStateContract extends arc4.Contract { + intc_1 // 0 + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.opt_in() -> void: +opt_in: + // tests/artifacts/state-ops/contract.algo.ts:774-775 + // @arc4.abimethod({ allowActions: ['OptIn'] }) + // opt_in(): void { + proto 0 0 + // tests/artifacts/state-ops/contract.algo.ts:776 + // this.implicitKeyArc4UintN64(Global.creatorAddress).value = new UintN64(1337) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:757 + // implicitKeyArc4UintN64 = LocalState() + bytec_1 // "implicitKeyArc4UintN64" + // tests/artifacts/state-ops/contract.algo.ts:776 + // this.implicitKeyArc4UintN64(Global.creatorAddress).value = new UintN64(1337) + bytec_2 // 0x0000000000000539 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:777 + // this.implicitKeyArc4Str(Global.creatorAddress).value = new Str('Hello') + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:758 + // implicitKeyArc4Str = LocalState() + bytec_3 // "implicitKeyArc4Str" + // tests/artifacts/state-ops/contract.algo.ts:777 + // this.implicitKeyArc4Str(Global.creatorAddress).value = new Str('Hello') + bytec 4 // 0x000548656c6c6f + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:778 + // this.implicitKeyArc4Byte(Global.creatorAddress).value = new Byte(0) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:759 + // implicitKeyArc4Byte = LocalState() + bytec 5 // "implicitKeyArc4Byte" + // tests/artifacts/state-ops/contract.algo.ts:778 + // this.implicitKeyArc4Byte(Global.creatorAddress).value = new Byte(0) + pushbytes 0x00 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:779 + // this.implicitKeyArc4Bool(Global.creatorAddress).value = new Bool(true) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:760 + // implicitKeyArc4Bool = LocalState() + bytec 6 // "implicitKeyArc4Bool" + // tests/artifacts/state-ops/contract.algo.ts:779 + // this.implicitKeyArc4Bool(Global.creatorAddress).value = new Bool(true) + pushbytes 0x80 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:780 + // this.implicitKeyArc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:761 + // implicitKeyArc4Address = LocalState
() + bytec 7 // "implicitKeyArc4Address" + // tests/artifacts/state-ops/contract.algo.ts:780 + // this.implicitKeyArc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + global CreatorAddress + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:781 + // this.implicitKeyArc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:762 + // implicitKeyArc4UintN128 = LocalState() + bytec 8 // "implicitKeyArc4UintN128" + // tests/artifacts/state-ops/contract.algo.ts:781 + // this.implicitKeyArc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + bytec 9 // 0x00000010000000000000000000000000 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:782 + // this.implicitKeyArc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:763 + // implicitKeyArc4DynamicBytes = LocalState() + bytec 10 // "implicitKeyArc4DynamicBytes" + // tests/artifacts/state-ops/contract.algo.ts:782 + // this.implicitKeyArc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + bytec 11 // 0x000d64796e616d6963206279746573 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:784 + // this.arc4UintN64(Global.creatorAddress).value = new UintN64(1337) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:766 + // arc4UintN64 = LocalState({ key: 'explicit_key_arc4_uintn64' }) + bytec 12 // "explicit_key_arc4_uintn64" + // tests/artifacts/state-ops/contract.algo.ts:784 + // this.arc4UintN64(Global.creatorAddress).value = new UintN64(1337) + bytec_2 // 0x0000000000000539 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:785 + // this.arc4Str(Global.creatorAddress).value = new Str('Hello') + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:767 + // arc4Str = LocalState({ key: 'explicit_key_arc4_str' }) + bytec 13 // "explicit_key_arc4_str" + // tests/artifacts/state-ops/contract.algo.ts:785 + // this.arc4Str(Global.creatorAddress).value = new Str('Hello') + bytec 4 // 0x000548656c6c6f + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:786 + // this.arc4Byte(Global.creatorAddress).value = new Byte(0) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:768 + // arc4Byte = LocalState({ key: 'explicit_key_arc4_byte' }) + bytec 14 // "explicit_key_arc4_byte" + // tests/artifacts/state-ops/contract.algo.ts:786 + // this.arc4Byte(Global.creatorAddress).value = new Byte(0) + pushbytes 0x00 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:787 + // this.arc4Bool(Global.creatorAddress).value = new Bool(true) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:769 + // arc4Bool = LocalState({ key: 'explicit_key_arc4_bool' }) + bytec 15 // "explicit_key_arc4_bool" + // tests/artifacts/state-ops/contract.algo.ts:787 + // this.arc4Bool(Global.creatorAddress).value = new Bool(true) + pushbytes 0x80 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:788 + // this.arc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:770 + // arc4Address = LocalState
({ key: 'explicit_key_arc4_address' }) + bytec 16 // "explicit_key_arc4_address" + // tests/artifacts/state-ops/contract.algo.ts:788 + // this.arc4Address(Global.creatorAddress).value = new Address(Global.creatorAddress) + global CreatorAddress + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:789 + // this.arc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:771 + // arc4UintN128 = LocalState({ key: 'explicit_key_arc4_uintn128' }) + bytec 17 // "explicit_key_arc4_uintn128" + // tests/artifacts/state-ops/contract.algo.ts:789 + // this.arc4UintN128(Global.creatorAddress).value = new UintN128(2n ** 100n) + bytec 9 // 0x00000010000000000000000000000000 + app_local_put + // tests/artifacts/state-ops/contract.algo.ts:790 + // this.arc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + global CreatorAddress + // tests/artifacts/state-ops/contract.algo.ts:772 + // arc4DynamicBytes = LocalState({ key: 'explicit_key_arc4_dynamic_bytes' }) + bytec 18 // "explicit_key_arc4_dynamic_bytes" + // tests/artifacts/state-ops/contract.algo.ts:790 + // this.arc4DynamicBytes(Global.creatorAddress).value = new DynamicBytes('dynamic bytes') + bytec 11 // 0x000d64796e616d6963206279746573 + app_local_put + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_uintn64(a: bytes) -> bytes: +get_implicit_key_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:794-795 + // @arc4.abimethod() + // get_implicit_key_arc4_uintn64(a: Account): UintN64 { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:796 + // return this.implicitKeyArc4UintN64(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:757 + // implicitKeyArc4UintN64 = LocalState() + bytec_1 // "implicitKeyArc4UintN64" + // tests/artifacts/state-ops/contract.algo.ts:796 + // return this.implicitKeyArc4UintN64(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_str(a: bytes) -> bytes: +get_implicit_key_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:799-800 + // @arc4.abimethod() + // get_implicit_key_arc4_str(a: Account): Str { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:801 + // return this.implicitKeyArc4Str(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:758 + // implicitKeyArc4Str = LocalState() + bytec_3 // "implicitKeyArc4Str" + // tests/artifacts/state-ops/contract.algo.ts:801 + // return this.implicitKeyArc4Str(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_byte(a: bytes) -> bytes: +get_implicit_key_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:804-805 + // @arc4.abimethod() + // get_implicit_key_arc4_byte(a: Account): Byte { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:806 + // return this.implicitKeyArc4Byte(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:759 + // implicitKeyArc4Byte = LocalState() + bytec 5 // "implicitKeyArc4Byte" + // tests/artifacts/state-ops/contract.algo.ts:806 + // return this.implicitKeyArc4Byte(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_bool(a: bytes) -> bytes: +get_implicit_key_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:809-810 + // @arc4.abimethod() + // get_implicit_key_arc4_bool(a: Account): Bool { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:811 + // return this.implicitKeyArc4Bool(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:760 + // implicitKeyArc4Bool = LocalState() + bytec 6 // "implicitKeyArc4Bool" + // tests/artifacts/state-ops/contract.algo.ts:811 + // return this.implicitKeyArc4Bool(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_address(a: bytes) -> bytes: +get_implicit_key_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:814-815 + // @arc4.abimethod() + // get_implicit_key_arc4_address(a: Account): Address { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:816 + // return this.implicitKeyArc4Address(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:761 + // implicitKeyArc4Address = LocalState
() + bytec 7 // "implicitKeyArc4Address" + // tests/artifacts/state-ops/contract.algo.ts:816 + // return this.implicitKeyArc4Address(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_uintn128(a: bytes) -> bytes: +get_implicit_key_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:819-820 + // @arc4.abimethod() + // get_implicit_key_arc4_uintn128(a: Account): UintN128 { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:821 + // return this.implicitKeyArc4UintN128(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:762 + // implicitKeyArc4UintN128 = LocalState() + bytec 8 // "implicitKeyArc4UintN128" + // tests/artifacts/state-ops/contract.algo.ts:821 + // return this.implicitKeyArc4UintN128(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_implicit_key_arc4_dynamic_bytes(a: bytes) -> bytes: +get_implicit_key_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:824-825 + // @arc4.abimethod() + // get_implicit_key_arc4_dynamic_bytes(a: Account): DynamicBytes { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:826 + // return this.implicitKeyArc4DynamicBytes(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:763 + // implicitKeyArc4DynamicBytes = LocalState() + bytec 10 // "implicitKeyArc4DynamicBytes" + // tests/artifacts/state-ops/contract.algo.ts:826 + // return this.implicitKeyArc4DynamicBytes(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_uintn64(a: bytes) -> bytes: +get_arc4_uintn64: + // tests/artifacts/state-ops/contract.algo.ts:830-831 + // @arc4.abimethod() + // get_arc4_uintn64(a: Account): arc4.UintN64 { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:832 + // return this.arc4UintN64(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:766 + // arc4UintN64 = LocalState({ key: 'explicit_key_arc4_uintn64' }) + bytec 12 // "explicit_key_arc4_uintn64" + // tests/artifacts/state-ops/contract.algo.ts:832 + // return this.arc4UintN64(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_str(a: bytes) -> bytes: +get_arc4_str: + // tests/artifacts/state-ops/contract.algo.ts:835-836 + // @arc4.abimethod() + // get_arc4_str(a: Account): Str { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:837 + // return this.arc4Str(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:767 + // arc4Str = LocalState({ key: 'explicit_key_arc4_str' }) + bytec 13 // "explicit_key_arc4_str" + // tests/artifacts/state-ops/contract.algo.ts:837 + // return this.arc4Str(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_byte(a: bytes) -> bytes: +get_arc4_byte: + // tests/artifacts/state-ops/contract.algo.ts:840-841 + // @arc4.abimethod() + // get_arc4_byte(a: Account): Byte { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:842 + // return this.arc4Byte(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:768 + // arc4Byte = LocalState({ key: 'explicit_key_arc4_byte' }) + bytec 14 // "explicit_key_arc4_byte" + // tests/artifacts/state-ops/contract.algo.ts:842 + // return this.arc4Byte(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_bool(a: bytes) -> bytes: +get_arc4_bool: + // tests/artifacts/state-ops/contract.algo.ts:845-846 + // @arc4.abimethod() + // get_arc4_bool(a: Account): Bool { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:847 + // return this.arc4Bool(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:769 + // arc4Bool = LocalState({ key: 'explicit_key_arc4_bool' }) + bytec 15 // "explicit_key_arc4_bool" + // tests/artifacts/state-ops/contract.algo.ts:847 + // return this.arc4Bool(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_address(a: bytes) -> bytes: +get_arc4_address: + // tests/artifacts/state-ops/contract.algo.ts:850-851 + // @arc4.abimethod() + // get_arc4_address(a: Account): Address { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:852 + // return this.arc4Address(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:770 + // arc4Address = LocalState
({ key: 'explicit_key_arc4_address' }) + bytec 16 // "explicit_key_arc4_address" + // tests/artifacts/state-ops/contract.algo.ts:852 + // return this.arc4Address(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_uintn128(a: bytes) -> bytes: +get_arc4_uintn128: + // tests/artifacts/state-ops/contract.algo.ts:855-856 + // @arc4.abimethod() + // get_arc4_uintn128(a: Account): UintN128 { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:857 + // return this.arc4UintN128(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:771 + // arc4UintN128 = LocalState({ key: 'explicit_key_arc4_uintn128' }) + bytec 17 // "explicit_key_arc4_uintn128" + // tests/artifacts/state-ops/contract.algo.ts:857 + // return this.arc4UintN128(a).value + app_local_get_ex + assert // check LocalState exists + retsub + + +// tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.get_arc4_dynamic_bytes(a: bytes) -> bytes: +get_arc4_dynamic_bytes: + // tests/artifacts/state-ops/contract.algo.ts:860-861 + // @arc4.abimethod() + // get_arc4_dynamic_bytes(a: Account): DynamicBytes { + proto 1 1 + // tests/artifacts/state-ops/contract.algo.ts:862 + // return this.arc4DynamicBytes(a).value + frame_dig -1 + intc_1 // 0 + // tests/artifacts/state-ops/contract.algo.ts:772 + // arc4DynamicBytes = LocalState({ key: 'explicit_key_arc4_dynamic_bytes' }) + bytec 18 // "explicit_key_arc4_dynamic_bytes" + // tests/artifacts/state-ops/contract.algo.ts:862 + // return this.arc4DynamicBytes(a).value + app_local_get_ex + assert // check LocalState exists + retsub diff --git a/tests/artifacts/state-ops/data/LocalStateContract.arc32.json b/tests/artifacts/state-ops/data/LocalStateContract.arc32.json new file mode 100644 index 0000000..5bc511d --- /dev/null +++ b/tests/artifacts/state-ops/data/LocalStateContract.arc32.json @@ -0,0 +1,359 @@ +{ + "hints": { + "opt_in()void": { + "call_config": { + "opt_in": "CALL" + } + }, + "get_implicit_key_arc4_uintn64(account)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_str(account)string": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_byte(account)byte": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_bool(account)bool": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_address(account)address": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_uintn128(account)uint128": { + "call_config": { + "no_op": "CALL" + } + }, + "get_implicit_key_arc4_dynamic_bytes(account)byte[]": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_uintn64(account)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_str(account)string": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_byte(account)byte": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_bool(account)bool": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_address(account)address": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_uintn128(account)uint128": { + "call_config": { + "no_op": "CALL" + } + }, + "get_arc4_dynamic_bytes(account)byte[]": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgImltcGxpY2l0S2V5QXJjNFVpbnRONjQiIDB4MDAwMDAwMDAwMDAwMDUzOSAiaW1wbGljaXRLZXlBcmM0U3RyIiAweDAwMDU0ODY1NmM2YzZmICJpbXBsaWNpdEtleUFyYzRCeXRlIiAiaW1wbGljaXRLZXlBcmM0Qm9vbCIgImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiICJpbXBsaWNpdEtleUFyYzRVaW50TjEyOCIgMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzIiAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MyAiZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCIgImV4cGxpY2l0X2tleV9hcmM0X3N0ciIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IiAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOQogICAgcHVzaGJ5dGVzcyAweDMwYzZkNThhIDB4ZWVjZGYwYTAgMHg2YzZmMTdkYSAweGVjZjYzM2IwIDB4M2U1MzEyMjMgMHgzZWQ2Nzk5ZCAweDZmZWNkZDgwIDB4Njc2YTg3YzIgMHgxZTBmODk1MSAweDQyZTg1ZmQ3IDB4NjUyMWQ0OWIgMHhlMDdjNTZjZCAweGFhMTlkMmI1IDB4YjkyMjMxMmQgMHhmYzBmZWVkOSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoYWNjb3VudClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGFjY291bnQpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYWNjb3VudClib29sIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOChhY2NvdW50KXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFjY291bnQpYnl0ZVtdIiwgbWV0aG9kICJnZXRfYXJjNF91aW50bjY0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHIoYWNjb3VudClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWNjb3VudClieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFjY291bnQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnRuMTI4KGFjY291bnQpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcyhhY2NvdW50KWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG42NF9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9zdHJfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYnl0ZV9yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2FkZHJlc3Nfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG4xMjhfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfZHluYW1pY19ieXRlc19yb3V0ZUAxNgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBvcHRfaW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjhfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3VpbnRuNjRfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG42NAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfc3RyX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9hcmM0X3N0cgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYnl0ZV9yb3V0ZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9hcmM0X2Jvb2wKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2FkZHJlc3Nfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfYWRkcmVzcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG4xMjhfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbigpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzQtNzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgLy8gb3B0X2luKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc2CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBVaW50TjY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnRONjQgPSBMb2NhbFN0YXRlPFVpbnRONjQ+KCkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0S2V5QXJjNFVpbnRONjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc2CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBVaW50TjY0KDEzMzcpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3NwogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRTdHIoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBTdHIoJ0hlbGxvJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OAogICAgLy8gaW1wbGljaXRLZXlBcmM0U3RyID0gTG9jYWxTdGF0ZTxTdHI+KCkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0S2V5QXJjNFN0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgU3RyKCdIZWxsbycpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzgKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oKQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzgKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEJ5dGUoMCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc5CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjAKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBMb2NhbFN0YXRlPEJvb2w+KCkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc5CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBMb2NhbFN0YXRlPEFkZHJlc3M+KCkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MQogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRVaW50TjEyOChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjIKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgxCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MgogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBEeW5hbWljQnl0ZXMoJ2R5bmFtaWMgYnl0ZXMnKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYzCiAgICAvLyBpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMgPSBMb2NhbFN0YXRlPER5bmFtaWNCeXRlcz4oKQogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODIKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyB0aGlzLmFyYzRVaW50TjY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE42NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY2CiAgICAvLyBhcmM0VWludE42NCA9IExvY2FsU3RhdGU8VWludE42ND4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyB0aGlzLmFyYzRVaW50TjY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE42NCgxMzM3KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuYXJjNFN0cihHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFN0cignSGVsbG8nKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY3CiAgICAvLyBhcmM0U3RyID0gTG9jYWxTdGF0ZTxTdHI+KHsga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuYXJjNFN0cihHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFN0cignSGVsbG8nKQogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLmFyYzRCeXRlKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY4CiAgICAvLyBhcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLmFyYzRCeXRlKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQnl0ZSgwKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIHRoaXMuYXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIHRoaXMuYXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gdGhpcy5hcmM0QWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyBhcmM0QWRkcmVzcyA9IExvY2FsU3RhdGU8QWRkcmVzcz4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzJyB9KQogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg4CiAgICAvLyB0aGlzLmFyYzRBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODkKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MQogICAgLy8gYXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODkKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gdGhpcy5hcmM0RHluYW1pY0J5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MgogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IExvY2FsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTAKICAgIC8vIHRoaXMuYXJjNER5bmFtaWNCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTQtNzk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYTogQWNjb3VudCk6IFVpbnRONjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRVaW50TjY0KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU3CiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjY0ID0gTG9jYWxTdGF0ZTxVaW50TjY0PigpCiAgICBieXRlY18xIC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTktODAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cihhOiBBY2NvdW50KTogU3RyIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU4CiAgICAvLyBpbXBsaWNpdEtleUFyYzRTdHIgPSBMb2NhbFN0YXRlPFN0cj4oKQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRLZXlBcmM0U3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODA0LTgwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGE6IEFjY291bnQpOiBCeXRlIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oKQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDktODEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYTogQWNjb3VudCk6IEJvb2wgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODExCiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRCb29sKGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYwCiAgICAvLyBpbXBsaWNpdEtleUFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPigpCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdEtleUFyYzRCb29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qm9vbChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxNC04MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhOiBBY2NvdW50KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBMb2NhbFN0YXRlPEFkZHJlc3M+KCkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODE2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRBZGRyZXNzKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOChhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTktODIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KGE6IEFjY291bnQpOiBVaW50TjEyOCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjEKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjEyOCA9IExvY2FsU3RhdGU8VWludE4xMjg+KCkKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0S2V5QXJjNFVpbnROMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjQtODI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYTogQWNjb3VudCk6IER5bmFtaWNCeXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyhhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc2MwogICAgLy8gaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzID0gTG9jYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KCkKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODI2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludG42NChhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuNjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuNjQoYTogQWNjb3VudCk6IGFyYzQuVWludE42NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjY0KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY2CiAgICAvLyBhcmM0VWludE42NCA9IExvY2FsU3RhdGU8VWludE42ND4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyByZXR1cm4gdGhpcy5hcmM0VWludE42NChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODM1LTgzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3N0cihhOiBBY2NvdW50KTogU3RyIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFN0cihhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc2NwogICAgLy8gYXJjNFN0ciA9IExvY2FsU3RhdGU8U3RyPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3N0cicgfSkKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODM3CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0U3RyKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGUoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0MC04NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ieXRlKGE6IEFjY291bnQpOiBCeXRlIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJ5dGUoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjgKICAgIC8vIGFyYzRCeXRlID0gTG9jYWxTdGF0ZTxCeXRlPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2J5dGUnIH0pCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRCeXRlKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2woYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NS04NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ib29sKGE6IEFjY291bnQpOiBCb29sIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2woYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRCb29sKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3MoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MC04NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9hZGRyZXNzKGE6IEFjY291bnQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEFkZHJlc3MoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzAKICAgIC8vIGFyYzRBZGRyZXNzID0gTG9jYWxTdGF0ZTxBZGRyZXNzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRBZGRyZXNzKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRuMTI4KGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FyYzRfdWludG4xMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODU1LTg1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuMTI4KGE6IEFjY291bnQpOiBVaW50TjEyOCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOChhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MQogICAgLy8gYXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NjAtODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfZHluYW1pY19ieXRlcyhhOiBBY2NvdW50KTogRHluYW1pY0J5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNER5bmFtaWNCeXRlcyhhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MgogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IExvY2FsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NjIKICAgIC8vIHJldHVybiB0aGlzLmFyYzREeW5hbWljQnl0ZXMoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 14, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": {}, + "reserved": {} + }, + "local": { + "declared": { + "arc4Address": { + "type": "bytes", + "key": "explicit_key_arc4_address" + }, + "arc4Bool": { + "type": "bytes", + "key": "explicit_key_arc4_bool" + }, + "arc4Byte": { + "type": "bytes", + "key": "explicit_key_arc4_byte" + }, + "arc4DynamicBytes": { + "type": "bytes", + "key": "explicit_key_arc4_dynamic_bytes" + }, + "arc4Str": { + "type": "bytes", + "key": "explicit_key_arc4_str" + }, + "arc4UintN128": { + "type": "bytes", + "key": "explicit_key_arc4_uintn128" + }, + "arc4UintN64": { + "type": "bytes", + "key": "explicit_key_arc4_uintn64" + }, + "implicitKeyArc4Address": { + "type": "bytes", + "key": "implicitKeyArc4Address" + }, + "implicitKeyArc4Bool": { + "type": "bytes", + "key": "implicitKeyArc4Bool" + }, + "implicitKeyArc4Byte": { + "type": "bytes", + "key": "implicitKeyArc4Byte" + }, + "implicitKeyArc4DynamicBytes": { + "type": "bytes", + "key": "implicitKeyArc4DynamicBytes" + }, + "implicitKeyArc4Str": { + "type": "bytes", + "key": "implicitKeyArc4Str" + }, + "implicitKeyArc4UintN128": { + "type": "bytes", + "key": "implicitKeyArc4UintN128" + }, + "implicitKeyArc4UintN64": { + "type": "bytes", + "key": "implicitKeyArc4UintN64" + } + }, + "reserved": {} + } + }, + "contract": { + "name": "LocalStateContract", + "methods": [ + { + "name": "opt_in", + "args": [], + "readonly": false, + "returns": { + "type": "void" + } + }, + { + "name": "get_implicit_key_arc4_uintn64", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "get_implicit_key_arc4_str", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "string" + } + }, + { + "name": "get_implicit_key_arc4_byte", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "byte" + } + }, + { + "name": "get_implicit_key_arc4_bool", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "bool" + } + }, + { + "name": "get_implicit_key_arc4_address", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "address" + } + }, + { + "name": "get_implicit_key_arc4_uintn128", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "uint128" + } + }, + { + "name": "get_implicit_key_arc4_dynamic_bytes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "byte[]" + } + }, + { + "name": "get_arc4_uintn64", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "get_arc4_str", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "string" + } + }, + { + "name": "get_arc4_byte", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "byte" + } + }, + { + "name": "get_arc4_bool", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "bool" + } + }, + { + "name": "get_arc4_address", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "address" + } + }, + { + "name": "get_arc4_uintn128", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "uint128" + } + }, + { + "name": "get_arc4_dynamic_bytes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "readonly": false, + "returns": { + "type": "byte[]" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/LocalStateContract.arc56.json b/tests/artifacts/state-ops/data/LocalStateContract.arc56.json new file mode 100644 index 0000000..f2de7ea --- /dev/null +++ b/tests/artifacts/state-ops/data/LocalStateContract.arc56.json @@ -0,0 +1,507 @@ +{ + "name": "LocalStateContract", + "structs": {}, + "methods": [ + { + "name": "opt_in", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_uintn64", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_str", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_byte", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "byte" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_bool", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_address", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_uintn128", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint128" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_implicit_key_arc4_dynamic_bytes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_uintn64", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_str", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_byte", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "byte" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_bool", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_address", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_uintn128", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint128" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_arc4_dynamic_bytes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 14 + } + }, + "keys": { + "global": {}, + "local": { + "implicitKeyArc4UintN64": { + "keyType": "AVMString", + "valueType": "uint64", + "key": "aW1wbGljaXRLZXlBcmM0VWludE42NA==" + }, + "implicitKeyArc4Str": { + "keyType": "AVMString", + "valueType": "string", + "key": "aW1wbGljaXRLZXlBcmM0U3Ry" + }, + "implicitKeyArc4Byte": { + "keyType": "AVMString", + "valueType": "byte", + "key": "aW1wbGljaXRLZXlBcmM0Qnl0ZQ==" + }, + "implicitKeyArc4Bool": { + "keyType": "AVMString", + "valueType": "bool", + "key": "aW1wbGljaXRLZXlBcmM0Qm9vbA==" + }, + "implicitKeyArc4Address": { + "keyType": "AVMString", + "valueType": "address", + "key": "aW1wbGljaXRLZXlBcmM0QWRkcmVzcw==" + }, + "implicitKeyArc4UintN128": { + "keyType": "AVMString", + "valueType": "uint128", + "key": "aW1wbGljaXRLZXlBcmM0VWludE4xMjg=" + }, + "implicitKeyArc4DynamicBytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "aW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVz" + }, + "arc4UintN64": { + "keyType": "AVMString", + "valueType": "uint64", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfdWludG42NA==" + }, + "arc4Str": { + "keyType": "AVMString", + "valueType": "string", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfc3Ry" + }, + "arc4Byte": { + "keyType": "AVMString", + "valueType": "byte", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYnl0ZQ==" + }, + "arc4Bool": { + "keyType": "AVMString", + "valueType": "bool", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYm9vbA==" + }, + "arc4Address": { + "keyType": "AVMString", + "valueType": "address", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcw==" + }, + "arc4UintN128": { + "keyType": "AVMString", + "valueType": "uint128", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfdWludG4xMjg=" + }, + "arc4DynamicBytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "ZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcw==" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 540, + 562, + 584, + 606, + 628, + 650, + 672, + 694, + 716, + 738, + 760, + 782, + 804, + 826 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 528 + ], + "errorMessage": "OnCompletion is not OptIn" + }, + { + "pc": [ + 853 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 531, + 543, + 565, + 587, + 609, + 631, + 653, + 675, + 697, + 719, + 741, + 763, + 785, + 807, + 829 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 968, + 978, + 989, + 1000, + 1011, + 1022, + 1033, + 1044, + 1055, + 1066, + 1077, + 1088, + 1099, + 1110 + ], + "errorMessage": "check LocalState exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgImltcGxpY2l0S2V5QXJjNFVpbnRONjQiIDB4MDAwMDAwMDAwMDAwMDUzOSAiaW1wbGljaXRLZXlBcmM0U3RyIiAweDAwMDU0ODY1NmM2YzZmICJpbXBsaWNpdEtleUFyYzRCeXRlIiAiaW1wbGljaXRLZXlBcmM0Qm9vbCIgImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiICJpbXBsaWNpdEtleUFyYzRVaW50TjEyOCIgMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzIiAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MyAiZXhwbGljaXRfa2V5X2FyYzRfdWludG42NCIgImV4cGxpY2l0X2tleV9hcmM0X3N0ciIgImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiICJleHBsaWNpdF9rZXlfYXJjNF9ib29sIiAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIgImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4IiAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOQogICAgcHVzaGJ5dGVzcyAweDMwYzZkNThhIDB4ZWVjZGYwYTAgMHg2YzZmMTdkYSAweGVjZjYzM2IwIDB4M2U1MzEyMjMgMHgzZWQ2Nzk5ZCAweDZmZWNkZDgwIDB4Njc2YTg3YzIgMHgxZTBmODk1MSAweDQyZTg1ZmQ3IDB4NjUyMWQ0OWIgMHhlMDdjNTZjZCAweGFhMTlkMmI1IDB4YjkyMjMxMmQgMHhmYzBmZWVkOSAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHIoYWNjb3VudClzdHJpbmciLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGFjY291bnQpYnl0ZSIsIG1ldGhvZCAiZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYWNjb3VudClib29sIiwgbWV0aG9kICJnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOChhY2NvdW50KXVpbnQxMjgiLCBtZXRob2QgImdldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzKGFjY291bnQpYnl0ZVtdIiwgbWV0aG9kICJnZXRfYXJjNF91aW50bjY0KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJnZXRfYXJjNF9zdHIoYWNjb3VudClzdHJpbmciLCBtZXRob2QgImdldF9hcmM0X2J5dGUoYWNjb3VudClieXRlIiwgbWV0aG9kICJnZXRfYXJjNF9ib29sKGFjY291bnQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FyYzRfYWRkcmVzcyhhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgImdldF9hcmM0X3VpbnRuMTI4KGFjY291bnQpdWludDEyOCIsIG1ldGhvZCAiZ2V0X2FyYzRfZHluYW1pY19ieXRlcyhhY2NvdW50KWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cl9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2xfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOF9yb3V0ZUA4IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG42NF9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9zdHJfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYnl0ZV9yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2FkZHJlc3Nfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG4xMjhfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfZHluYW1pY19ieXRlc19yb3V0ZUAxNgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBvcHRfaW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjY0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9zdHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYnl0ZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ib29sCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzc19yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjhfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9pbXBsaWNpdF9rZXlfYXJjNF9keW5hbWljX2J5dGVzX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X3VpbnRuNjRfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG42NAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfc3RyX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9hcmM0X3N0cgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfYnl0ZV9yb3V0ZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGV4cG9ydCBjbGFzcyBMb2NhbFN0YXRlQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfYXJjNF9ieXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfYXJjNF9ib29sX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdldF9hcmM0X2Jvb2wKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2FkZHJlc3Nfcm91dGVAMTQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfYWRkcmVzcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FyYzRfdWludG4xMjhfcm91dGVAMTU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfdWludG4xMjgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcmM0X2R5bmFtaWNfYnl0ZXNfcm91dGVAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU1CiAgICAvLyBleHBvcnQgY2xhc3MgTG9jYWxTdGF0ZUNvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ2V0X2FyYzRfZHluYW1pY19ieXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1NQogICAgLy8gZXhwb3J0IGNsYXNzIExvY2FsU3RhdGVDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0Lm9wdF9pbigpIC0+IHZvaWQ6Cm9wdF9pbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzQtNzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgLy8gb3B0X2luKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc2CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBVaW50TjY0KDEzMzcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NTcKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnRONjQgPSBMb2NhbFN0YXRlPFVpbnRONjQ+KCkKICAgIGJ5dGVjXzEgLy8gImltcGxpY2l0S2V5QXJjNFVpbnRONjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc2CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnRONjQoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBVaW50TjY0KDEzMzcpCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDUzOQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3NwogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRTdHIoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBTdHIoJ0hlbGxvJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OAogICAgLy8gaW1wbGljaXRLZXlBcmM0U3RyID0gTG9jYWxTdGF0ZTxTdHI+KCkKICAgIGJ5dGVjXzMgLy8gImltcGxpY2l0S2V5QXJjNFN0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzcKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgU3RyKCdIZWxsbycpCiAgICBieXRlYyA0IC8vIDB4MDAwNTQ4NjU2YzZjNmYKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzgKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEJ5dGUoMCkKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oKQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzgKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEJ5dGUoMCkKICAgIHB1c2hieXRlcyAweDAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc5CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjAKICAgIC8vIGltcGxpY2l0S2V5QXJjNEJvb2wgPSBMb2NhbFN0YXRlPEJvb2w+KCkKICAgIGJ5dGVjIDYgLy8gImltcGxpY2l0S2V5QXJjNEJvb2wiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzc5CiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBMb2NhbFN0YXRlPEFkZHJlc3M+KCkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgwCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MQogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzRVaW50TjEyOChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFVpbnROMTI4KDJuICoqIDEwMG4pCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjIKICAgIC8vIGltcGxpY2l0S2V5QXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oKQogICAgYnl0ZWMgOCAvLyAiaW1wbGljaXRLZXlBcmM0VWludE4xMjgiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgxCiAgICAvLyB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4MgogICAgLy8gdGhpcy5pbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBEeW5hbWljQnl0ZXMoJ2R5bmFtaWMgYnl0ZXMnKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYzCiAgICAvLyBpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMgPSBMb2NhbFN0YXRlPER5bmFtaWNCeXRlcz4oKQogICAgYnl0ZWMgMTAgLy8gImltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODIKICAgIC8vIHRoaXMuaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykKICAgIGJ5dGVjIDExIC8vIDB4MDAwZDY0Nzk2ZTYxNmQ2OTYzMjA2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyB0aGlzLmFyYzRVaW50TjY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE42NCgxMzM3KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY2CiAgICAvLyBhcmM0VWludE42NCA9IExvY2FsU3RhdGU8VWludE42ND4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyB0aGlzLmFyYzRVaW50TjY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE42NCgxMzM3KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDA1MzkKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuYXJjNFN0cihHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFN0cignSGVsbG8nKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY3CiAgICAvLyBhcmM0U3RyID0gTG9jYWxTdGF0ZTxTdHI+KHsga2V5OiAnZXhwbGljaXRfa2V5X2FyYzRfc3RyJyB9KQogICAgYnl0ZWMgMTMgLy8gImV4cGxpY2l0X2tleV9hcmM0X3N0ciIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuYXJjNFN0cihHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IFN0cignSGVsbG8nKQogICAgYnl0ZWMgNCAvLyAweDAwMDU0ODY1NmM2YzZmCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLmFyYzRCeXRlKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQnl0ZSgwKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY4CiAgICAvLyBhcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9ieXRlJyB9KQogICAgYnl0ZWMgMTQgLy8gImV4cGxpY2l0X2tleV9hcmM0X2J5dGUiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg2CiAgICAvLyB0aGlzLmFyYzRCeXRlKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQnl0ZSgwKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIHRoaXMuYXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODcKICAgIC8vIHRoaXMuYXJjNEJvb2woR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gdGhpcy5hcmM0QWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IEFkZHJlc3MoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzcwCiAgICAvLyBhcmM0QWRkcmVzcyA9IExvY2FsU3RhdGU8QWRkcmVzcz4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzJyB9KQogICAgYnl0ZWMgMTYgLy8gImV4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzg4CiAgICAvLyB0aGlzLmFyYzRBZGRyZXNzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgQWRkcmVzcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODkKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MQogICAgLy8gYXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3ODkKICAgIC8vIHRoaXMuYXJjNFVpbnROMTI4KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgVWludE4xMjgoMm4gKiogMTAwbikKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gdGhpcy5hcmM0RHluYW1pY0J5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBuZXcgRHluYW1pY0J5dGVzKCdkeW5hbWljIGJ5dGVzJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MgogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IExvY2FsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTAKICAgIC8vIHRoaXMuYXJjNER5bmFtaWNCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IER5bmFtaWNCeXRlcygnZHluYW1pYyBieXRlcycpCiAgICBieXRlYyAxMSAvLyAweDAwMGQ2NDc5NmU2MTZkNjk2MzIwNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfdWludG42NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTQtNzk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuNjQoYTogQWNjb3VudCk6IFVpbnRONjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Nzk2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRVaW50TjY0KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU3CiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjY0ID0gTG9jYWxTdGF0ZTxVaW50TjY0PigpCiAgICBieXRlY18xIC8vICJpbXBsaWNpdEtleUFyYzRVaW50TjY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE42NChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfc3RyKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OTktODAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3N0cihhOiBBY2NvdW50KTogU3RyIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzU4CiAgICAvLyBpbXBsaWNpdEtleUFyYzRTdHIgPSBMb2NhbFN0YXRlPFN0cj4oKQogICAgYnl0ZWNfMyAvLyAiaW1wbGljaXRLZXlBcmM0U3RyIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0U3RyKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2J5dGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODA0LTgwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9pbXBsaWNpdF9rZXlfYXJjNF9ieXRlKGE6IEFjY291bnQpOiBCeXRlIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgwNgogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qnl0ZShhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gaW1wbGljaXRLZXlBcmM0Qnl0ZSA9IExvY2FsU3RhdGU8Qnl0ZT4oKQogICAgYnl0ZWMgNSAvLyAiaW1wbGljaXRLZXlBcmM0Qnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEJ5dGUoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfYm9vbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MDktODEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2Jvb2woYTogQWNjb3VudCk6IEJvb2wgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODExCiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRCb29sKGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYwCiAgICAvLyBpbXBsaWNpdEtleUFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPigpCiAgICBieXRlYyA2IC8vICJpbXBsaWNpdEtleUFyYzRCb29sIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0Qm9vbChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgxNC04MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfaW1wbGljaXRfa2V5X2FyYzRfYWRkcmVzcyhhOiBBY2NvdW50KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNEFkZHJlc3MoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjEKICAgIC8vIGltcGxpY2l0S2V5QXJjNEFkZHJlc3MgPSBMb2NhbFN0YXRlPEFkZHJlc3M+KCkKICAgIGJ5dGVjIDcgLy8gImltcGxpY2l0S2V5QXJjNEFkZHJlc3MiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODE2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzRBZGRyZXNzKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyOChhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9pbXBsaWNpdF9rZXlfYXJjNF91aW50bjEyODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MTktODIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X3VpbnRuMTI4KGE6IEFjY291bnQpOiBVaW50TjEyOCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjEKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNFVpbnROMTI4KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzYyCiAgICAvLyBpbXBsaWNpdEtleUFyYzRVaW50TjEyOCA9IExvY2FsU3RhdGU8VWludE4xMjg+KCkKICAgIGJ5dGVjIDggLy8gImltcGxpY2l0S2V5QXJjNFVpbnROMTI4IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgyMQogICAgLy8gcmV0dXJuIHRoaXMuaW1wbGljaXRLZXlBcmM0VWludE4xMjgoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfaW1wbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjQtODI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2ltcGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMoYTogQWNjb3VudCk6IER5bmFtaWNCeXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MjYKICAgIC8vIHJldHVybiB0aGlzLmltcGxpY2l0S2V5QXJjNER5bmFtaWNCeXRlcyhhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc2MwogICAgLy8gaW1wbGljaXRLZXlBcmM0RHluYW1pY0J5dGVzID0gTG9jYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KCkKICAgIGJ5dGVjIDEwIC8vICJpbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODI2CiAgICAvLyByZXR1cm4gdGhpcy5pbXBsaWNpdEtleUFyYzREeW5hbWljQnl0ZXMoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpMb2NhbFN0YXRlQ29udHJhY3QuZ2V0X2FyYzRfdWludG42NChhOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hcmM0X3VpbnRuNjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuNjQoYTogQWNjb3VudCk6IGFyYzQuVWludE42NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MzIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjY0KGEpLnZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzY2CiAgICAvLyBhcmM0VWludE42NCA9IExvY2FsU3RhdGU8VWludE42ND4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjY0JyB9KQogICAgYnl0ZWMgMTIgLy8gImV4cGxpY2l0X2tleV9hcmM0X3VpbnRuNjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyByZXR1cm4gdGhpcy5hcmM0VWludE42NChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9zdHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9zdHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODM1LTgzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3N0cihhOiBBY2NvdW50KTogU3RyIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gcmV0dXJuIHRoaXMuYXJjNFN0cihhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc2NwogICAgLy8gYXJjNFN0ciA9IExvY2FsU3RhdGU8U3RyPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X3N0cicgfSkKICAgIGJ5dGVjIDEzIC8vICJleHBsaWNpdF9rZXlfYXJjNF9zdHIiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODM3CiAgICAvLyByZXR1cm4gdGhpcy5hcmM0U3RyKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2J5dGUoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ieXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0MC04NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ieXRlKGE6IEFjY291bnQpOiBCeXRlIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJ5dGUoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjgKICAgIC8vIGFyYzRCeXRlID0gTG9jYWxTdGF0ZTxCeXRlPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2J5dGUnIH0pCiAgICBieXRlYyAxNCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYnl0ZSIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRCeXRlKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2Jvb2woYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9ib29sOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NS04NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9ib29sKGE6IEFjY291bnQpOiBCb29sIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEJvb2woYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFyYzRCb29sID0gTG9jYWxTdGF0ZTxCb29sPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2Jvb2wnIH0pCiAgICBieXRlYyAxNSAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYm9vbCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NDcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRCb29sKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X2FkZHJlc3MoYTogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYXJjNF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MC04NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBnZXRfYXJjNF9hZGRyZXNzKGE6IEFjY291bnQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg1MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNEFkZHJlc3MoYSkudmFsdWUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3NzAKICAgIC8vIGFyYzRBZGRyZXNzID0gTG9jYWxTdGF0ZTxBZGRyZXNzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2FkZHJlc3MnIH0pCiAgICBieXRlYyAxNiAvLyAiZXhwbGljaXRfa2V5X2FyYzRfYWRkcmVzcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTIKICAgIC8vIHJldHVybiB0aGlzLmFyYzRBZGRyZXNzKGEpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6TG9jYWxTdGF0ZUNvbnRyYWN0LmdldF9hcmM0X3VpbnRuMTI4KGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FyYzRfdWludG4xMjg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODU1LTg1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGdldF9hcmM0X3VpbnRuMTI4KGE6IEFjY291bnQpOiBVaW50TjEyOCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOChhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MQogICAgLy8gYXJjNFVpbnROMTI4ID0gTG9jYWxTdGF0ZTxVaW50TjEyOD4oeyBrZXk6ICdleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCcgfSkKICAgIGJ5dGVjIDE3IC8vICJleHBsaWNpdF9rZXlfYXJjNF91aW50bjEyOCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIHJldHVybiB0aGlzLmFyYzRVaW50TjEyOChhKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5nZXRfYXJjNF9keW5hbWljX2J5dGVzKGE6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FyYzRfZHluYW1pY19ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NjAtODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZ2V0X2FyYzRfZHluYW1pY19ieXRlcyhhOiBBY2NvdW50KTogRHluYW1pY0J5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gcmV0dXJuIHRoaXMuYXJjNER5bmFtaWNCeXRlcyhhKS52YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc3MgogICAgLy8gYXJjNER5bmFtaWNCeXRlcyA9IExvY2FsU3RhdGU8RHluYW1pY0J5dGVzPih7IGtleTogJ2V4cGxpY2l0X2tleV9hcmM0X2R5bmFtaWNfYnl0ZXMnIH0pCiAgICBieXRlYyAxOCAvLyAiZXhwbGljaXRfa2V5X2FyYzRfZHluYW1pY19ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4NjIKICAgIC8vIHJldHVybiB0aGlzLmFyYzREeW5hbWljQnl0ZXMoYSkudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OkxvY2FsU3RhdGVDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/LocalStateContract.clear.teal b/tests/artifacts/state-ops/data/LocalStateContract.clear.teal new file mode 100644 index 0000000..277d4be --- /dev/null +++ b/tests/artifacts/state-ops/data/LocalStateContract.clear.teal @@ -0,0 +1,5 @@ +#pragma version 10 + +tests/artifacts/state-ops/contract.algo.ts::LocalStateContract.clearStateProgram: + pushint 1 // 1 + return diff --git a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.approval.teal b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.approval.teal index 0b5e66e..dceec00 100644 --- a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.approval.teal @@ -1,770 +1,730 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAcctParamsGetContract.approval_program: - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@16 - method "verify_acct_balance(account)uint64" - method "verify_acct_min_balance(account)uint64" - method "verify_acct_auth_addr(account)address" - method "verify_acct_total_num_uint(account)uint64" - method "verify_acct_total_num_byte_slice(account)uint64" - method "verify_acct_total_extra_app_pages(account)uint64" - method "verify_acct_total_apps_created(account)uint64" - method "verify_acct_total_apps_opted_in(account)uint64" - method "verify_acct_total_assets_created(account)uint64" - method "verify_acct_total_assets(account)uint64" - method "verify_acct_total_boxes(account)uint64" - method "verify_acct_total_box_bytes(account)uint64" + bz __puya_arc4_router___bare_routing@16 + pushbytess 0x5f5b43e4 0x73dc93c7 0x5626dfeb 0xdc8a25bf 0x198ebd8c 0x2301ab26 0x9f68fca6 0xa975c2d1 0xd1e04801 0xb6966be5 0x195d5418 0x6adae3f1 // method "verify_acct_balance(account)uint64", method "verify_acct_min_balance(account)uint64", method "verify_acct_auth_addr(account)address", method "verify_acct_total_num_uint(account)uint64", method "verify_acct_total_num_byte_slice(account)uint64", method "verify_acct_total_extra_app_pages(account)uint64", method "verify_acct_total_apps_created(account)uint64", method "verify_acct_total_apps_opted_in(account)uint64", method "verify_acct_total_assets_created(account)uint64", method "verify_acct_total_assets(account)uint64", method "verify_acct_total_boxes(account)uint64", method "verify_acct_total_box_bytes(account)uint64" txna ApplicationArgs 0 - match main_verify_acct_balance_route@2 main_verify_acct_min_balance_route@3 main_verify_acct_auth_addr_route@4 main_verify_acct_total_num_uint_route@5 main_verify_acct_total_num_byte_slice_route@6 main_verify_acct_total_extra_app_pages_route@7 main_verify_acct_total_apps_created_route@8 main_verify_acct_total_apps_opted_in_route@9 main_verify_acct_total_assets_created_route@10 main_verify_acct_total_assets_route@11 main_verify_acct_total_boxes_route@12 main_verify_acct_total_box_bytes_route@13 - err // reject transaction + match __puya_arc4_router___verify_acct_balance_route@2 __puya_arc4_router___verify_acct_min_balance_route@3 __puya_arc4_router___verify_acct_auth_addr_route@4 __puya_arc4_router___verify_acct_total_num_uint_route@5 __puya_arc4_router___verify_acct_total_num_byte_slice_route@6 __puya_arc4_router___verify_acct_total_extra_app_pages_route@7 __puya_arc4_router___verify_acct_total_apps_created_route@8 __puya_arc4_router___verify_acct_total_apps_opted_in_route@9 __puya_arc4_router___verify_acct_total_assets_created_route@10 __puya_arc4_router___verify_acct_total_assets_route@11 __puya_arc4_router___verify_acct_total_boxes_route@12 __puya_arc4_router___verify_acct_total_box_bytes_route@13 + intc_1 // 0 + retsub -main_verify_acct_balance_route@2: - // tests/artifacts/StateOps/contract.py:25 +__puya_arc4_router___verify_acct_balance_route@2: + // tests/artifacts/state-ops/contract.algo.ts:27 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:25 + // tests/artifacts/state-ops/contract.algo.ts:27 // @arc4.abimethod() callsub verify_acct_balance itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_min_balance_route@3: - // tests/artifacts/StateOps/contract.py:38 +__puya_arc4_router___verify_acct_min_balance_route@3: + // tests/artifacts/state-ops/contract.algo.ts:39 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:38 + // tests/artifacts/state-ops/contract.algo.ts:39 // @arc4.abimethod() callsub verify_acct_min_balance itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_auth_addr_route@4: - // tests/artifacts/StateOps/contract.py:51 +__puya_arc4_router___verify_acct_auth_addr_route@4: + // tests/artifacts/state-ops/contract.algo.ts:51 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:51 + // tests/artifacts/state-ops/contract.algo.ts:51 // @arc4.abimethod() callsub verify_acct_auth_addr - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_num_uint_route@5: - // tests/artifacts/StateOps/contract.py:59 +__puya_arc4_router___verify_acct_total_num_uint_route@5: + // tests/artifacts/state-ops/contract.algo.ts:60 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:59 + // tests/artifacts/state-ops/contract.algo.ts:60 // @arc4.abimethod() callsub verify_acct_total_num_uint itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_num_byte_slice_route@6: - // tests/artifacts/StateOps/contract.py:67 +__puya_arc4_router___verify_acct_total_num_byte_slice_route@6: + // tests/artifacts/state-ops/contract.algo.ts:69 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:67 + // tests/artifacts/state-ops/contract.algo.ts:69 // @arc4.abimethod() callsub verify_acct_total_num_byte_slice itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_extra_app_pages_route@7: - // tests/artifacts/StateOps/contract.py:77 +__puya_arc4_router___verify_acct_total_extra_app_pages_route@7: + // tests/artifacts/state-ops/contract.algo.ts:78 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:77 + // tests/artifacts/state-ops/contract.algo.ts:78 // @arc4.abimethod() callsub verify_acct_total_extra_app_pages itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_apps_created_route@8: - // tests/artifacts/StateOps/contract.py:87 +__puya_arc4_router___verify_acct_total_apps_created_route@8: + // tests/artifacts/state-ops/contract.algo.ts:87 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:87 + // tests/artifacts/state-ops/contract.algo.ts:87 // @arc4.abimethod() callsub verify_acct_total_apps_created itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_apps_opted_in_route@9: - // tests/artifacts/StateOps/contract.py:95 +__puya_arc4_router___verify_acct_total_apps_opted_in_route@9: + // tests/artifacts/state-ops/contract.algo.ts:96 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:95 + // tests/artifacts/state-ops/contract.algo.ts:96 // @arc4.abimethod() callsub verify_acct_total_apps_opted_in itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_assets_created_route@10: - // tests/artifacts/StateOps/contract.py:103 +__puya_arc4_router___verify_acct_total_assets_created_route@10: + // tests/artifacts/state-ops/contract.algo.ts:105 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:103 + // tests/artifacts/state-ops/contract.algo.ts:105 // @arc4.abimethod() callsub verify_acct_total_assets_created itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_assets_route@11: - // tests/artifacts/StateOps/contract.py:113 +__puya_arc4_router___verify_acct_total_assets_route@11: + // tests/artifacts/state-ops/contract.algo.ts:114 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:113 + // tests/artifacts/state-ops/contract.algo.ts:114 // @arc4.abimethod() callsub verify_acct_total_assets itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_boxes_route@12: - // tests/artifacts/StateOps/contract.py:121 +__puya_arc4_router___verify_acct_total_boxes_route@12: + // tests/artifacts/state-ops/contract.algo.ts:123 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:121 + // tests/artifacts/state-ops/contract.algo.ts:123 // @arc4.abimethod() callsub verify_acct_total_boxes itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_acct_total_box_bytes_route@13: - // tests/artifacts/StateOps/contract.py:129 +__puya_arc4_router___verify_acct_total_box_bytes_route@13: + // tests/artifacts/state-ops/contract.algo.ts:132 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts - // tests/artifacts/StateOps/contract.py:129 + // tests/artifacts/state-ops/contract.algo.ts:132 // @arc4.abimethod() callsub verify_acct_total_box_bytes itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_bare_routing@16: - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): +__puya_arc4_router___bare_routing@16: + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@20 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@20: + // tests/artifacts/state-ops/contract.algo.ts:26 + // export class StateAcctParamsGetContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_balance(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_balance(a: bytes) -> uint64: verify_acct_balance: - // tests/artifacts/StateOps/contract.py:25-26 + // tests/artifacts/state-ops/contract.algo.ts:27-28 // @arc4.abimethod() - // def verify_acct_balance(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_balance(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:27 - // value, funded = op.AcctParamsGet.acct_balance(a) + // tests/artifacts/state-ops/contract.algo.ts:29 + // const [value, funded] = op.AcctParams.acctBalance(a) frame_dig -1 acct_params_get AcctBalance - swap - // tests/artifacts/StateOps/contract.py:28 - // value_index, funded_index = op.AcctParamsGet.acct_balance(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:30 + // const [value_index, funded_index] = op.AcctParams.acctBalance(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctBalance - cover 2 - // tests/artifacts/StateOps/contract.py:29 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:31 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:30 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:32 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:31 - // assert value == a.balance, "expected Account balance to match" + // tests/artifacts/state-ops/contract.algo.ts:33 + // assert(value === a.balance, 'expected Account balance to match') frame_dig -1 acct_params_get AcctBalance assert // account funded dig 1 == assert // expected Account balance to match - // tests/artifacts/StateOps/contract.py:32 - // assert value == algopy.op.balance(a), "expected op.balance to match" + // tests/artifacts/state-ops/contract.algo.ts:34 + // assert(value === op.balance(a), 'expected op.balance to match') frame_dig -1 balance dig 1 == assert // expected op.balance to match - // tests/artifacts/StateOps/contract.py:34 - // _get_1st_ref_index() - callsub _get_1st_ref_index - // tests/artifacts/StateOps/contract.py:33-35 - // assert value == algopy.op.balance( - // _get_1st_ref_index() - // ), "expected op.balance by index to match" + // tests/artifacts/state-ops/contract.algo.ts:35 + // assert(value === op.balance(get_1st_ref_index()), 'expected op.balance by index to match') + callsub get_1st_ref_index balance dig 1 == assert // expected op.balance by index to match - // tests/artifacts/StateOps/contract.py:36 + // tests/artifacts/state-ops/contract.algo.ts:36 // return value retsub -// tests.artifacts.StateOps.contract._get_1st_ref_index() -> uint64: -_get_1st_ref_index: - // tests/artifacts/StateOps/contract.py:19-20 - // @subroutine - // def _get_1st_ref_index() -> UInt64: +// tests/artifacts/state-ops/contract.algo.ts::get_1st_ref_index() -> uint64: +get_1st_ref_index: + // tests/artifacts/state-ops/contract.algo.ts:22 + // function get_1st_ref_index(): uint64 { proto 0 1 - // tests/artifacts/StateOps/contract.py:21 - // return op.btoi(Txn.application_args(1)) - txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:23 + // return op.btoi(Txn.applicationArgs(1)) + intc_0 // 1 + txnas ApplicationArgs btoi retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_min_balance(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_min_balance(a: bytes) -> uint64: verify_acct_min_balance: - // tests/artifacts/StateOps/contract.py:38-39 + // tests/artifacts/state-ops/contract.algo.ts:39-40 // @arc4.abimethod() - // def verify_acct_min_balance(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_min_balance(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:40 - // value, funded = op.AcctParamsGet.acct_min_balance(a) + // tests/artifacts/state-ops/contract.algo.ts:41 + // const [value, funded] = op.AcctParams.acctMinBalance(a) frame_dig -1 acct_params_get AcctMinBalance - swap - // tests/artifacts/StateOps/contract.py:41 - // value_index, funded_index = op.AcctParamsGet.acct_min_balance(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:42 + // const [value_index, funded_index] = op.AcctParams.acctMinBalance(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctMinBalance - cover 2 - // tests/artifacts/StateOps/contract.py:42 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:43 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:43 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:44 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:44 - // assert value == a.min_balance, "expected Account min_balance to match" + // tests/artifacts/state-ops/contract.algo.ts:45 + // assert(value === a.minBalance, 'expected Account min_balance to match') frame_dig -1 acct_params_get AcctMinBalance assert // account funded dig 1 == assert // expected Account min_balance to match - // tests/artifacts/StateOps/contract.py:45 - // assert value == algopy.op.min_balance(a), "expected op.min_balance to match" + // tests/artifacts/state-ops/contract.algo.ts:46 + // assert(value === op.minBalance(a), 'expected op.min_balance to match') frame_dig -1 min_balance dig 1 == assert // expected op.min_balance to match - // tests/artifacts/StateOps/contract.py:47 - // _get_1st_ref_index() - callsub _get_1st_ref_index - // tests/artifacts/StateOps/contract.py:46-48 - // assert value == algopy.op.min_balance( - // _get_1st_ref_index() - // ), "expected op.min_balance by index to match" + // tests/artifacts/state-ops/contract.algo.ts:47 + // assert(value === op.minBalance(get_1st_ref_index()), 'expected op.min_balance by index to match') + callsub get_1st_ref_index min_balance dig 1 == assert // expected op.min_balance by index to match - // tests/artifacts/StateOps/contract.py:49 + // tests/artifacts/state-ops/contract.algo.ts:48 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_auth_addr(a: bytes) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_auth_addr(a: bytes) -> bytes: verify_acct_auth_addr: - // tests/artifacts/StateOps/contract.py:51-52 + // tests/artifacts/state-ops/contract.algo.ts:51-52 // @arc4.abimethod() - // def verify_acct_auth_addr(self, a: algopy.Account) -> arc4.Address: + // public verify_acct_auth_addr(a: Account): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:53 - // value, funded = op.AcctParamsGet.acct_auth_addr(a) + // tests/artifacts/state-ops/contract.algo.ts:53 + // const [value, funded] = op.AcctParams.acctAuthAddr(a) frame_dig -1 acct_params_get AcctAuthAddr - swap - // tests/artifacts/StateOps/contract.py:54 - // value_index, funded_index = op.AcctParamsGet.acct_auth_addr(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:54 + // const [value_index, funded_index] = op.AcctParams.acctAuthAddr(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctAuthAddr - cover 2 - // tests/artifacts/StateOps/contract.py:55 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:55 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:56 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:56 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:57 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:57 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_num_uint(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_num_uint(a: bytes) -> uint64: verify_acct_total_num_uint: - // tests/artifacts/StateOps/contract.py:59-60 + // tests/artifacts/state-ops/contract.algo.ts:60-61 // @arc4.abimethod() - // def verify_acct_total_num_uint(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_num_uint(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:61 - // value, funded = op.AcctParamsGet.acct_total_num_uint(a) + // tests/artifacts/state-ops/contract.algo.ts:62 + // const [value, funded] = op.AcctParams.acctTotalNumUint(a) frame_dig -1 acct_params_get AcctTotalNumUint - swap - // tests/artifacts/StateOps/contract.py:62 - // value_index, funded_index = op.AcctParamsGet.acct_total_num_uint(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:63 + // const [value_index, funded_index] = op.AcctParams.acctTotalNumUint(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalNumUint - cover 2 - // tests/artifacts/StateOps/contract.py:63 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:64 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:64 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:65 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:65 + // tests/artifacts/state-ops/contract.algo.ts:66 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_num_byte_slice(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_num_byte_slice(a: bytes) -> uint64: verify_acct_total_num_byte_slice: - // tests/artifacts/StateOps/contract.py:67-68 + // tests/artifacts/state-ops/contract.algo.ts:69-70 // @arc4.abimethod() - // def verify_acct_total_num_byte_slice(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_num_byte_slice(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:69 - // value, funded = op.AcctParamsGet.acct_total_num_byte_slice(a) + // tests/artifacts/state-ops/contract.algo.ts:71 + // const [value, funded] = op.AcctParams.acctTotalNumByteSlice(a) frame_dig -1 acct_params_get AcctTotalNumByteSlice - swap - // tests/artifacts/StateOps/contract.py:71 - // _get_1st_ref_index() - callsub _get_1st_ref_index - // tests/artifacts/StateOps/contract.py:70-72 - // value_index, funded_index = op.AcctParamsGet.acct_total_num_byte_slice( - // _get_1st_ref_index() - // ) + // tests/artifacts/state-ops/contract.algo.ts:72 + // const [value_index, funded_index] = op.AcctParams.acctTotalNumByteSlice(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalNumByteSlice - cover 2 - // tests/artifacts/StateOps/contract.py:73 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:73 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:74 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:74 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:75 + // tests/artifacts/state-ops/contract.algo.ts:75 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_extra_app_pages(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_extra_app_pages(a: bytes) -> uint64: verify_acct_total_extra_app_pages: - // tests/artifacts/StateOps/contract.py:77-78 + // tests/artifacts/state-ops/contract.algo.ts:78-79 // @arc4.abimethod() - // def verify_acct_total_extra_app_pages(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_extra_app_pages(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:79 - // value, funded = op.AcctParamsGet.acct_total_extra_app_pages(a) + // tests/artifacts/state-ops/contract.algo.ts:80 + // const [value, funded] = op.AcctParams.acctTotalExtraAppPages(a) frame_dig -1 acct_params_get AcctTotalExtraAppPages - swap - // tests/artifacts/StateOps/contract.py:81 - // _get_1st_ref_index() - callsub _get_1st_ref_index - // tests/artifacts/StateOps/contract.py:80-82 - // value_index, funded_index = op.AcctParamsGet.acct_total_extra_app_pages( - // _get_1st_ref_index() - // ) + // tests/artifacts/state-ops/contract.algo.ts:81 + // const [value_index, funded_index] = op.AcctParams.acctTotalExtraAppPages(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalExtraAppPages - cover 2 - // tests/artifacts/StateOps/contract.py:83 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:82 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:84 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:83 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:85 + // tests/artifacts/state-ops/contract.algo.ts:84 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_apps_created(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_apps_created(a: bytes) -> uint64: verify_acct_total_apps_created: - // tests/artifacts/StateOps/contract.py:87-88 + // tests/artifacts/state-ops/contract.algo.ts:87-88 // @arc4.abimethod() - // def verify_acct_total_apps_created(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_apps_created(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:89 - // value, funded = op.AcctParamsGet.acct_total_apps_created(a) + // tests/artifacts/state-ops/contract.algo.ts:89 + // const [value, funded] = op.AcctParams.acctTotalAppsCreated(a) frame_dig -1 acct_params_get AcctTotalAppsCreated - swap - // tests/artifacts/StateOps/contract.py:90 - // value_index, funded_index = op.AcctParamsGet.acct_total_apps_created(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:90 + // const [value_index, funded_index] = op.AcctParams.acctTotalAppsCreated(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalAppsCreated - cover 2 - // tests/artifacts/StateOps/contract.py:91 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:91 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:92 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:92 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:93 + // tests/artifacts/state-ops/contract.algo.ts:93 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_apps_opted_in(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_apps_opted_in(a: bytes) -> uint64: verify_acct_total_apps_opted_in: - // tests/artifacts/StateOps/contract.py:95-96 + // tests/artifacts/state-ops/contract.algo.ts:96-97 // @arc4.abimethod() - // def verify_acct_total_apps_opted_in(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_apps_opted_in(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:97 - // value, funded = op.AcctParamsGet.acct_total_apps_opted_in(a) + // tests/artifacts/state-ops/contract.algo.ts:98 + // const [value, funded] = op.AcctParams.acctTotalAppsOptedIn(a) frame_dig -1 acct_params_get AcctTotalAppsOptedIn - swap - // tests/artifacts/StateOps/contract.py:98 - // value_index, funded_index = op.AcctParamsGet.acct_total_apps_opted_in(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:99 + // const [value_index, funded_index] = op.AcctParams.acctTotalAppsOptedIn(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalAppsOptedIn - cover 2 - // tests/artifacts/StateOps/contract.py:99 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:100 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:100 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:101 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:101 + // tests/artifacts/state-ops/contract.algo.ts:102 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_assets_created(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_assets_created(a: bytes) -> uint64: verify_acct_total_assets_created: - // tests/artifacts/StateOps/contract.py:103-104 + // tests/artifacts/state-ops/contract.algo.ts:105-106 // @arc4.abimethod() - // def verify_acct_total_assets_created(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_assets_created(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:105 - // value, funded = op.AcctParamsGet.acct_total_assets_created(a) + // tests/artifacts/state-ops/contract.algo.ts:107 + // const [value, funded] = op.AcctParams.acctTotalAssetsCreated(a) frame_dig -1 acct_params_get AcctTotalAssetsCreated - swap - // tests/artifacts/StateOps/contract.py:107 - // _get_1st_ref_index() - callsub _get_1st_ref_index - // tests/artifacts/StateOps/contract.py:106-108 - // value_index, funded_index = op.AcctParamsGet.acct_total_assets_created( - // _get_1st_ref_index() - // ) + // tests/artifacts/state-ops/contract.algo.ts:108 + // const [value_index, funded_index] = op.AcctParams.acctTotalAssetsCreated(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalAssetsCreated - cover 2 - // tests/artifacts/StateOps/contract.py:109 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:109 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:110 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:110 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:111 + // tests/artifacts/state-ops/contract.algo.ts:111 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_assets(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_assets(a: bytes) -> uint64: verify_acct_total_assets: - // tests/artifacts/StateOps/contract.py:113-114 + // tests/artifacts/state-ops/contract.algo.ts:114-115 // @arc4.abimethod() - // def verify_acct_total_assets(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_assets(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:115 - // value, funded = op.AcctParamsGet.acct_total_assets(a) + // tests/artifacts/state-ops/contract.algo.ts:116 + // const [value, funded] = op.AcctParams.acctTotalAssets(a) frame_dig -1 acct_params_get AcctTotalAssets - swap - // tests/artifacts/StateOps/contract.py:116 - // value_index, funded_index = op.AcctParamsGet.acct_total_assets(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:117 + // const [value_index, funded_index] = op.AcctParams.acctTotalAssets(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalAssets - cover 2 - // tests/artifacts/StateOps/contract.py:117 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:118 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:118 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:119 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:119 + // tests/artifacts/state-ops/contract.algo.ts:120 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_boxes(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_boxes(a: bytes) -> uint64: verify_acct_total_boxes: - // tests/artifacts/StateOps/contract.py:121-122 + // tests/artifacts/state-ops/contract.algo.ts:123-124 // @arc4.abimethod() - // def verify_acct_total_boxes(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_boxes(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:123 - // value, funded = op.AcctParamsGet.acct_total_boxes(a) + // tests/artifacts/state-ops/contract.algo.ts:125 + // const [value, funded] = op.AcctParams.acctTotalBoxes(a) frame_dig -1 acct_params_get AcctTotalBoxes - swap - // tests/artifacts/StateOps/contract.py:124 - // value_index, funded_index = op.AcctParamsGet.acct_total_boxes(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:126 + // const [value_index, funded_index] = op.AcctParams.acctTotalBoxes(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalBoxes - cover 2 - // tests/artifacts/StateOps/contract.py:125 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:127 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:126 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:128 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:127 + // tests/artifacts/state-ops/contract.algo.ts:129 // return value retsub -// tests.artifacts.StateOps.contract.StateAcctParamsGetContract.verify_acct_total_box_bytes(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.verify_acct_total_box_bytes(a: bytes) -> uint64: verify_acct_total_box_bytes: - // tests/artifacts/StateOps/contract.py:129-130 + // tests/artifacts/state-ops/contract.algo.ts:132-133 // @arc4.abimethod() - // def verify_acct_total_box_bytes(self, a: algopy.Account) -> algopy.UInt64: + // public verify_acct_total_box_bytes(a: Account): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:131 - // value, funded = op.AcctParamsGet.acct_total_box_bytes(a) + // tests/artifacts/state-ops/contract.algo.ts:134 + // const [value, funded] = op.AcctParams.acctTotalBoxBytes(a) frame_dig -1 acct_params_get AcctTotalBoxBytes - swap - // tests/artifacts/StateOps/contract.py:132 - // value_index, funded_index = op.AcctParamsGet.acct_total_box_bytes(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:135 + // const [value_index, funded_index] = op.AcctParams.acctTotalBoxBytes(get_1st_ref_index()) + callsub get_1st_ref_index acct_params_get AcctTotalBoxBytes - cover 2 - // tests/artifacts/StateOps/contract.py:133 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:136 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:134 - // assert funded == funded_index, "expected funded by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:137 + // assert(funded === funded_index, 'expected funded by index to match') == assert // expected funded by index to match - // tests/artifacts/StateOps/contract.py:135 + // tests/artifacts/state-ops/contract.algo.ts:138 // return value retsub diff --git a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc32.json b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc32.json index 16b66ef..4fbd3f2 100644 --- a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc32.json @@ -62,8 +62,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxNgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9iYWxhbmNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfYXV0aF9hZGRyKGFjY291bnQpYWRkcmVzcyIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKGFjY291bnQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyhhY2NvdW50KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYWNjb3VudCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyhhY2NvdW50KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2FjY3RfYmFsYW5jZV9yb3V0ZUAyIG1haW5fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMyBtYWluX3ZlcmlmeV9hY2N0X2F1dGhfYWRkcl9yb3V0ZUA0IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnRfcm91dGVANSBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlX3JvdXRlQDYgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANyBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZF9yb3V0ZUA4IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbl9yb3V0ZUA5IG1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWRfcm91dGVAMTAgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfcm91dGVAMTEgbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hlc19yb3V0ZUAxMiBtYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlc19yb3V0ZUAxMwogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl92ZXJpZnlfYWNjdF9iYWxhbmNlX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9iYWxhbmNlCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2F1dGhfYWRkcgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlc19yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZF9yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWRfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hY2N0X3RvdGFsX2JveGVzX3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQKICAgIC8vIGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2JhbGFuY2UoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfYmFsYW5jZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF9iYWxhbmNlKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfYmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGEuYmFsYW5jZSwgImV4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaCIKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLmJhbGFuY2UoYSksICJleHBlY3RlZCBvcC5iYWxhbmNlIHRvIG1hdGNoIgogICAgZnJhbWVfZGlnIC0xCiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQKICAgIC8vIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMzLTM1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYWxnb3B5Lm9wLmJhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AuYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5fZ2V0XzFzdF9yZWZfaW5kZXgoKSAtPiB1aW50NjQ6Cl9nZXRfMXN0X3JlZl9pbmRleDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOS0yMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfZ2V0XzFzdF9yZWZfaW5kZXgoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMQogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uX2FyZ3MoMSkpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgtMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MAogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9taW5fYmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MQogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9taW5fYmFsYW5jZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MgogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBhc3NlcnQgZnVuZGVkID09IGZ1bmRlZF9pbmRleCwgImV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCIKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhLm1pbl9iYWxhbmNlLCAiZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaCIKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIEFjY291bnQgbWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NQogICAgLy8gYXNzZXJ0IHZhbHVlID09IGFsZ29weS5vcC5taW5fYmFsYW5jZShhKSwgImV4cGVjdGVkIG9wLm1pbl9iYWxhbmNlIHRvIG1hdGNoIgogICAgZnJhbWVfZGlnIC0xCiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NwogICAgLy8gX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYtNDgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSBhbGdvcHkub3AubWluX2JhbGFuY2UoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICksICJleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCIKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfYWNjdF9hdXRoX2FkZHI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTEtNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfYXV0aF9hZGRyKHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1MwogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9hdXRoX2FkZHIoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RBdXRoQWRkcgogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2F1dGhfYWRkcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEF1dGhBZGRyCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU3CiAgICAvLyByZXR1cm4gYXJjNC5BZGRyZXNzKHZhbHVlKQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KHNlbGYsIGE6IGFsZ29weS5BY2NvdW50KSAtPiBhbGdvcHkuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjEKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfbnVtX3VpbnQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2MgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtVWludAogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2NQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2UoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NjctNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Uoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo2OQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzEKICAgIC8vIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjcwLTcyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlKAogICAgLy8gICAgIF9nZXRfMXN0X3JlZl9pbmRleCgpCiAgICAvLyApCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo3NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc3LTc4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsRXh0cmFBcHBQYWdlcwogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4MC04MgogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoCiAgICAvLyAgICAgX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIC8vICkKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6ODMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo4NAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg3LTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc0NyZWF0ZWQKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNDcmVhdGVkCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTEKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjkzCiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTUtOTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyB2YWx1ZSwgZnVuZGVkID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFwcHNPcHRlZEluCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6OTgKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXBwc19vcHRlZF9pbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX2NyZWF0ZWQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTAzLTEwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZChzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzQ3JlYXRlZAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gX2dldF8xc3RfcmVmX2luZGV4KCkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTA2LTEwOAogICAgLy8gdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZCgKICAgIC8vICAgICBfZ2V0XzFzdF9yZWZfaW5kZXgoKQogICAgLy8gKQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTAKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0cyhhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTUKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTYKICAgIC8vIHZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXggPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYXNzZXRzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBc3NldHMKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMTkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyMS0xMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoc2VsZiwgYTogYWxnb3B5LkFjY291bnQpIC0+IGFsZ29weS5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjMKICAgIC8vIHZhbHVlLCBmdW5kZWQgPSBvcC5BY2N0UGFyYW1zR2V0LmFjY3RfdG90YWxfYm94ZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTI0CiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveGVzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hlcwogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IGZ1bmRlZCA9PSBmdW5kZWRfaW5kZXgsICJleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMjktMTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hY2N0X3RvdGFsX2JveF9ieXRlcyhzZWxmLCBhOiBhbGdvcHkuQWNjb3VudCkgLT4gYWxnb3B5LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gdmFsdWUsIGZ1bmRlZCA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF90b3RhbF9ib3hfYnl0ZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTMyCiAgICAvLyB2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4ID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X3RvdGFsX2JveF9ieXRlcyhfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94Qnl0ZXMKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBmdW5kZWQgPT0gZnVuZGVkX2luZGV4LCAiZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzUKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNAogICAgLy8gY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludCAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE2CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF9iYWxhbmNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbl9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9ib3hlc19yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfYXV0aF9hZGRyX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2JveGVzX3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3LTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X2JhbGFuY2UoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0QmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0QmFsYW5jZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IGEuYmFsYW5jZSwgJ2V4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSBvcC5iYWxhbmNlKGEpLCAnZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSBvcC5iYWxhbmNlKGdldF8xc3RfcmVmX2luZGV4KCkpLCAnZXhwZWN0ZWQgb3AuYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzktNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0TWluQmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0TWluQmFsYW5jZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IGEubWluQmFsYW5jZSwgJ2V4cGVjdGVkIEFjY291bnQgbWluX2JhbGFuY2UgdG8gbWF0Y2gnKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IG9wLm1pbkJhbGFuY2UoYSksICdleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IG9wLm1pbkJhbGFuY2UoZ2V0XzFzdF9yZWZfaW5kZXgoKSksICdleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2F1dGhfYWRkcihhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9hY2N0X2F1dGhfYWRkcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogQWNjb3VudCk6IEFkZHJlc3MgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZnVuZGVkXSA9IG9wLkFjY3RQYXJhbXMuYWNjdEF1dGhBZGRyKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0QXV0aEFkZHIoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAtNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MgogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxOdW1VaW50KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsTnVtVWludChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OS03MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsTnVtQnl0ZVNsaWNlKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzMKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxFeHRyYUFwcFBhZ2VzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsRXh0cmFBcHBQYWdlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg3LTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNDcmVhdGVkKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNDcmVhdGVkKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTYtOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNPcHRlZEluKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNPcHRlZEluKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDUtMTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsQXNzZXRzQ3JlYXRlZChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNC0xMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0cyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZnVuZGVkXSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsQm94ZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEJveGVzKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMi0xMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEJveEJ5dGVzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hCeXRlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxCb3hCeXRlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { "global": { diff --git a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc56.json b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc56.json new file mode 100644 index 0000000..0ad82cf --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.arc56.json @@ -0,0 +1,425 @@ +{ + "name": "StateAcctParamsGetContract", + "structs": {}, + "methods": [ + { + "name": "verify_acct_balance", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_min_balance", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_auth_addr", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_num_uint", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_num_byte_slice", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_extra_app_pages", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_apps_created", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_apps_opted_in", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_assets_created", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_assets", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_boxes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_acct_total_box_bytes", + "args": [ + { + "type": "account", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 120, + 143, + 166, + 188, + 211, + 234, + 257, + 280, + 303, + 326, + 349, + 372 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 429, + 482 + ], + "errorMessage": "account funded" + }, + { + "pc": [ + 400 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 123, + 146, + 169, + 191, + 214, + 237, + 260, + 283, + 306, + 329, + 352, + 375 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 433 + ], + "errorMessage": "expected Account balance to match" + }, + { + "pc": [ + 486 + ], + "errorMessage": "expected Account min_balance to match" + }, + { + "pc": [ + 424, + 477, + 522, + 543, + 564, + 585, + 606, + 627, + 648, + 669, + 690, + 711 + ], + "errorMessage": "expected funded by index to match" + }, + { + "pc": [ + 448 + ], + "errorMessage": "expected op.balance by index to match" + }, + { + "pc": [ + 440 + ], + "errorMessage": "expected op.balance to match" + }, + { + "pc": [ + 501 + ], + "errorMessage": "expected op.min_balance by index to match" + }, + { + "pc": [ + 493 + ], + "errorMessage": "expected op.min_balance to match" + }, + { + "pc": [ + 422, + 475, + 520, + 541, + 562, + 583, + 604, + 625, + 646, + 667, + 688, + 709 + ], + "errorMessage": "expected value by index to match" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE2CiAgICBwdXNoYnl0ZXNzIDB4NWY1YjQzZTQgMHg3M2RjOTNjNyAweDU2MjZkZmViIDB4ZGM4YTI1YmYgMHgxOThlYmQ4YyAweDIzMDFhYjI2IDB4OWY2OGZjYTYgMHhhOTc1YzJkMSAweGQxZTA0ODAxIDB4YjY5NjZiZTUgMHgxOTVkNTQxOCAweDZhZGFlM2YxIC8vIG1ldGhvZCAidmVyaWZ5X2FjY3RfYmFsYW5jZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X2F1dGhfYWRkcihhY2NvdW50KWFkZHJlc3MiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50KGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhY2NvdW50KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4oYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGFjY291bnQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYWNjb3VudCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF9iYWxhbmNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2Vfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF9hdXRoX2FkZHJfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludF9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbl9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9ib3hlc19yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXNfcm91dGVAMTMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X2JhbGFuY2Vfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X2JhbGFuY2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X21pbl9iYWxhbmNlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9taW5fYmFsYW5jZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfYXV0aF9hZGRyX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX251bV91aW50X3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9udW1fdWludAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfbnVtX2J5dGVfc2xpY2Vfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXNfcm91dGVANzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW5fcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW4KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkX3JvdXRlQDEwOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzX3JvdXRlQDExOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hY2N0X3RvdGFsX2JveGVzX3JvdXRlQDEyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hlcwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzX3JvdXRlQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfYmFsYW5jZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF9iYWxhbmNlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI3LTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X2JhbGFuY2UoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOQogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0QmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0QmFsYW5jZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IGEuYmFsYW5jZSwgJ2V4cGVjdGVkIEFjY291bnQgYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBBY2NvdW50IGJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSBvcC5iYWxhbmNlKGEpLCAnZXhwZWN0ZWQgb3AuYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJhbGFuY2UKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIG9wLmJhbGFuY2UgdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSBvcC5iYWxhbmNlKGdldF8xc3RfcmVmX2luZGV4KCkpLCAnZXhwZWN0ZWQgb3AuYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBiYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5iYWxhbmNlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzktNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfbWluX2JhbGFuY2UoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0TWluQmFsYW5jZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MgogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0TWluQmFsYW5jZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IGEubWluQmFsYW5jZSwgJ2V4cGVjdGVkIEFjY291bnQgbWluX2JhbGFuY2UgdG8gbWF0Y2gnKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgQWNjb3VudCBtaW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IG9wLm1pbkJhbGFuY2UoYSksICdleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIG1pbl9iYWxhbmNlCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBvcC5taW5fYmFsYW5jZSB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ3CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IG9wLm1pbkJhbGFuY2UoZ2V0XzFzdF9yZWZfaW5kZXgoKSksICdleHBlY3RlZCBvcC5taW5fYmFsYW5jZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBtaW5fYmFsYW5jZQogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgb3AubWluX2JhbGFuY2UgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X2F1dGhfYWRkcihhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9hY2N0X2F1dGhfYWRkcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF9hdXRoX2FkZHIoYTogQWNjb3VudCk6IEFkZHJlc3MgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTMKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZnVuZGVkXSA9IG9wLkFjY3RQYXJhbXMuYWNjdEF1dGhBZGRyKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0QXV0aEFkZHIoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QXV0aEFkZHIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NTcKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjAtNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfbnVtX3VpbnQoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2MgogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxOdW1VaW50KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsTnVtVWludChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo2OS03MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF90b3RhbF9udW1fYnl0ZV9zbGljZShhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsTnVtQnl0ZVNsaWNlKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsTnVtQnl0ZVNsaWNlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzMKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBY2N0UGFyYW1zR2V0Q29udHJhY3QudmVyaWZ5X2FjY3RfdG90YWxfZXh0cmFfYXBwX3BhZ2VzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2V4dHJhX2FwcF9wYWdlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo3OC03OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYWNjdF90b3RhbF9leHRyYV9hcHBfcGFnZXMoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgW3ZhbHVlLCBmdW5kZWRdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxFeHRyYUFwcFBhZ2VzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxFeHRyYUFwcFBhZ2VzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODEKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsRXh0cmFBcHBQYWdlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEV4dHJhQXBwUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6ODQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX2NyZWF0ZWQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19jcmVhdGVkOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg3LTg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfY3JlYXRlZChhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNDcmVhdGVkKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzQ3JlYXRlZAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNDcmVhdGVkKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo5MgogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hcHBzX29wdGVkX2luKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2FwcHNfb3B0ZWRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OTYtOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYXBwc19vcHRlZF9pbihhOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNPcHRlZEluKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxBcHBzT3B0ZWRJbgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFwcHNPcHRlZEluKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXBwc09wdGVkSW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfYWNjdF90b3RhbF9hc3NldHNfY3JlYXRlZDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDUtMTA2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hY2N0X3RvdGFsX2Fzc2V0c19jcmVhdGVkKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZnVuZGVkX2luZGV4XSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsQXNzZXRzQ3JlYXRlZChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0c0NyZWF0ZWQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTEwCiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9hc3NldHMoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExNC0xMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYXNzZXRzKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0cyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEFzc2V0cyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGFzc2VydChmdW5kZWQgPT09IGZ1bmRlZF9pbmRleCwgJ2V4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGZ1bmRlZCBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzKGE6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeV9hY2N0X3RvdGFsX2JveGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEyMy0xMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYm94ZXMoYTogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZnVuZGVkXSA9IG9wLkFjY3RQYXJhbXMuYWNjdFRvdGFsQm94ZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGZ1bmRlZF9pbmRleF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEJveGVzKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdFRvdGFsQm94ZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBhc3NlcnQoZnVuZGVkID09PSBmdW5kZWRfaW5kZXgsICdleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBmdW5kZWQgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxMjkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFjY3RQYXJhbXNHZXRDb250cmFjdC52ZXJpZnlfYWNjdF90b3RhbF9ib3hfYnl0ZXMoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzMi0xMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FjY3RfdG90YWxfYm94X2J5dGVzKGE6IEFjY291bnQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBjb25zdCBbdmFsdWUsIGZ1bmRlZF0gPSBvcC5BY2N0UGFyYW1zLmFjY3RUb3RhbEJveEJ5dGVzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0VG90YWxCb3hCeXRlcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBmdW5kZWRfaW5kZXhdID0gb3AuQWNjdFBhcmFtcy5hY2N0VG90YWxCb3hCeXRlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveEJ5dGVzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM2CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGZ1bmRlZCA9PT0gZnVuZGVkX2luZGV4LCAnZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZnVuZGVkIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQWNjdFBhcmFtc0dldENvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.clear.teal b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.clear.teal index d07d34f..c48a376 100644 --- a/tests/artifacts/state-ops/data/StateAcctParamsGetContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAcctParamsGetContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAcctParamsGetContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:24 - // class StateAcctParamsGetContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAcctParamsGetContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAppGlobalContract.approval.teal b/tests/artifacts/state-ops/data/StateAppGlobalContract.approval.teal index 8dfab14..b48af98 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAppGlobalContract.approval.teal @@ -1,34 +1,38 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppGlobalContract.approval_program: - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 0x00 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@11 - method "verify_get_bytes(byte[])byte[]" - method "verify_get_uint64(byte[])uint64" - method "verify_get_ex_bytes(application,byte[])(byte[],bool)" - method "verify_get_ex_uint64(application,byte[])(uint64,bool)" - method "verify_delete(byte[])void" - method "verify_put_uint64(byte[],uint64)void" - method "verify_put_bytes(byte[],byte[])void" + bz __puya_arc4_router___bare_routing@11 + pushbytess 0xa997a187 0x4db8aa41 0x6693ab92 0x857fd923 0x36996451 0x3920a57b 0x93a852e1 // method "verify_get_bytes(byte[])byte[]", method "verify_get_uint64(byte[])uint64", method "verify_get_ex_bytes(application,byte[])(byte[],bool)", method "verify_get_ex_uint64(application,byte[])(uint64,bool)", method "verify_put_uint64(byte[],uint64)void", method "verify_put_bytes(byte[],byte[])void", method "verify_delete(byte[])void" txna ApplicationArgs 0 - match main_verify_get_bytes_route@2 main_verify_get_uint64_route@3 main_verify_get_ex_bytes_route@4 main_verify_get_ex_uint64_route@5 main_verify_delete_route@6 main_verify_put_uint64_route@7 main_verify_put_bytes_route@8 - err // reject transaction + match __puya_arc4_router___verify_get_bytes_route@2 __puya_arc4_router___verify_get_uint64_route@3 __puya_arc4_router___verify_get_ex_bytes_route@4 __puya_arc4_router___verify_get_ex_uint64_route@5 __puya_arc4_router___verify_put_uint64_route@6 __puya_arc4_router___verify_put_bytes_route@7 __puya_arc4_router___verify_delete_route@8 + intc_1 // 0 + retsub -main_verify_get_bytes_route@2: - // tests/artifacts/StateOps/contract.py:434 +__puya_arc4_router___verify_get_bytes_route@2: + // tests/artifacts/state-ops/contract.algo.ts:362 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - // tests/artifacts/StateOps/contract.py:434 + // tests/artifacts/state-ops/contract.algo.ts:362 // @arc4.abimethod() callsub verify_get_bytes dup @@ -37,258 +41,249 @@ main_verify_get_bytes_route@2: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_uint64_route@3: - // tests/artifacts/StateOps/contract.py:439 +__puya_arc4_router___verify_get_uint64_route@3: + // tests/artifacts/state-ops/contract.algo.ts:368 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - // tests/artifacts/StateOps/contract.py:439 + // tests/artifacts/state-ops/contract.algo.ts:368 // @arc4.abimethod() callsub verify_get_uint64 itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_ex_bytes_route@4: - // tests/artifacts/StateOps/contract.py:444 +__puya_arc4_router___verify_get_ex_bytes_route@4: + // tests/artifacts/state-ops/contract.algo.ts:374 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:444 + // tests/artifacts/state-ops/contract.algo.ts:374 // @arc4.abimethod() callsub verify_get_ex_bytes - swap - dup + dig 1 len itob extract 6 2 - swap + uncover 2 concat - byte 0x00 - int 0 + bytec_1 // 0x00 + intc_1 // 0 uncover 3 setbit - byte 0x0003 + pushbytes 0x0003 swap concat swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_ex_uint64_route@5: - // tests/artifacts/StateOps/contract.py:448 +__puya_arc4_router___verify_get_ex_uint64_route@5: + // tests/artifacts/state-ops/contract.algo.ts:379 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:448 + // tests/artifacts/state-ops/contract.algo.ts:379 // @arc4.abimethod() callsub verify_get_ex_uint64 swap itob - byte 0x00 - int 0 + bytec_1 // 0x00 + intc_1 // 0 uncover 3 setbit concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_delete_route@6: - // tests/artifacts/StateOps/contract.py:452 +__puya_arc4_router___verify_put_uint64_route@6: + // tests/artifacts/state-ops/contract.algo.ts:384 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - // tests/artifacts/StateOps/contract.py:452 + txna ApplicationArgs 2 + btoi + // tests/artifacts/state-ops/contract.algo.ts:384 // @arc4.abimethod() - callsub verify_delete - int 1 - return + callsub verify_put_uint64 + intc_0 // 1 + retsub -main_verify_put_uint64_route@7: - // tests/artifacts/StateOps/contract.py:456 +__puya_arc4_router___verify_put_bytes_route@7: + // tests/artifacts/state-ops/contract.algo.ts:389 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 txna ApplicationArgs 2 - btoi - // tests/artifacts/StateOps/contract.py:456 + extract 2 0 + // tests/artifacts/state-ops/contract.algo.ts:389 // @arc4.abimethod() - callsub verify_put_uint64 - int 1 - return + callsub verify_put_bytes + intc_0 // 1 + retsub -main_verify_put_bytes_route@8: - // tests/artifacts/StateOps/contract.py:460 +__puya_arc4_router___verify_delete_route@8: + // tests/artifacts/state-ops/contract.algo.ts:394 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txna ApplicationArgs 1 extract 2 0 - txna ApplicationArgs 2 - extract 2 0 - // tests/artifacts/StateOps/contract.py:460 + // tests/artifacts/state-ops/contract.algo.ts:394 // @arc4.abimethod() - callsub verify_put_bytes - int 1 - return + callsub verify_delete + intc_0 // 1 + retsub -main_bare_routing@11: - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): +__puya_arc4_router___bare_routing@11: + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@15 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@15: + // tests/artifacts/state-ops/contract.algo.ts:358 + // export class StateAppGlobalContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_get_bytes(a: bytes) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_get_bytes(a: bytes) -> bytes: verify_get_bytes: - // tests/artifacts/StateOps/contract.py:434-435 + // tests/artifacts/state-ops/contract.algo.ts:362-363 // @arc4.abimethod() - // def verify_get_bytes(self, a: Bytes) -> Bytes: + // verify_get_bytes(a: bytes): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:436 - // value = op.AppGlobal.get_bytes(a) + // tests/artifacts/state-ops/contract.algo.ts:364 + // const value = op.AppGlobal.getBytes(a) frame_dig -1 app_global_get - // tests/artifacts/StateOps/contract.py:437 + // tests/artifacts/state-ops/contract.algo.ts:365 // return value retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_get_uint64(a: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_get_uint64(a: bytes) -> uint64: verify_get_uint64: - // tests/artifacts/StateOps/contract.py:439-440 + // tests/artifacts/state-ops/contract.algo.ts:368-369 // @arc4.abimethod() - // def verify_get_uint64(self, a: Bytes) -> UInt64: + // verify_get_uint64(a: bytes): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:441 - // value = op.AppGlobal.get_uint64(a) + // tests/artifacts/state-ops/contract.algo.ts:370 + // const value = op.AppGlobal.getUint64(a) frame_dig -1 app_global_get - // tests/artifacts/StateOps/contract.py:442 + // tests/artifacts/state-ops/contract.algo.ts:371 // return value retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_get_ex_bytes(a: uint64, b: bytes) -> bytes, uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_get_ex_bytes(a: uint64, b: bytes) -> bytes, uint64: verify_get_ex_bytes: - // tests/artifacts/StateOps/contract.py:444-445 + // tests/artifacts/state-ops/contract.algo.ts:374-375 // @arc4.abimethod() - // def verify_get_ex_bytes(self, a: Application, b: Bytes) -> tuple[Bytes, bool]: + // verify_get_ex_bytes(a: Application, b: bytes): readonly [bytes, boolean] { proto 2 2 - // tests/artifacts/StateOps/contract.py:446 - // return op.AppGlobal.get_ex_bytes(a, b) + // tests/artifacts/state-ops/contract.algo.ts:376 + // return op.AppGlobal.getExBytes(a, b) frame_dig -2 frame_dig -1 app_global_get_ex retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_get_ex_uint64(a: uint64, b: bytes) -> uint64, uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_get_ex_uint64(a: uint64, b: bytes) -> uint64, uint64: verify_get_ex_uint64: - // tests/artifacts/StateOps/contract.py:448-449 + // tests/artifacts/state-ops/contract.algo.ts:379-380 // @arc4.abimethod() - // def verify_get_ex_uint64(self, a: Application, b: Bytes) -> tuple[UInt64, bool]: + // verify_get_ex_uint64(a: Application, b: bytes): readonly [uint64, boolean] { proto 2 2 - // tests/artifacts/StateOps/contract.py:450 - // return op.AppGlobal.get_ex_uint64(a, b) + // tests/artifacts/state-ops/contract.algo.ts:381 + // return op.AppGlobal.getExUint64(a, b) frame_dig -2 frame_dig -1 app_global_get_ex retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_delete(a: bytes) -> void: -verify_delete: - // tests/artifacts/StateOps/contract.py:452-453 - // @arc4.abimethod() - // def verify_delete(self, a: Bytes) -> None: - proto 1 0 - // tests/artifacts/StateOps/contract.py:454 - // op.AppGlobal.delete(a) - frame_dig -1 - app_global_del - retsub - - -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_put_uint64(a: bytes, b: uint64) -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_put_uint64(a: bytes, b: uint64) -> void: verify_put_uint64: - // tests/artifacts/StateOps/contract.py:456-457 + // tests/artifacts/state-ops/contract.algo.ts:384-385 // @arc4.abimethod() - // def verify_put_uint64(self, a: Bytes, b: UInt64) -> None: + // verify_put_uint64(a: bytes, b: uint64): void { proto 2 0 - // tests/artifacts/StateOps/contract.py:458 + // tests/artifacts/state-ops/contract.algo.ts:386 // op.AppGlobal.put(a, b) frame_dig -2 frame_dig -1 @@ -296,15 +291,28 @@ verify_put_uint64: retsub -// tests.artifacts.StateOps.contract.StateAppGlobalContract.verify_put_bytes(a: bytes, b: bytes) -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_put_bytes(a: bytes, b: bytes) -> void: verify_put_bytes: - // tests/artifacts/StateOps/contract.py:460-461 + // tests/artifacts/state-ops/contract.algo.ts:389-390 // @arc4.abimethod() - // def verify_put_bytes(self, a: Bytes, b: Bytes) -> None: + // verify_put_bytes(a: bytes, b: bytes): void { proto 2 0 - // tests/artifacts/StateOps/contract.py:462 + // tests/artifacts/state-ops/contract.algo.ts:391 // op.AppGlobal.put(a, b) frame_dig -2 frame_dig -1 app_global_put retsub + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.verify_delete(a: bytes) -> void: +verify_delete: + // tests/artifacts/state-ops/contract.algo.ts:394-395 + // @arc4.abimethod() + // verify_delete(a: bytes): void { + proto 1 0 + // tests/artifacts/state-ops/contract.algo.ts:396 + // op.AppGlobal.delete(a) + frame_dig -1 + app_global_del + retsub diff --git a/tests/artifacts/state-ops/data/StateAppGlobalContract.arc32.json b/tests/artifacts/state-ops/data/StateAppGlobalContract.arc32.json index 0f891de..479fa1b 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAppGlobalContract.arc32.json @@ -20,25 +20,25 @@ "no_op": "CALL" } }, - "verify_delete(byte[])void": { + "verify_put_uint64(byte[],uint64)void": { "call_config": { "no_op": "CALL" } }, - "verify_put_uint64(byte[],uint64)void": { + "verify_put_bytes(byte[],byte[])void": { "call_config": { "no_op": "CALL" } }, - "verify_put_bytes(byte[],byte[])void": { + "verify_delete(byte[])void": { "call_config": { "no_op": "CALL" } } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDExCiAgICBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIKICAgIG1ldGhvZCAidmVyaWZ5X2dldF91aW50NjQoYnl0ZVtdKXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhcHBsaWNhdGlvbixieXRlW10pKGJ5dGVbXSxib29sKSIKICAgIG1ldGhvZCAidmVyaWZ5X2dldF9leF91aW50NjQoYXBwbGljYXRpb24sYnl0ZVtdKSh1aW50NjQsYm9vbCkiCiAgICBtZXRob2QgInZlcmlmeV9kZWxldGUoYnl0ZVtdKXZvaWQiCiAgICBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGJ5dGVbXSx1aW50NjQpdm9pZCIKICAgIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhieXRlW10sYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9nZXRfYnl0ZXNfcm91dGVAMiBtYWluX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDMgbWFpbl92ZXJpZnlfZ2V0X2V4X2J5dGVzX3JvdXRlQDQgbWFpbl92ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA1IG1haW5fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA2IG1haW5fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVANyBtYWluX3ZlcmlmeV9wdXRfYnl0ZXNfcm91dGVAOAogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl92ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfdWludDY0CiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9nZXRfZXhfYnl0ZXNfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0X2V4X2J5dGVzCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZSAweDAwCiAgICBpbnQgMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIGJ5dGUgMHgwMDAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfdWludDY0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlIDB4MDAKICAgIGludCAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9kZWxldGVfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDIyCiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2RlbGV0ZQogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfcHV0X3VpbnQ2NF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X3VpbnQ2NAogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfcHV0X2J5dGVzX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X2J5dGVzCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MjIKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyByZWplY3QgdHJhbnNhY3Rpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2J5dGVzKGE6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2dldF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzQtNDM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9nZXRfYnl0ZXMoc2VsZiwgYTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM2CiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfYnl0ZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MzcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2dldF91aW50NjQoYTogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDM5LTQ0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfZ2V0X3VpbnQ2NChzZWxmLCBhOiBCeXRlcykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQxCiAgICAvLyB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRfdWludDY0KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDQyCiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXMoYTogdWludDY0LCBiOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDQtNDQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9nZXRfZXhfYnl0ZXMoc2VsZiwgYTogQXBwbGljYXRpb24sIGI6IEJ5dGVzKSAtPiB0dXBsZVtCeXRlcywgYm9vbF06CiAgICBwcm90byAyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDYKICAgIC8vIHJldHVybiBvcC5BcHBHbG9iYWwuZ2V0X2V4X2J5dGVzKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfdWludDY0KGE6IHVpbnQ2NCwgYjogYnl0ZXMpIC0+IHVpbnQ2NCwgdWludDY0Ogp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NDgtNDQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9nZXRfZXhfdWludDY0KHNlbGYsIGE6IEFwcGxpY2F0aW9uLCBiOiBCeXRlcykgLT4gdHVwbGVbVUludDY0LCBib29sXToKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ1MAogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRfZXhfdWludDY0KGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGUoYTogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDUyLTQ1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfZGVsZXRlKHNlbGYsIGE6IEJ5dGVzKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDU0CiAgICAvLyBvcC5BcHBHbG9iYWwuZGVsZXRlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZGVsCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0KSAtPiB2b2lkOgp2ZXJpZnlfcHV0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTYtNDU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9wdXRfdWludDY0KHNlbGYsIGE6IEJ5dGVzLCBiOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0NTgKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDYwLTQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfcHV0X2J5dGVzKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQ2MgogICAgLy8gb3AuQXBwR2xvYmFsLnB1dChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQyMgogICAgLy8gY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExCiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDY2OTNhYjkyIDB4ODU3ZmQ5MjMgMHgzNjk5NjQ1MSAweDM5MjBhNTdiIDB4OTNhODUyZTEgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYXBwbGljYXRpb24sYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KGFwcGxpY2F0aW9uLGJ5dGVbXSkodWludDY0LGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X3VpbnQ2NChieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9ieXRlc19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfZXhfdWludDY0X3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X2J5dGVzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X3VpbnQ2NF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfYnl0ZXMKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfdWludDY0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X3VpbnQ2NF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF9ieXRlc19yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3B1dF9ieXRlcwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlcyhhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9nZXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYyLTM2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfYnl0ZXMoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjQKICAgIC8vIGNvbnN0IHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldEJ5dGVzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjgtMzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF91aW50NjQoYTogYnl0ZXMpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb25zdCB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRVaW50NjQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXMoYTogdWludDY0LCBiOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQtMzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF9leF9ieXRlcyhhOiBBcHBsaWNhdGlvbiwgYjogYnl0ZXMpOiByZWFkb25seSBbYnl0ZXMsIGJvb2xlYW5dIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3NgogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKdmVyaWZ5X2dldF9leF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc5LTM4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfZXhfdWludDY0KGE6IEFwcGxpY2F0aW9uLCBiOiBieXRlcyk6IHJlYWRvbmx5IFt1aW50NjQsIGJvb2xlYW5dIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4NgogICAgLy8gb3AuQXBwR2xvYmFsLnB1dChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg5LTM5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfYnl0ZXMoYTogYnl0ZXMsIGI6IGJ5dGVzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozOTEKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGUoYTogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzk0LTM5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9kZWxldGUoYTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NgogICAgLy8gb3AuQXBwR2xvYmFsLmRlbGV0ZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { "global": { @@ -53,11 +53,11 @@ "schema": { "global": { "declared": { - "global_bytes": { + "globalBytes": { "type": "bytes", "key": "global_bytes" }, - "global_uint64": { + "globalUint64": { "type": "uint64", "key": "global_uint64" } @@ -133,11 +133,15 @@ } }, { - "name": "verify_delete", + "name": "verify_put_uint64", "args": [ { "type": "byte[]", "name": "a" + }, + { + "type": "uint64", + "name": "b" } ], "readonly": false, @@ -146,14 +150,14 @@ } }, { - "name": "verify_put_uint64", + "name": "verify_put_bytes", "args": [ { "type": "byte[]", "name": "a" }, { - "type": "uint64", + "type": "byte[]", "name": "b" } ], @@ -163,15 +167,11 @@ } }, { - "name": "verify_put_bytes", + "name": "verify_delete", "args": [ { "type": "byte[]", "name": "a" - }, - { - "type": "byte[]", - "name": "b" } ], "readonly": false, diff --git a/tests/artifacts/state-ops/data/StateAppGlobalContract.arc56.json b/tests/artifacts/state-ops/data/StateAppGlobalContract.arc56.json new file mode 100644 index 0000000..3d10bba --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAppGlobalContract.arc56.json @@ -0,0 +1,260 @@ +{ + "name": "StateAppGlobalContract", + "structs": {}, + "methods": [ + { + "name": "verify_get_bytes", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_ex_bytes", + "args": [ + { + "type": "application", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "(byte[],bool)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_ex_uint64", + "args": [ + { + "type": "application", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "(uint64,bool)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_put_uint64", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_put_bytes", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_delete", + "args": [ + { + "type": "byte[]", + "name": "a" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "globalUint64": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Z2xvYmFsX3VpbnQ2NA==" + }, + "globalBytes": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z2xvYmFsX2J5dGVz" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 87, + 117, + 140, + 191, + 227, + 249, + 273 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 296 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 90, + 120, + 143, + 194, + 230, + 252, + 276 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDExCiAgICBwdXNoYnl0ZXNzIDB4YTk5N2ExODcgMHg0ZGI4YWE0MSAweDY2OTNhYjkyIDB4ODU3ZmQ5MjMgMHgzNjk5NjQ1MSAweDM5MjBhNTdiIDB4OTNhODUyZTEgLy8gbWV0aG9kICJ2ZXJpZnlfZ2V0X2J5dGVzKGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYXBwbGljYXRpb24sYnl0ZVtdKShieXRlW10sYm9vbCkiLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KGFwcGxpY2F0aW9uLGJ5dGVbXSkodWludDY0LGJvb2wpIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X3VpbnQ2NChieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgInZlcmlmeV9wdXRfYnl0ZXMoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZGVsZXRlKGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9ieXRlc19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfZXhfdWludDY0X3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X2J5dGVzX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA4CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X3VpbnQ2NF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfYnl0ZXMKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAzCiAgICBzZXRiaXQKICAgIHB1c2hieXRlcyAweDAwMDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfdWludDY0CiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X3VpbnQ2NF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF9ieXRlc19yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3B1dF9ieXRlcwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZGVsZXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBHbG9iYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlcyhhOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9nZXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzYyLTM2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfYnl0ZXMoYTogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjQKICAgIC8vIGNvbnN0IHZhbHVlID0gb3AuQXBwR2xvYmFsLmdldEJ5dGVzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NChhOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNjgtMzY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF91aW50NjQoYTogYnl0ZXMpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb25zdCB2YWx1ZSA9IG9wLkFwcEdsb2JhbC5nZXRVaW50NjQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXMoYTogdWludDY0LCBiOiBieXRlcykgLT4gYnl0ZXMsIHVpbnQ2NDoKdmVyaWZ5X2dldF9leF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNzQtMzc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF9leF9ieXRlcyhhOiBBcHBsaWNhdGlvbiwgYjogYnl0ZXMpOiByZWFkb25seSBbYnl0ZXMsIGJvb2xlYW5dIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM3NgogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBHbG9iYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NDoKdmVyaWZ5X2dldF9leF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzc5LTM4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfZXhfdWludDY0KGE6IEFwcGxpY2F0aW9uLCBiOiBieXRlcyk6IHJlYWRvbmx5IFt1aW50NjQsIGJvb2xlYW5dIHsKICAgIHByb3RvIDIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcmV0dXJuIG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X3B1dF91aW50NjQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg0LTM4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfdWludDY0KGE6IGJ5dGVzLCBiOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM4NgogICAgLy8gb3AuQXBwR2xvYmFsLnB1dChhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzg5LTM5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfYnl0ZXMoYTogYnl0ZXMsIGI6IGJ5dGVzKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozOTEKICAgIC8vIG9wLkFwcEdsb2JhbC5wdXQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbENvbnRyYWN0LnZlcmlmeV9kZWxldGUoYTogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mzk0LTM5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9kZWxldGUoYTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM5NgogICAgLy8gb3AuQXBwR2xvYmFsLmRlbGV0ZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAppGlobalContract.clear.teal b/tests/artifacts/state-ops/data/StateAppGlobalContract.clear.teal index d7a1245..62c9330 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAppGlobalContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppGlobalContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:422 - // class StateAppGlobalContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAppGlobalExContract.approval.teal b/tests/artifacts/state-ops/data/StateAppGlobalExContract.approval.teal index 35af159..bc81e3d 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalExContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAppGlobalExContract.approval.teal @@ -1,77 +1,71 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppGlobalExContract.approval_program: +tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalExContract.approvalProgram: + bytecblock "dummy_bytes" 0x001064756d6d795f617263345f6279746573 txn ApplicationID - bnz main_entrypoint@2 - callsub __init__ + bnz main_after_if_else@2 + callsub constructor -main_entrypoint@2: - // tests/artifacts/StateOps/contract.py:404 - // class StateAppGlobalExContract(ARC4Contract): - txn NumAppArgs - ! - assert // reject transaction - txn OnCompletion - ! - assert // reject transaction - txn ApplicationID - ! - assert // is creating - int 1 +main_after_if_else@2: + callsub __puya_arc4_router__ return -// tests.artifacts.StateOps.contract.StateAppGlobalExContract.__init__() -> void: -__init__: - // tests/artifacts/StateOps/contract.py:405 - // def __init__(self) -> None: +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalExContract.constructor() -> void: +constructor: + // tests/artifacts/state-ops/contract.algo.ts:349 + // export class StateAppGlobalExContract extends arc4.Contract { proto 0 0 - // tests/artifacts/StateOps/contract.py:408 - // key="global_uint64", - byte "global_uint64" - // tests/artifacts/StateOps/contract.py:407 - // UInt64(2), - int 2 - // tests/artifacts/StateOps/contract.py:406-409 - // self.global_uint64 = GlobalState( - // UInt64(2), - // key="global_uint64", - // ) + // tests/artifacts/state-ops/contract.algo.ts:350 + // globalUint64 = GlobalState({ key: Bytes('global_uint64'), initialValue: Uint64(2) }) + pushbytes "global_uint64" + pushint 2 // 2 app_global_put - // tests/artifacts/StateOps/contract.py:412 - // key="global_bytes", - byte "global_bytes" - // tests/artifacts/StateOps/contract.py:411 - // Bytes(b"dummy_bytes"), - byte 0x64756d6d795f6279746573 - // tests/artifacts/StateOps/contract.py:410-413 - // self.global_bytes = GlobalState( - // Bytes(b"dummy_bytes"), - // key="global_bytes", - // ) + // tests/artifacts/state-ops/contract.algo.ts:351 + // globalBytes = GlobalState({ key: Bytes('global_bytes'), initialValue: Bytes('dummy_bytes') }) + pushbytes "global_bytes" + bytec_0 // "dummy_bytes" app_global_put - // tests/artifacts/StateOps/contract.py:414 - // self.global_uint64_explicit = algopy.UInt64(2) - byte "global_uint64_explicit" - int 2 + // tests/artifacts/state-ops/contract.algo.ts:352 + // global_uint64_explicit = GlobalState({ initialValue: Uint64(2) }) + pushbytes "global_uint64_explicit" + pushint 2 // 2 app_global_put - // tests/artifacts/StateOps/contract.py:415 - // self.global_bytes_explicit = algopy.Bytes(b"dummy_bytes") - byte "global_bytes_explicit" - byte 0x64756d6d795f6279746573 + // tests/artifacts/state-ops/contract.algo.ts:353 + // global_bytes_explicit = GlobalState({ initialValue: Bytes('dummy_bytes') }) + pushbytes "global_bytes_explicit" + bytec_0 // "dummy_bytes" app_global_put - // tests/artifacts/StateOps/contract.py:417 - // algopy.arc4.DynamicBytes(b"dummy_arc4_bytes"), key="global_arc4_bytes" - byte "global_arc4_bytes" - byte 0x001064756d6d795f617263345f6279746573 - // tests/artifacts/StateOps/contract.py:416-418 - // self.global_arc4_bytes = GlobalState( - // algopy.arc4.DynamicBytes(b"dummy_arc4_bytes"), key="global_arc4_bytes" - // ) + // tests/artifacts/state-ops/contract.algo.ts:354 + // globalArc4Bytes = GlobalState({ key: Bytes('global_arc4_bytes'), initialValue: new DynamicBytes('dummy_arc4_bytes') }) + pushbytes "global_arc4_bytes" + bytec_1 // 0x001064756d6d795f617263345f6279746573 app_global_put - // tests/artifacts/StateOps/contract.py:419 - // self.global_arc4_bytes_explicit = algopy.arc4.DynamicBytes(b"dummy_arc4_bytes") - byte "global_arc4_bytes_explicit" - byte 0x001064756d6d795f617263345f6279746573 + // tests/artifacts/state-ops/contract.algo.ts:355 + // global_arc4_bytes_explicit = GlobalState({ initialValue: new DynamicBytes('dummy_arc4_bytes') }) + pushbytes "global_arc4_bytes_explicit" + bytec_1 // 0x001064756d6d795f617263345f6279746573 app_global_put retsub + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalExContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:349 + // export class StateAppGlobalExContract extends arc4.Contract { + proto 0 1 + txn NumAppArgs + bnz __puya_arc4_router___after_if_else@6 + txn OnCompletion + bnz __puya_arc4_router___after_if_else@6 + txn ApplicationID + ! + assert // can only call when creating + pushint 1 // 1 + retsub + +__puya_arc4_router___after_if_else@6: + // tests/artifacts/state-ops/contract.algo.ts:349 + // export class StateAppGlobalExContract extends arc4.Contract { + pushint 0 // 0 + retsub diff --git a/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc32.json b/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc32.json index 4492dbf..4e8e5d8 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc32.json @@ -1,8 +1,8 @@ { "hints": {}, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxFeENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDQKICAgIC8vIGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgICEKICAgIGFzc2VydCAvLyByZWplY3QgdHJhbnNhY3Rpb24KICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyByZWplY3QgdHJhbnNhY3Rpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxFeENvbnRyYWN0Ll9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA1CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwOAogICAgLy8ga2V5PSJnbG9iYWxfdWludDY0IiwKICAgIGJ5dGUgImdsb2JhbF91aW50NjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA3CiAgICAvLyBVSW50NjQoMiksCiAgICBpbnQgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjQwNi00MDkKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NCA9IEdsb2JhbFN0YXRlKAogICAgLy8gICAgIFVJbnQ2NCgyKSwKICAgIC8vICAgICBrZXk9Imdsb2JhbF91aW50NjQiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTIKICAgIC8vIGtleT0iZ2xvYmFsX2J5dGVzIiwKICAgIGJ5dGUgImdsb2JhbF9ieXRlcyIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTEKICAgIC8vIEJ5dGVzKGIiZHVtbXlfYnl0ZXMiKSwKICAgIGJ5dGUgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDEwLTQxMwogICAgLy8gc2VsZi5nbG9iYWxfYnl0ZXMgPSBHbG9iYWxTdGF0ZSgKICAgIC8vICAgICBCeXRlcyhiImR1bW15X2J5dGVzIiksCiAgICAvLyAgICAga2V5PSJnbG9iYWxfYnl0ZXMiLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTQKICAgIC8vIHNlbGYuZ2xvYmFsX3VpbnQ2NF9leHBsaWNpdCA9IGFsZ29weS5VSW50NjQoMikKICAgIGJ5dGUgImdsb2JhbF91aW50NjRfZXhwbGljaXQiCiAgICBpbnQgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTUKICAgIC8vIHNlbGYuZ2xvYmFsX2J5dGVzX2V4cGxpY2l0ID0gYWxnb3B5LkJ5dGVzKGIiZHVtbXlfYnl0ZXMiKQogICAgYnl0ZSAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZSAweDY0NzU2ZDZkNzk1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDE3CiAgICAvLyBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIiksIGtleT0iZ2xvYmFsX2FyYzRfYnl0ZXMiCiAgICBieXRlICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGUgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTYtNDE4CiAgICAvLyBzZWxmLmdsb2JhbF9hcmM0X2J5dGVzID0gR2xvYmFsU3RhdGUoCiAgICAvLyAgICAgYWxnb3B5LmFyYzQuRHluYW1pY0J5dGVzKGIiZHVtbXlfYXJjNF9ieXRlcyIpLCBrZXk9Imdsb2JhbF9hcmM0X2J5dGVzIgogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MTkKICAgIC8vIHNlbGYuZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQgPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoYiJkdW1teV9hcmM0X2J5dGVzIikKICAgIGJ5dGUgImdsb2JhbF9hcmM0X2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZSAweDAwMTA2NDc1NmQ2ZDc5NWY2MTcyNjMzNDVmNjI3OTc0NjU3MwogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBHbG9iYWxFeENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6NDA0CiAgICAvLyBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludCAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsRXhDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBieXRlY2Jsb2NrICJkdW1teV9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgY29uc3RydWN0b3IKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QuY29uc3RydWN0b3IoKSAtPiB2b2lkOgpjb25zdHJ1Y3RvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1MAogICAgLy8gZ2xvYmFsVWludDY0ID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfdWludDY0JyksIGluaXRpYWxWYWx1ZTogVWludDY0KDIpIH0pCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjQiCiAgICBwdXNoaW50IDIgLy8gMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGdsb2JhbEJ5dGVzID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfYnl0ZXMnKSwgaW5pdGlhbFZhbHVlOiBCeXRlcygnZHVtbXlfYnl0ZXMnKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICBieXRlY18wIC8vICJkdW1teV9ieXRlcyIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBnbG9iYWxfdWludDY0X2V4cGxpY2l0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgyKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0X2V4cGxpY2l0IgogICAgcHVzaGludCAyIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyBnbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJ2R1bW15X2J5dGVzJykgfSkKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAiZHVtbXlfYnl0ZXMiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gZ2xvYmFsQXJjNEJ5dGVzID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfYXJjNF9ieXRlcycpLCBpbml0aWFsVmFsdWU6IG5ldyBEeW5hbWljQnl0ZXMoJ2R1bW15X2FyYzRfYnl0ZXMnKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyBnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkdW1teV9hcmM0X2J5dGVzJykgfSkKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsRXhDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { "global": { @@ -17,26 +17,26 @@ "schema": { "global": { "declared": { - "global_arc4_bytes": { + "globalArc4Bytes": { "type": "bytes", "key": "global_arc4_bytes" }, - "global_arc4_bytes_explicit": { + "globalBytes": { "type": "bytes", - "key": "global_arc4_bytes_explicit" + "key": "global_bytes" + }, + "globalUint64": { + "type": "uint64", + "key": "global_uint64" }, - "global_bytes": { + "global_arc4_bytes_explicit": { "type": "bytes", - "key": "global_bytes" + "key": "global_arc4_bytes_explicit" }, "global_bytes_explicit": { "type": "bytes", "key": "global_bytes_explicit" }, - "global_uint64": { - "type": "uint64", - "key": "global_uint64" - }, "global_uint64_explicit": { "type": "uint64", "key": "global_uint64_explicit" diff --git a/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc56.json b/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc56.json new file mode 100644 index 0000000..2f5a1d0 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAppGlobalExContract.arc56.json @@ -0,0 +1,92 @@ +{ + "name": "StateAppGlobalExContract", + "structs": {}, + "methods": [], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 2, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "globalUint64": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Z2xvYmFsX3VpbnQ2NA==" + }, + "globalBytes": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z2xvYmFsX2J5dGVz" + }, + "global_uint64_explicit": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Z2xvYmFsX3VpbnQ2NF9leHBsaWNpdA==" + }, + "global_bytes_explicit": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z2xvYmFsX2J5dGVzX2V4cGxpY2l0" + }, + "globalArc4Bytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "Z2xvYmFsX2FyYzRfYnl0ZXM=" + }, + "global_arc4_bytes_explicit": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "Z2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQ=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 203 + ], + "errorMessage": "can only call when creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsRXhDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBieXRlY2Jsb2NrICJkdW1teV9ieXRlcyIgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIGNhbGxzdWIgY29uc3RydWN0b3IKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QuY29uc3RydWN0b3IoKSAtPiB2b2lkOgpjb25zdHJ1Y3RvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1MAogICAgLy8gZ2xvYmFsVWludDY0ID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfdWludDY0JyksIGluaXRpYWxWYWx1ZTogVWludDY0KDIpIH0pCiAgICBwdXNoYnl0ZXMgImdsb2JhbF91aW50NjQiCiAgICBwdXNoaW50IDIgLy8gMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNTEKICAgIC8vIGdsb2JhbEJ5dGVzID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfYnl0ZXMnKSwgaW5pdGlhbFZhbHVlOiBCeXRlcygnZHVtbXlfYnl0ZXMnKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYnl0ZXMiCiAgICBieXRlY18wIC8vICJkdW1teV9ieXRlcyIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBnbG9iYWxfdWludDY0X2V4cGxpY2l0ID0gR2xvYmFsU3RhdGUoeyBpbml0aWFsVmFsdWU6IFVpbnQ2NCgyKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfdWludDY0X2V4cGxpY2l0IgogICAgcHVzaGludCAyIC8vIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyBnbG9iYWxfYnl0ZXNfZXhwbGljaXQgPSBHbG9iYWxTdGF0ZSh7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJ2R1bW15X2J5dGVzJykgfSkKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2J5dGVzX2V4cGxpY2l0IgogICAgYnl0ZWNfMCAvLyAiZHVtbXlfYnl0ZXMiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gZ2xvYmFsQXJjNEJ5dGVzID0gR2xvYmFsU3RhdGUoeyBrZXk6IEJ5dGVzKCdnbG9iYWxfYXJjNF9ieXRlcycpLCBpbml0aWFsVmFsdWU6IG5ldyBEeW5hbWljQnl0ZXMoJ2R1bW15X2FyYzRfYnl0ZXMnKSB9KQogICAgcHVzaGJ5dGVzICJnbG9iYWxfYXJjNF9ieXRlcyIKICAgIGJ5dGVjXzEgLy8gMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyBnbG9iYWxfYXJjNF9ieXRlc19leHBsaWNpdCA9IEdsb2JhbFN0YXRlKHsgaW5pdGlhbFZhbHVlOiBuZXcgRHluYW1pY0J5dGVzKCdkdW1teV9hcmM0X2J5dGVzJykgfSkKICAgIHB1c2hieXRlcyAiZ2xvYmFsX2FyYzRfYnl0ZXNfZXhwbGljaXQiCiAgICBieXRlY18xIC8vIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwR2xvYmFsRXhDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDkKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcEdsb2JhbEV4Q29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwR2xvYmFsRXhDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAppGlobalExContract.clear.teal b/tests/artifacts/state-ops/data/StateAppGlobalExContract.clear.teal index 3d0e5c8..c5063ae 100644 --- a/tests/artifacts/state-ops/data/StateAppGlobalExContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAppGlobalExContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppGlobalExContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:404 - // class StateAppGlobalExContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAppGlobalExContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAppLocalContract.approval.teal b/tests/artifacts/state-ops/data/StateAppLocalContract.approval.teal index d373649..e9aa093 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAppLocalContract.approval.teal @@ -1,52 +1,54 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppLocalContract.approval_program: - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@13 - method "opt_in()void" - method "verify_get_bytes(account,byte[])byte[]" - method "verify_get_uint64(account,byte[])uint64" - method "verify_get_ex_bytes(account,application,byte[])byte[]" - method "verify_get_ex_uint64(account,application,byte[])uint64" - method "verify_delete(account,byte[])void" - method "verify_exists(account,byte[])bool" - method "verify_put_uint64(account,byte[],uint64)void" - method "verify_put_bytes(account,byte[],byte[])void" + bz __puya_arc4_router___bare_routing@13 + pushbytess 0x30c6d58a 0x937b5e13 0x8d742b86 0x7a6d0b59 0x594ff1d9 0x95a31727 0xaa1f4792 0x46245287 0x7f0fdfdd // method "opt_in()void", method "verify_get_bytes(account,byte[])byte[]", method "verify_get_uint64(account,byte[])uint64", method "verify_get_ex_bytes(account,application,byte[])byte[]", method "verify_get_ex_uint64(account,application,byte[])uint64", method "verify_delete(account,byte[])void", method "verify_exists(account,byte[])bool", method "verify_put_uint64(account,byte[],uint64)void", method "verify_put_bytes(account,byte[],byte[])void" txna ApplicationArgs 0 - match main_opt_in_route@2 main_verify_get_bytes_route@3 main_verify_get_uint64_route@4 main_verify_get_ex_bytes_route@5 main_verify_get_ex_uint64_route@6 main_verify_delete_route@7 main_verify_exists_route@8 main_verify_put_uint64_route@9 main_verify_put_bytes_route@10 - err // reject transaction + match __puya_arc4_router___opt_in_route@2 __puya_arc4_router___verify_get_bytes_route@3 __puya_arc4_router___verify_get_uint64_route@4 __puya_arc4_router___verify_get_ex_bytes_route@5 __puya_arc4_router___verify_get_ex_uint64_route@6 __puya_arc4_router___verify_delete_route@7 __puya_arc4_router___verify_exists_route@8 __puya_arc4_router___verify_put_uint64_route@9 __puya_arc4_router___verify_put_bytes_route@10 + intc_1 // 0 + retsub -main_opt_in_route@2: - // tests/artifacts/StateOps/contract.py:361 - // @arc4.abimethod(allow_actions=["OptIn"]) +__puya_arc4_router___opt_in_route@2: + // tests/artifacts/state-ops/contract.algo.ts:417 + // @arc4.abimethod({ allowActions: ['OptIn'] }) txn OnCompletion - int OptIn + intc_0 // OptIn == - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub opt_in - int 1 - return + intc_0 // 1 + retsub -main_verify_get_bytes_route@3: - // tests/artifacts/StateOps/contract.py:366 +__puya_arc4_router___verify_get_bytes_route@3: + // tests/artifacts/state-ops/contract.algo.ts:423 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:366 + // tests/artifacts/state-ops/contract.algo.ts:423 // @arc4.abimethod() callsub verify_get_bytes dup @@ -55,49 +57,49 @@ main_verify_get_bytes_route@3: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_uint64_route@4: - // tests/artifacts/StateOps/contract.py:371 +__puya_arc4_router___verify_get_uint64_route@4: + // tests/artifacts/state-ops/contract.algo.ts:429 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:371 + // tests/artifacts/state-ops/contract.algo.ts:429 // @arc4.abimethod() callsub verify_get_uint64 itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_ex_bytes_route@5: - // tests/artifacts/StateOps/contract.py:376 +__puya_arc4_router___verify_get_ex_bytes_route@5: + // tests/artifacts/state-ops/contract.algo.ts:435 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts @@ -106,7 +108,7 @@ main_verify_get_ex_bytes_route@5: txnas Applications txna ApplicationArgs 3 extract 2 0 - // tests/artifacts/StateOps/contract.py:376 + // tests/artifacts/state-ops/contract.algo.ts:435 // @arc4.abimethod() callsub verify_get_ex_bytes dup @@ -115,23 +117,23 @@ main_verify_get_ex_bytes_route@5: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_get_ex_uint64_route@6: - // tests/artifacts/StateOps/contract.py:381 +__puya_arc4_router___verify_get_ex_uint64_route@6: + // tests/artifacts/state-ops/contract.algo.ts:441 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts @@ -140,77 +142,77 @@ main_verify_get_ex_uint64_route@6: txnas Applications txna ApplicationArgs 3 extract 2 0 - // tests/artifacts/StateOps/contract.py:381 + // tests/artifacts/state-ops/contract.algo.ts:441 // @arc4.abimethod() callsub verify_get_ex_uint64 itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_delete_route@7: - // tests/artifacts/StateOps/contract.py:386 +__puya_arc4_router___verify_delete_route@7: + // tests/artifacts/state-ops/contract.algo.ts:447 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:386 + // tests/artifacts/state-ops/contract.algo.ts:447 // @arc4.abimethod() callsub verify_delete - int 1 - return + intc_0 // 1 + retsub -main_verify_exists_route@8: - // tests/artifacts/StateOps/contract.py:390 +__puya_arc4_router___verify_exists_route@8: + // tests/artifacts/state-ops/contract.algo.ts:452 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 extract 2 0 - // tests/artifacts/StateOps/contract.py:390 + // tests/artifacts/state-ops/contract.algo.ts:452 // @arc4.abimethod() callsub verify_exists - byte 0x00 - int 0 + pushbytes 0x00 + intc_1 // 0 uncover 2 setbit - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_put_uint64_route@9: - // tests/artifacts/StateOps/contract.py:395 +__puya_arc4_router___verify_put_uint64_route@9: + // tests/artifacts/state-ops/contract.algo.ts:458 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts @@ -218,22 +220,22 @@ main_verify_put_uint64_route@9: extract 2 0 txna ApplicationArgs 3 btoi - // tests/artifacts/StateOps/contract.py:395 + // tests/artifacts/state-ops/contract.algo.ts:458 // @arc4.abimethod() callsub verify_put_uint64 - int 1 - return + intc_0 // 1 + retsub -main_verify_put_bytes_route@10: - // tests/artifacts/StateOps/contract.py:399 +__puya_arc4_router___verify_put_bytes_route@10: + // tests/artifacts/state-ops/contract.algo.ts:463 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts @@ -241,129 +243,133 @@ main_verify_put_bytes_route@10: extract 2 0 txna ApplicationArgs 3 extract 2 0 - // tests/artifacts/StateOps/contract.py:399 + // tests/artifacts/state-ops/contract.algo.ts:463 // @arc4.abimethod() callsub verify_put_bytes - int 1 - return + intc_0 // 1 + retsub -main_bare_routing@13: - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): +__puya_arc4_router___bare_routing@13: + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@17 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@17: + // tests/artifacts/state-ops/contract.algo.ts:413 + // export class StateAppLocalContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.opt_in() -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.opt_in() -> void: opt_in: - // tests/artifacts/StateOps/contract.py:361-362 - // @arc4.abimethod(allow_actions=["OptIn"]) - // def opt_in(self) -> None: + // tests/artifacts/state-ops/contract.algo.ts:417-418 + // @arc4.abimethod({ allowActions: ['OptIn'] }) + // opt_in() { proto 0 0 - // tests/artifacts/StateOps/contract.py:363 - // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes") + // tests/artifacts/state-ops/contract.algo.ts:419 + // this.localBytes(Global.creatorAddress).value = Bytes('dummy_bytes') global CreatorAddress - // tests/artifacts/StateOps/contract.py:358 - // key="local_bytes", - byte "local_bytes" - // tests/artifacts/StateOps/contract.py:363 - // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes") - byte 0x64756d6d795f6279746573 + // tests/artifacts/state-ops/contract.algo.ts:415 + // localBytes = LocalState({ key: 'local_bytes' }) + pushbytess "local_bytes" "dummy_bytes" // "local_bytes", "dummy_bytes" + // tests/artifacts/state-ops/contract.algo.ts:419 + // this.localBytes(Global.creatorAddress).value = Bytes('dummy_bytes') app_local_put - // tests/artifacts/StateOps/contract.py:364 - // self.local_uint64[Global.creator_address] = UInt64(999) + // tests/artifacts/state-ops/contract.algo.ts:420 + // this.localUint64(Global.creatorAddress).value = Uint64(999) global CreatorAddress - // tests/artifacts/StateOps/contract.py:353 - // key="local_uint64", - byte "local_uint64" - // tests/artifacts/StateOps/contract.py:364 - // self.local_uint64[Global.creator_address] = UInt64(999) - int 999 + // tests/artifacts/state-ops/contract.algo.ts:414 + // localUint64 = LocalState({ key: 'local_uint64' }) + pushbytes "local_uint64" + // tests/artifacts/state-ops/contract.algo.ts:420 + // this.localUint64(Global.creatorAddress).value = Uint64(999) + pushint 999 // 999 app_local_put retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_get_bytes(a: bytes, b: bytes) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_get_bytes(a: bytes, b: bytes) -> bytes: verify_get_bytes: - // tests/artifacts/StateOps/contract.py:366-367 + // tests/artifacts/state-ops/contract.algo.ts:423-424 // @arc4.abimethod() - // def verify_get_bytes(self, a: Account, b: Bytes) -> Bytes: + // verify_get_bytes(a: Account, b: bytes): bytes { proto 2 1 - // tests/artifacts/StateOps/contract.py:368 - // value = op.AppLocal.get_bytes(a, b) + // tests/artifacts/state-ops/contract.algo.ts:425 + // const value = op.AppLocal.getBytes(a, b) frame_dig -2 frame_dig -1 app_local_get - // tests/artifacts/StateOps/contract.py:369 + // tests/artifacts/state-ops/contract.algo.ts:426 // return value retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_get_uint64(a: bytes, b: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_get_uint64(a: bytes, b: bytes) -> uint64: verify_get_uint64: - // tests/artifacts/StateOps/contract.py:371-372 + // tests/artifacts/state-ops/contract.algo.ts:429-430 // @arc4.abimethod() - // def verify_get_uint64(self, a: Account, b: Bytes) -> UInt64: + // verify_get_uint64(a: Account, b: bytes): uint64 { proto 2 1 - // tests/artifacts/StateOps/contract.py:373 - // value = op.AppLocal.get_uint64(a, b) + // tests/artifacts/state-ops/contract.algo.ts:431 + // const value = op.AppLocal.getUint64(a, b) frame_dig -2 frame_dig -1 app_local_get - // tests/artifacts/StateOps/contract.py:374 + // tests/artifacts/state-ops/contract.algo.ts:432 // return value retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_get_ex_bytes(a: bytes, b: uint64, c: bytes) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_get_ex_bytes(a: bytes, b: uint64, c: bytes) -> bytes: verify_get_ex_bytes: - // tests/artifacts/StateOps/contract.py:376-377 + // tests/artifacts/state-ops/contract.algo.ts:435-436 // @arc4.abimethod() - // def verify_get_ex_bytes(self, a: Account, b: Application, c: Bytes) -> Bytes: + // verify_get_ex_bytes(a: Account, b: Application, c: bytes): bytes { proto 3 1 - // tests/artifacts/StateOps/contract.py:378 - // value, _val = op.AppLocal.get_ex_bytes(a, b, c) + // tests/artifacts/state-ops/contract.algo.ts:437 + // const [value, _val] = op.AppLocal.getExBytes(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 app_local_get_ex pop - // tests/artifacts/StateOps/contract.py:379 + // tests/artifacts/state-ops/contract.algo.ts:438 // return value retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_get_ex_uint64(a: bytes, b: uint64, c: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_get_ex_uint64(a: bytes, b: uint64, c: bytes) -> uint64: verify_get_ex_uint64: - // tests/artifacts/StateOps/contract.py:381-382 + // tests/artifacts/state-ops/contract.algo.ts:441-442 // @arc4.abimethod() - // def verify_get_ex_uint64(self, a: Account, b: Application, c: Bytes) -> UInt64: + // verify_get_ex_uint64(a: Account, b: Application, c: bytes): uint64 { proto 3 1 - // tests/artifacts/StateOps/contract.py:383 - // value, _val = op.AppLocal.get_ex_uint64(a, b, c) + // tests/artifacts/state-ops/contract.algo.ts:443 + // const [value, _val] = op.AppLocal.getExUint64(a, b, c) frame_dig -3 frame_dig -2 frame_dig -1 app_local_get_ex pop - // tests/artifacts/StateOps/contract.py:384 + // tests/artifacts/state-ops/contract.algo.ts:444 // return value retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_delete(a: bytes, b: bytes) -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_delete(a: bytes, b: bytes) -> void: verify_delete: - // tests/artifacts/StateOps/contract.py:386-387 + // tests/artifacts/state-ops/contract.algo.ts:447-448 // @arc4.abimethod() - // def verify_delete(self, a: Account, b: Bytes) -> None: + // verify_delete(a: Account, b: bytes): void { proto 2 0 - // tests/artifacts/StateOps/contract.py:388 + // tests/artifacts/state-ops/contract.algo.ts:449 // op.AppLocal.delete(a, b) frame_dig -2 frame_dig -1 @@ -371,31 +377,31 @@ verify_delete: retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_exists(a: bytes, b: bytes) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_exists(a: bytes, b: bytes) -> uint64: verify_exists: - // tests/artifacts/StateOps/contract.py:390-391 + // tests/artifacts/state-ops/contract.algo.ts:452-453 // @arc4.abimethod() - // def verify_exists(self, a: Account, b: Bytes) -> bool: + // verify_exists(a: Account, b: bytes): boolean { proto 2 1 - // tests/artifacts/StateOps/contract.py:392 - // _value, exists = op.AppLocal.get_ex_uint64(a, 0, b) + // tests/artifacts/state-ops/contract.algo.ts:454 + // const [_value, exists] = op.AppLocal.getExUint64(a, 0, b) frame_dig -2 - int 0 + intc_1 // 0 frame_dig -1 app_local_get_ex bury 1 - // tests/artifacts/StateOps/contract.py:393 + // tests/artifacts/state-ops/contract.algo.ts:455 // return exists retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_put_uint64(a: bytes, b: bytes, c: uint64) -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_put_uint64(a: bytes, b: bytes, c: uint64) -> void: verify_put_uint64: - // tests/artifacts/StateOps/contract.py:395-396 + // tests/artifacts/state-ops/contract.algo.ts:458-459 // @arc4.abimethod() - // def verify_put_uint64(self, a: Account, b: Bytes, c: UInt64) -> None: + // verify_put_uint64(a: Account, b: bytes, c: uint64): void { proto 3 0 - // tests/artifacts/StateOps/contract.py:397 + // tests/artifacts/state-ops/contract.algo.ts:460 // op.AppLocal.put(a, b, c) frame_dig -3 frame_dig -2 @@ -404,13 +410,13 @@ verify_put_uint64: retsub -// tests.artifacts.StateOps.contract.StateAppLocalContract.verify_put_bytes(a: bytes, b: bytes, c: bytes) -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.verify_put_bytes(a: bytes, b: bytes, c: bytes) -> void: verify_put_bytes: - // tests/artifacts/StateOps/contract.py:399-400 + // tests/artifacts/state-ops/contract.algo.ts:463-464 // @arc4.abimethod() - // def verify_put_bytes(self, a: Account, b: Bytes, c: Bytes) -> None: + // verify_put_bytes(a: Account, b: bytes, c: bytes): void { proto 3 0 - // tests/artifacts/StateOps/contract.py:401 + // tests/artifacts/state-ops/contract.algo.ts:465 // op.AppLocal.put(a, b, c) frame_dig -3 frame_dig -2 diff --git a/tests/artifacts/state-ops/data/StateAppLocalContract.arc32.json b/tests/artifacts/state-ops/data/StateAppLocalContract.arc32.json index f5ed19a..01fc23d 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAppLocalContract.arc32.json @@ -47,8 +47,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMwogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICBtZXRob2QgInZlcmlmeV9nZXRfYnl0ZXMoYWNjb3VudCxieXRlW10pYnl0ZVtdIgogICAgbWV0aG9kICJ2ZXJpZnlfZ2V0X3VpbnQ2NChhY2NvdW50LGJ5dGVbXSl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9nZXRfZXhfYnl0ZXMoYWNjb3VudCxhcHBsaWNhdGlvbixieXRlW10pYnl0ZVtdIgogICAgbWV0aG9kICJ2ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhY2NvdW50LGFwcGxpY2F0aW9uLGJ5dGVbXSl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9kZWxldGUoYWNjb3VudCxieXRlW10pdm9pZCIKICAgIG1ldGhvZCAidmVyaWZ5X2V4aXN0cyhhY2NvdW50LGJ5dGVbXSlib29sIgogICAgbWV0aG9kICJ2ZXJpZnlfcHV0X3VpbnQ2NChhY2NvdW50LGJ5dGVbXSx1aW50NjQpdm9pZCIKICAgIG1ldGhvZCAidmVyaWZ5X3B1dF9ieXRlcyhhY2NvdW50LGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fb3B0X2luX3JvdXRlQDIgbWFpbl92ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDMgbWFpbl92ZXJpZnlfZ2V0X3VpbnQ2NF9yb3V0ZUA0IG1haW5fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1IG1haW5fdmVyaWZ5X2dldF9leF91aW50NjRfcm91dGVANiBtYWluX3ZlcmlmeV9kZWxldGVfcm91dGVANyBtYWluX3ZlcmlmeV9leGlzdHNfcm91dGVAOCBtYWluX3ZlcmlmeV9wdXRfdWludDY0X3JvdXRlQDkgbWFpbl92ZXJpZnlfcHV0X2J5dGVzX3JvdXRlQDEwCiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbl9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9nZXRfYnl0ZXNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2dldF91aW50NjRfcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldF91aW50NjQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDkKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9nZXRfZXhfdWludDY0X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2dldF9leF91aW50NjQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDkKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZGVsZXRlCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9leGlzdHNfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4aXN0cwogICAgYnl0ZSAweDAwCiAgICBpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3B1dF91aW50NjQKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X3B1dF9ieXRlc19yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozOTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9wdXRfYnl0ZXMKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC5vcHRfaW4oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYxLTM2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYzCiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNTgKICAgIC8vIGtleT0ibG9jYWxfYnl0ZXMiLAogICAgYnl0ZSAibG9jYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzYzCiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlcyIpCiAgICBieXRlIDB4NjQ3NTZkNmQ3OTVmNjI3OTc0NjU3MwogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gc2VsZi5sb2NhbF91aW50NjRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBVSW50NjQoOTk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzUzCiAgICAvLyBrZXk9ImxvY2FsX3VpbnQ2NCIsCiAgICBieXRlICJsb2NhbF91aW50NjQiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY0CiAgICAvLyBzZWxmLmxvY2FsX3VpbnQ2NFtHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IFVJbnQ2NCg5OTkpCiAgICBpbnQgOTk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfYnl0ZXMoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKdmVyaWZ5X2dldF9ieXRlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjYtMzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9nZXRfYnl0ZXMoc2VsZiwgYTogQWNjb3VudCwgYjogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzY4CiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF9ieXRlcyhhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9nZXQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNjkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzcxLTM3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfZ2V0X3VpbnQ2NChzZWxmLCBhOiBBY2NvdW50LCBiOiBCeXRlcykgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzczCiAgICAvLyB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldF91aW50NjQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzc0CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9leF9ieXRlcyhhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeV9nZXRfZXhfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzc2LTM3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfZ2V0X2V4X2J5dGVzKHNlbGYsIGE6IEFjY291bnQsIGI6IEFwcGxpY2F0aW9uLCBjOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzgKICAgIC8vIHZhbHVlLCBfdmFsID0gb3AuQXBwTG9jYWwuZ2V0X2V4X2J5dGVzKGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNzkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozODEtMzgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9nZXRfZXhfdWludDY0KHNlbGYsIGE6IEFjY291bnQsIGI6IEFwcGxpY2F0aW9uLCBjOiBCeXRlcykgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzgzCiAgICAvLyB2YWx1ZSwgX3ZhbCA9IG9wLkFwcExvY2FsLmdldF9leF91aW50NjQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9kZWxldGUoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgp2ZXJpZnlfZGVsZXRlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4Ni0zODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2RlbGV0ZShzZWxmLCBhOiBBY2NvdW50LCBiOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gb3AuQXBwTG9jYWwuZGVsZXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2RlbAogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZXhpc3RzKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZXhpc3RzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MC0zOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2V4aXN0cyhzZWxmLCBhOiBBY2NvdW50LCBiOiBCeXRlcykgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MgogICAgLy8gX3ZhbHVlLCBleGlzdHMgPSBvcC5BcHBMb2NhbC5nZXRfZXhfdWludDY0KGEsIDAsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5MwogICAgLy8gcmV0dXJuIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk1LTM5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfcHV0X3VpbnQ2NChzZWxmLCBhOiBBY2NvdW50LCBiOiBCeXRlcywgYzogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mzk3CiAgICAvLyBvcC5BcHBMb2NhbC5wdXQoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X3B1dF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMsIGM6IGJ5dGVzKSAtPiB2b2lkOgp2ZXJpZnlfcHV0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM5OS00MDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X3B1dF9ieXRlcyhzZWxmLCBhOiBBY2NvdW50LCBiOiBCeXRlcywgYzogQnl0ZXMpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTo0MDEKICAgIC8vIG9wLkFwcExvY2FsLnB1dChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ5CiAgICAvLyBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludCAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbENvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMwogICAgcHVzaGJ5dGVzcyAweDMwYzZkNThhIDB4OTM3YjVlMTMgMHg4ZDc0MmI4NiAweDdhNmQwYjU5IDB4NTk0ZmYxZDkgMHg5NWEzMTcyNyAweGFhMWY0NzkyIDB4NDYyNDUyODcgMHg3ZjBmZGZkZCAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhY2NvdW50LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFjY291bnQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhY2NvdW50LGFwcGxpY2F0aW9uLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KGFjY291bnQsYXBwbGljYXRpb24sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhY2NvdW50LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFjY291bnQsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFjY291bnQsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFjY291bnQsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9ieXRlc19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfZXhfdWludDY0X3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leGlzdHNfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X3VpbnQ2NF9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9wdXRfYnl0ZXNfcm91dGVAMTAKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ09wdEluJ10gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X3VpbnQ2NF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZGVsZXRlX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9kZWxldGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leGlzdHNfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4aXN0cwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3B1dF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9wdXRfYnl0ZXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X2J5dGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNy00MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydPcHRJbiddIH0pCiAgICAvLyBvcHRfaW4oKSB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHRoaXMubG9jYWxCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gQnl0ZXMoJ2R1bW15X2J5dGVzJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gbG9jYWxCeXRlcyA9IExvY2FsU3RhdGU8Ynl0ZXM+KHsga2V5OiAnbG9jYWxfYnl0ZXMnIH0pCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgImR1bW15X2J5dGVzIiAvLyAibG9jYWxfYnl0ZXMiLCAiZHVtbXlfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyB0aGlzLmxvY2FsQnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IEJ5dGVzKCdkdW1teV9ieXRlcycpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIwCiAgICAvLyB0aGlzLmxvY2FsVWludDY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBVaW50NjQoOTk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyBsb2NhbFVpbnQ2NCA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ2xvY2FsX3VpbnQ2NCcgfSkKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5OSkKICAgIHB1c2hpbnQgOTk5IC8vIDk5OQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyMy00MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyB2ZXJpZnlfZ2V0X2J5dGVzKGE6IEFjY291bnQsIGI6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBjb25zdCB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldEJ5dGVzKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI5LTQzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfdWludDY0KGE6IEFjY291bnQsIGI6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gY29uc3QgdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRVaW50NjQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXMoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfZ2V0X2V4X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNS00MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyB2ZXJpZnlfZ2V0X2V4X2J5dGVzKGE6IEFjY291bnQsIGI6IEFwcGxpY2F0aW9uLCBjOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gY29uc3QgW3ZhbHVlLCBfdmFsXSA9IG9wLkFwcExvY2FsLmdldEV4Qnl0ZXMoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDEtNDQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF9leF91aW50NjQoYTogQWNjb3VudCwgYjogQXBwbGljYXRpb24sIGM6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gY29uc3QgW3ZhbHVlLCBfdmFsXSA9IG9wLkFwcExvY2FsLmdldEV4VWludDY0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2RlbGV0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQ3LTQ0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9kZWxldGUoYTogQWNjb3VudCwgYjogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gb3AuQXBwTG9jYWwuZGVsZXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2RlbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2V4aXN0cyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTItNDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2V4aXN0cyhhOiBBY2NvdW50LCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBjb25zdCBbX3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwTG9jYWwuZ2V0RXhVaW50NjQoYSwgMCwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU4LTQ1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfdWludDY0KGE6IEFjY291bnQsIGI6IGJ5dGVzLCBjOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2MAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzLTQ2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfYnl0ZXMoYTogQWNjb3VudCwgYjogYnl0ZXMsIGM6IGJ5dGVzKTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIG9wLkFwcExvY2FsLnB1dChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { "global": { @@ -67,11 +67,11 @@ }, "local": { "declared": { - "local_bytes": { + "localBytes": { "type": "bytes", "key": "local_bytes" }, - "local_uint64": { + "localUint64": { "type": "uint64", "key": "local_uint64" } diff --git a/tests/artifacts/state-ops/data/StateAppLocalContract.arc56.json b/tests/artifacts/state-ops/data/StateAppLocalContract.arc56.json new file mode 100644 index 0000000..2b5b6a5 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAppLocalContract.arc56.json @@ -0,0 +1,338 @@ +{ + "name": "StateAppLocalContract", + "structs": {}, + "methods": [ + { + "name": "opt_in", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_bytes", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_uint64", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_ex_bytes", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "application", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_get_ex_uint64", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "application", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_delete", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_exists", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_put_uint64", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_put_bytes", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "byte[]", + "name": "c" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 1, + "bytes": 1 + } + }, + "keys": { + "global": {}, + "local": { + "localUint64": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bG9jYWxfdWludDY0" + }, + "localBytes": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bG9jYWxfYnl0ZXM=" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 112, + 148, + 177, + 219, + 254, + 278, + 313, + 341 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 100 + ], + "errorMessage": "OnCompletion is not OptIn" + }, + { + "pc": [ + 376 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 103, + 115, + 151, + 180, + 222, + 257, + 281, + 316, + 344 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbENvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMwogICAgcHVzaGJ5dGVzcyAweDMwYzZkNThhIDB4OTM3YjVlMTMgMHg4ZDc0MmI4NiAweDdhNmQwYjU5IDB4NTk0ZmYxZDkgMHg5NWEzMTcyNyAweGFhMWY0NzkyIDB4NDYyNDUyODcgMHg3ZjBmZGZkZCAvLyBtZXRob2QgIm9wdF9pbigpdm9pZCIsIG1ldGhvZCAidmVyaWZ5X2dldF9ieXRlcyhhY2NvdW50LGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfdWludDY0KGFjY291bnQsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2dldF9leF9ieXRlcyhhY2NvdW50LGFwcGxpY2F0aW9uLGJ5dGVbXSlieXRlW10iLCBtZXRob2QgInZlcmlmeV9nZXRfZXhfdWludDY0KGFjY291bnQsYXBwbGljYXRpb24sYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2RlbGV0ZShhY2NvdW50LGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfZXhpc3RzKGFjY291bnQsYnl0ZVtdKWJvb2wiLCBtZXRob2QgInZlcmlmeV9wdXRfdWludDY0KGFjY291bnQsYnl0ZVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlfcHV0X2J5dGVzKGFjY291bnQsYnl0ZVtdLGJ5dGVbXSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9ieXRlc19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfdWludDY0X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9nZXRfZXhfdWludDY0X3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2RlbGV0ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leGlzdHNfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcHV0X3VpbnQ2NF9yb3V0ZUA5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9wdXRfYnl0ZXNfcm91dGVAMTAKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ09wdEluJ10gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBPcHRJbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2J5dGVzX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X3VpbnQ2NF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfZ2V0X3VpbnQ2NAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2dldF9leF9ieXRlc19yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfYnl0ZXMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZ2V0X2V4X3VpbnQ2NF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9nZXRfZXhfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfZGVsZXRlX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9kZWxldGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9leGlzdHNfcm91dGVAODoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2V4aXN0cwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3B1dF91aW50NjRfcm91dGVAOToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcExvY2FsQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X3B1dF91aW50NjQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9wdXRfYnl0ZXNfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfcHV0X2J5dGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBMb2NhbENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3Qub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNy00MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydPcHRJbiddIH0pCiAgICAvLyBvcHRfaW4oKSB7CiAgICBwcm90byAwIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MTkKICAgIC8vIHRoaXMubG9jYWxCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gQnl0ZXMoJ2R1bW15X2J5dGVzJykKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gbG9jYWxCeXRlcyA9IExvY2FsU3RhdGU8Ynl0ZXM+KHsga2V5OiAnbG9jYWxfYnl0ZXMnIH0pCiAgICBwdXNoYnl0ZXNzICJsb2NhbF9ieXRlcyIgImR1bW15X2J5dGVzIiAvLyAibG9jYWxfYnl0ZXMiLCAiZHVtbXlfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyB0aGlzLmxvY2FsQnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IEJ5dGVzKCdkdW1teV9ieXRlcycpCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDIwCiAgICAvLyB0aGlzLmxvY2FsVWludDY0KEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBVaW50NjQoOTk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyBsb2NhbFVpbnQ2NCA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ2xvY2FsX3VpbnQ2NCcgfSkKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5OSkKICAgIHB1c2hpbnQgOTk5IC8vIDk5OQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2dldF9ieXRlcyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfZ2V0X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyMy00MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyB2ZXJpZnlfZ2V0X2J5dGVzKGE6IEFjY291bnQsIGI6IGJ5dGVzKTogYnl0ZXMgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBjb25zdCB2YWx1ZSA9IG9wLkFwcExvY2FsLmdldEJ5dGVzKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2dldAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2dldF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDI5LTQzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9nZXRfdWludDY0KGE6IEFjY291bnQsIGI6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gY29uc3QgdmFsdWUgPSBvcC5BcHBMb2NhbC5nZXRVaW50NjQoYSwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbENvbnRyYWN0LnZlcmlmeV9nZXRfZXhfYnl0ZXMoYTogYnl0ZXMsIGI6IHVpbnQ2NCwgYzogYnl0ZXMpIC0+IGJ5dGVzOgp2ZXJpZnlfZ2V0X2V4X2J5dGVzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNS00MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyB2ZXJpZnlfZ2V0X2V4X2J5dGVzKGE6IEFjY291bnQsIGI6IEFwcGxpY2F0aW9uLCBjOiBieXRlcyk6IGJ5dGVzIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzNwogICAgLy8gY29uc3QgW3ZhbHVlLCBfdmFsXSA9IG9wLkFwcExvY2FsLmdldEV4Qnl0ZXMoYSwgYiwgYykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfZ2V0X2V4X3VpbnQ2NChhOiBieXRlcywgYjogdWludDY0LCBjOiBieXRlcykgLT4gdWludDY0Ogp2ZXJpZnlfZ2V0X2V4X3VpbnQ2NDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDEtNDQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2dldF9leF91aW50NjQoYTogQWNjb3VudCwgYjogQXBwbGljYXRpb24sIGM6IGJ5dGVzKTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gY29uc3QgW3ZhbHVlLCBfdmFsXSA9IG9wLkFwcExvY2FsLmdldEV4VWludDY0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2RlbGV0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9kZWxldGU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDQ3LTQ0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9kZWxldGUoYTogQWNjb3VudCwgYjogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gb3AuQXBwTG9jYWwuZGVsZXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2RlbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsQ29udHJhY3QudmVyaWZ5X2V4aXN0cyhhOiBieXRlcywgYjogYnl0ZXMpIC0+IHVpbnQ2NDoKdmVyaWZ5X2V4aXN0czoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NTItNDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gdmVyaWZ5X2V4aXN0cyhhOiBBY2NvdW50LCBiOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU0CiAgICAvLyBjb25zdCBbX3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwTG9jYWwuZ2V0RXhVaW50NjQoYSwgMCwgYikKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfcHV0X3VpbnQ2NChhOiBieXRlcywgYjogYnl0ZXMsIGM6IHVpbnQ2NCkgLT4gdm9pZDoKdmVyaWZ5X3B1dF91aW50NjQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDU4LTQ1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfdWludDY0KGE6IEFjY291bnQsIGI6IGJ5dGVzLCBjOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDMgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQ2MAogICAgLy8gb3AuQXBwTG9jYWwucHV0KGEsIGIsIGMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC52ZXJpZnlfcHV0X2J5dGVzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeV9wdXRfYnl0ZXM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDYzLTQ2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHZlcmlmeV9wdXRfYnl0ZXMoYTogQWNjb3VudCwgYjogYnl0ZXMsIGM6IGJ5dGVzKTogdm9pZCB7CiAgICBwcm90byAzIDAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIG9wLkFwcExvY2FsLnB1dChhLCBiLCBjKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAppLocalContract.clear.teal b/tests/artifacts/state-ops/data/StateAppLocalContract.clear.teal index 573a8b4..fb6bff4 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAppLocalContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppLocalContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:349 - // class StateAppLocalContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAppLocalContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAppLocalExContract.approval.teal b/tests/artifacts/state-ops/data/StateAppLocalExContract.approval.teal index bd92746..013cc9f 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalExContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAppLocalExContract.approval.teal @@ -1,77 +1,87 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppLocalExContract.approval_program: - // tests/artifacts/StateOps/contract.py:323 - // class StateAppLocalExContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAppLocalExContract.approvalProgram: + intcblock 1 0 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalExContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:400 + // export class StateAppLocalExContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@5 - method "opt_in()void" + bz __puya_arc4_router___bare_routing@5 + pushbytes 0x30c6d58a // method "opt_in()void" txna ApplicationArgs 0 - match main_opt_in_route@2 - err // reject transaction + match __puya_arc4_router___opt_in_route@2 + intc_1 // 0 + retsub -main_opt_in_route@2: - // tests/artifacts/StateOps/contract.py:340 - // @arc4.abimethod(allow_actions=["OptIn"]) +__puya_arc4_router___opt_in_route@2: + // tests/artifacts/state-ops/contract.algo.ts:405 + // @arc4.abimethod({ allowActions: ['OptIn'] }) txn OnCompletion - int OptIn + intc_0 // OptIn == - assert // OnCompletion is OptIn + assert // OnCompletion is not OptIn txn ApplicationID - assert // is not creating + assert // can only call when not creating callsub opt_in - int 1 - return + intc_0 // 1 + retsub -main_bare_routing@5: - // tests/artifacts/StateOps/contract.py:323 - // class StateAppLocalExContract(ARC4Contract): +__puya_arc4_router___bare_routing@5: + // tests/artifacts/state-ops/contract.algo.ts:400 + // export class StateAppLocalExContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@9 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@9: + // tests/artifacts/state-ops/contract.algo.ts:400 + // export class StateAppLocalExContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAppLocalExContract.opt_in() -> void: +// tests/artifacts/state-ops/contract.algo.ts::StateAppLocalExContract.opt_in() -> void: opt_in: - // tests/artifacts/StateOps/contract.py:340-341 - // @arc4.abimethod(allow_actions=["OptIn"]) - // def opt_in(self) -> None: + // tests/artifacts/state-ops/contract.algo.ts:405-406 + // @arc4.abimethod({ allowActions: ['OptIn'] }) + // opt_in(): void { proto 0 0 - // tests/artifacts/StateOps/contract.py:342 - // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes_from_external_contract") + // tests/artifacts/state-ops/contract.algo.ts:407 + // this.localBytes(Global.creatorAddress).value = Bytes('dummy_bytes_from_external_contract') global CreatorAddress - // tests/artifacts/StateOps/contract.py:332 - // key="local_bytes", - byte "local_bytes" - // tests/artifacts/StateOps/contract.py:342 - // self.local_bytes[Global.creator_address] = Bytes(b"dummy_bytes_from_external_contract") - byte 0x64756d6d795f62797465735f66726f6d5f65787465726e616c5f636f6e7472616374 + // tests/artifacts/state-ops/contract.algo.ts:402 + // localBytes = LocalState({ key: 'local_bytes' }) + pushbytess "local_bytes" "dummy_bytes_from_external_contract" // "local_bytes", "dummy_bytes_from_external_contract" + // tests/artifacts/state-ops/contract.algo.ts:407 + // this.localBytes(Global.creatorAddress).value = Bytes('dummy_bytes_from_external_contract') app_local_put - // tests/artifacts/StateOps/contract.py:343 - // self.local_uint64[Global.creator_address] = UInt64(99) + // tests/artifacts/state-ops/contract.algo.ts:408 + // this.localUint64(Global.creatorAddress).value = Uint64(99) global CreatorAddress - // tests/artifacts/StateOps/contract.py:327 - // key="local_uint64", - byte "local_uint64" - // tests/artifacts/StateOps/contract.py:343 - // self.local_uint64[Global.creator_address] = UInt64(99) - int 99 + // tests/artifacts/state-ops/contract.algo.ts:401 + // localUint64 = LocalState({ key: 'local_uint64' }) + pushbytes "local_uint64" + // tests/artifacts/state-ops/contract.algo.ts:408 + // this.localUint64(Global.creatorAddress).value = Uint64(99) + pushint 99 // 99 app_local_put - // tests/artifacts/StateOps/contract.py:344 - // self.local_arc4_bytes[Global.creator_address] = algopy.arc4.DynamicBytes( + // tests/artifacts/state-ops/contract.algo.ts:409 + // this.localArc4Bytes(Global.creatorAddress).value = new DynamicBytes('dummy_arc4_bytes') global CreatorAddress - // tests/artifacts/StateOps/contract.py:337 - // key="local_arc4_bytes", - byte "local_arc4_bytes" - // tests/artifacts/StateOps/contract.py:344-346 - // self.local_arc4_bytes[Global.creator_address] = algopy.arc4.DynamicBytes( - // b"dummy_arc4_bytes" - // ) - byte 0x001064756d6d795f617263345f6279746573 + // tests/artifacts/state-ops/contract.algo.ts:403 + // localArc4Bytes = LocalState({ key: 'local_arc4_bytes' }) + pushbytess "local_arc4_bytes" 0x001064756d6d795f617263345f6279746573 // "local_arc4_bytes", 0x001064756d6d795f617263345f6279746573 + // tests/artifacts/state-ops/contract.algo.ts:409 + // this.localArc4Bytes(Global.creatorAddress).value = new DynamicBytes('dummy_arc4_bytes') app_local_put retsub diff --git a/tests/artifacts/state-ops/data/StateAppLocalExContract.arc32.json b/tests/artifacts/state-ops/data/StateAppLocalExContract.arc32.json index dc09a19..84e8dfe 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalExContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAppLocalExContract.arc32.json @@ -7,8 +7,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANQogICAgbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX29wdF9pbl9yb3V0ZUAyCiAgICBlcnIgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCgptYWluX29wdF9pbl9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50IE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gY2xhc3MgU3RhdGVBcHBMb2NhbEV4Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyByZWplY3QgdHJhbnNhY3Rpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3Qub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MC0zNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIC8vIGRlZiBvcHRfaW4oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MgogICAgLy8gc2VsZi5sb2NhbF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IEJ5dGVzKGIiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzIKICAgIC8vIGtleT0ibG9jYWxfYnl0ZXMiLAogICAgYnl0ZSAibG9jYWxfYnl0ZXMiCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQyCiAgICAvLyBzZWxmLmxvY2FsX2J5dGVzW0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gQnl0ZXMoYiJkdW1teV9ieXRlc19mcm9tX2V4dGVybmFsX2NvbnRyYWN0IikKICAgIGJ5dGUgMHg2NDc1NmQ2ZDc5NWY2Mjc5NzQ2NTczNWY2NjcyNmY2ZDVmNjU3ODc0NjU3MjZlNjE2YzVmNjM2ZjZlNzQ3MjYxNjM3NAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gc2VsZi5sb2NhbF91aW50NjRbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBVSW50NjQoOTkpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjcKICAgIC8vIGtleT0ibG9jYWxfdWludDY0IiwKICAgIGJ5dGUgImxvY2FsX3VpbnQ2NCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozNDMKICAgIC8vIHNlbGYubG9jYWxfdWludDY0W0dsb2JhbC5jcmVhdG9yX2FkZHJlc3NdID0gVUludDY0KDk5KQogICAgaW50IDk5CiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzQ0CiAgICAvLyBzZWxmLmxvY2FsX2FyYzRfYnl0ZXNbR2xvYmFsLmNyZWF0b3JfYWRkcmVzc10gPSBhbGdvcHkuYXJjNC5EeW5hbWljQnl0ZXMoCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMzcKICAgIC8vIGtleT0ibG9jYWxfYXJjNF9ieXRlcyIsCiAgICBieXRlICJsb2NhbF9hcmM0X2J5dGVzIgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjM0NC0zNDYKICAgIC8vIHNlbGYubG9jYWxfYXJjNF9ieXRlc1tHbG9iYWwuY3JlYXRvcl9hZGRyZXNzXSA9IGFsZ29weS5hcmM0LkR5bmFtaWNCeXRlcygKICAgIC8vICAgICBiImR1bW15X2FyYzRfYnl0ZXMiCiAgICAvLyApCiAgICBieXRlIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBMb2NhbEV4Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjMKICAgIC8vIGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnQgMQogICAgcmV0dXJuCg==" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxFeENvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbEV4Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5fcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBvcHRfaW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsRXhDb250cmFjdC5vcHRfaW4oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDA1LTQwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ09wdEluJ10gfSkKICAgIC8vIG9wdF9pbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gdGhpcy5sb2NhbEJ5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBCeXRlcygnZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGxvY2FsQnl0ZXMgPSBMb2NhbFN0YXRlPGJ5dGVzPih7IGtleTogJ2xvY2FsX2J5dGVzJyB9KQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiICJkdW1teV9ieXRlc19mcm9tX2V4dGVybmFsX2NvbnRyYWN0IiAvLyAibG9jYWxfYnl0ZXMiLCAiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDcKICAgIC8vIHRoaXMubG9jYWxCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gQnl0ZXMoJ2R1bW15X2J5dGVzX2Zyb21fZXh0ZXJuYWxfY29udHJhY3QnKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBsb2NhbFVpbnQ2NCA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ2xvY2FsX3VpbnQ2NCcgfSkKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5KQogICAgcHVzaGludCA5OSAvLyA5OQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gdGhpcy5sb2NhbEFyYzRCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IER5bmFtaWNCeXRlcygnZHVtbXlfYXJjNF9ieXRlcycpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDMKICAgIC8vIGxvY2FsQXJjNEJ5dGVzID0gTG9jYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAnbG9jYWxfYXJjNF9ieXRlcycgfSkKICAgIHB1c2hieXRlc3MgImxvY2FsX2FyYzRfYnl0ZXMiIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczIC8vICJsb2NhbF9hcmM0X2J5dGVzIiwgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIHRoaXMubG9jYWxBcmM0Qnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBEeW5hbWljQnl0ZXMoJ2R1bW15X2FyYzRfYnl0ZXMnKQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxFeENvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" }, "state": { "global": { @@ -27,15 +27,15 @@ }, "local": { "declared": { - "local_arc4_bytes": { + "localArc4Bytes": { "type": "bytes", "key": "local_arc4_bytes" }, - "local_bytes": { + "localBytes": { "type": "bytes", "key": "local_bytes" }, - "local_uint64": { + "localUint64": { "type": "uint64", "key": "local_uint64" } diff --git a/tests/artifacts/state-ops/data/StateAppLocalExContract.arc56.json b/tests/artifacts/state-ops/data/StateAppLocalExContract.arc56.json new file mode 100644 index 0000000..81312e3 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAppLocalExContract.arc56.json @@ -0,0 +1,106 @@ +{ + "name": "StateAppLocalExContract", + "structs": {}, + "methods": [ + { + "name": "opt_in", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 1, + "bytes": 2 + } + }, + "keys": { + "global": {}, + "local": { + "localUint64": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bG9jYWxfdWludDY0" + }, + "localBytes": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bG9jYWxfYnl0ZXM=" + }, + "localArc4Bytes": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "bG9jYWxfYXJjNF9ieXRlcw==" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 36 + ], + "errorMessage": "OnCompletion is not OptIn" + }, + { + "pc": [ + 53 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 39 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxFeENvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBMb2NhbEV4Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4MzBjNmQ1OGEgLy8gbWV0aG9kICJvcHRfaW4oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5fcm91dGVAMgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2luX3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDA1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnT3B0SW4nXSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgT3B0SW4KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBvcHRfaW4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwTG9jYWxFeENvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcExvY2FsRXhDb250cmFjdC5vcHRfaW4oKSAtPiB2b2lkOgpvcHRfaW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDA1LTQwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ09wdEluJ10gfSkKICAgIC8vIG9wdF9pbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gdGhpcy5sb2NhbEJ5dGVzKEdsb2JhbC5jcmVhdG9yQWRkcmVzcykudmFsdWUgPSBCeXRlcygnZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCcpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGxvY2FsQnl0ZXMgPSBMb2NhbFN0YXRlPGJ5dGVzPih7IGtleTogJ2xvY2FsX2J5dGVzJyB9KQogICAgcHVzaGJ5dGVzcyAibG9jYWxfYnl0ZXMiICJkdW1teV9ieXRlc19mcm9tX2V4dGVybmFsX2NvbnRyYWN0IiAvLyAibG9jYWxfYnl0ZXMiLCAiZHVtbXlfYnl0ZXNfZnJvbV9leHRlcm5hbF9jb250cmFjdCIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDcKICAgIC8vIHRoaXMubG9jYWxCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gQnl0ZXMoJ2R1bW15X2J5dGVzX2Zyb21fZXh0ZXJuYWxfY29udHJhY3QnKQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5KQogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBsb2NhbFVpbnQ2NCA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ2xvY2FsX3VpbnQ2NCcgfSkKICAgIHB1c2hieXRlcyAibG9jYWxfdWludDY0IgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gdGhpcy5sb2NhbFVpbnQ2NChHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gVWludDY0KDk5KQogICAgcHVzaGludCA5OSAvLyA5OQogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gdGhpcy5sb2NhbEFyYzRCeXRlcyhHbG9iYWwuY3JlYXRvckFkZHJlc3MpLnZhbHVlID0gbmV3IER5bmFtaWNCeXRlcygnZHVtbXlfYXJjNF9ieXRlcycpCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDMKICAgIC8vIGxvY2FsQXJjNEJ5dGVzID0gTG9jYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAnbG9jYWxfYXJjNF9ieXRlcycgfSkKICAgIHB1c2hieXRlc3MgImxvY2FsX2FyYzRfYnl0ZXMiIDB4MDAxMDY0NzU2ZDZkNzk1ZjYxNzI2MzM0NWY2Mjc5NzQ2NTczIC8vICJsb2NhbF9hcmM0X2J5dGVzIiwgMHgwMDEwNjQ3NTZkNmQ3OTVmNjE3MjYzMzQ1ZjYyNzk3NDY1NzMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIHRoaXMubG9jYWxBcmM0Qnl0ZXMoR2xvYmFsLmNyZWF0b3JBZGRyZXNzKS52YWx1ZSA9IG5ldyBEeW5hbWljQnl0ZXMoJ2R1bW15X2FyYzRfYnl0ZXMnKQogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwTG9jYWxFeENvbnRyYWN0LmNsZWFyU3RhdGVQcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAppLocalExContract.clear.teal b/tests/artifacts/state-ops/data/StateAppLocalExContract.clear.teal index c4080e2..aec0884 100644 --- a/tests/artifacts/state-ops/data/StateAppLocalExContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAppLocalExContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppLocalExContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:323 - // class StateAppLocalExContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAppLocalExContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAppParamsContract.approval.teal b/tests/artifacts/state-ops/data/StateAppParamsContract.approval.teal index d7d91f2..4f346cc 100644 --- a/tests/artifacts/state-ops/data/StateAppParamsContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAppParamsContract.approval.teal @@ -1,37 +1,39 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppParamsContract.approval_program: - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@13 - method "verify_app_params_get_approval_program(application)byte[]" - method "verify_app_params_get_clear_state_program(application)byte[]" - method "verify_app_params_get_global_num_uint(application)uint64" - method "verify_app_params_get_global_num_byte_slice(application)uint64" - method "verify_app_params_get_local_num_uint(application)uint64" - method "verify_app_params_get_local_num_byte_slice(application)uint64" - method "verify_app_params_get_extra_program_pages(application)uint64" - method "verify_app_params_get_creator(application)address" - method "verify_app_params_get_address(application)address" + bz __puya_arc4_router___bare_routing@13 + pushbytess 0x5e7b7d52 0xe29e30ee 0x58819099 0xca77b59b 0x53c0dd9b 0x5f000703 0xd77bd21f 0xa941a746 0xbd3e9eec // method "verify_app_params_get_approval_program(application)byte[]", method "verify_app_params_get_clear_state_program(application)byte[]", method "verify_app_params_get_global_num_uint(application)uint64", method "verify_app_params_get_global_num_byte_slice(application)uint64", method "verify_app_params_get_local_num_uint(application)uint64", method "verify_app_params_get_local_num_byte_slice(application)uint64", method "verify_app_params_get_extra_program_pages(application)uint64", method "verify_app_params_get_creator(application)address", method "verify_app_params_get_address(application)address" txna ApplicationArgs 0 - match main_verify_app_params_get_approval_program_route@2 main_verify_app_params_get_clear_state_program_route@3 main_verify_app_params_get_global_num_uint_route@4 main_verify_app_params_get_global_num_byte_slice_route@5 main_verify_app_params_get_local_num_uint_route@6 main_verify_app_params_get_local_num_byte_slice_route@7 main_verify_app_params_get_extra_program_pages_route@8 main_verify_app_params_get_creator_route@9 main_verify_app_params_get_address_route@10 - err // reject transaction + match __puya_arc4_router___verify_app_params_get_approval_program_route@2 __puya_arc4_router___verify_app_params_get_clear_state_program_route@3 __puya_arc4_router___verify_app_params_get_global_num_uint_route@4 __puya_arc4_router___verify_app_params_get_global_num_byte_slice_route@5 __puya_arc4_router___verify_app_params_get_local_num_uint_route@6 __puya_arc4_router___verify_app_params_get_local_num_byte_slice_route@7 __puya_arc4_router___verify_app_params_get_extra_program_pages_route@8 __puya_arc4_router___verify_app_params_get_creator_route@9 __puya_arc4_router___verify_app_params_get_address_route@10 + intc_1 // 0 + retsub -main_verify_app_params_get_approval_program_route@2: - // tests/artifacts/StateOps/contract.py:250 +__puya_arc4_router___verify_app_params_get_approval_program_route@2: + // tests/artifacts/state-ops/contract.algo.ts:267 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:250 + // tests/artifacts/state-ops/contract.algo.ts:267 // @arc4.abimethod() callsub verify_app_params_get_approval_program dup @@ -40,27 +42,27 @@ main_verify_app_params_get_approval_program_route@2: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_clear_state_program_route@3: - // tests/artifacts/StateOps/contract.py:258 +__puya_arc4_router___verify_app_params_get_clear_state_program_route@3: + // tests/artifacts/state-ops/contract.algo.ts:276 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:258 + // tests/artifacts/state-ops/contract.algo.ts:276 // @arc4.abimethod() callsub verify_app_params_get_clear_state_program dup @@ -69,479 +71,466 @@ main_verify_app_params_get_clear_state_program_route@3: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_global_num_uint_route@4: - // tests/artifacts/StateOps/contract.py:266 +__puya_arc4_router___verify_app_params_get_global_num_uint_route@4: + // tests/artifacts/state-ops/contract.algo.ts:285 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:266 + // tests/artifacts/state-ops/contract.algo.ts:285 // @arc4.abimethod() callsub verify_app_params_get_global_num_uint itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_global_num_byte_slice_route@5: - // tests/artifacts/StateOps/contract.py:274 +__puya_arc4_router___verify_app_params_get_global_num_byte_slice_route@5: + // tests/artifacts/state-ops/contract.algo.ts:294 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:274 + // tests/artifacts/state-ops/contract.algo.ts:294 // @arc4.abimethod() callsub verify_app_params_get_global_num_byte_slice itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_local_num_uint_route@6: - // tests/artifacts/StateOps/contract.py:282 +__puya_arc4_router___verify_app_params_get_local_num_uint_route@6: + // tests/artifacts/state-ops/contract.algo.ts:303 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:282 + // tests/artifacts/state-ops/contract.algo.ts:303 // @arc4.abimethod() callsub verify_app_params_get_local_num_uint itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_local_num_byte_slice_route@7: - // tests/artifacts/StateOps/contract.py:290 +__puya_arc4_router___verify_app_params_get_local_num_byte_slice_route@7: + // tests/artifacts/state-ops/contract.algo.ts:312 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:290 + // tests/artifacts/state-ops/contract.algo.ts:312 // @arc4.abimethod() callsub verify_app_params_get_local_num_byte_slice itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_extra_program_pages_route@8: - // tests/artifacts/StateOps/contract.py:298 +__puya_arc4_router___verify_app_params_get_extra_program_pages_route@8: + // tests/artifacts/state-ops/contract.algo.ts:321 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:298 + // tests/artifacts/state-ops/contract.algo.ts:321 // @arc4.abimethod() callsub verify_app_params_get_extra_program_pages itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_creator_route@9: - // tests/artifacts/StateOps/contract.py:306 +__puya_arc4_router___verify_app_params_get_creator_route@9: + // tests/artifacts/state-ops/contract.algo.ts:330 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:306 + // tests/artifacts/state-ops/contract.algo.ts:330 // @arc4.abimethod() callsub verify_app_params_get_creator - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_app_params_get_address_route@10: - // tests/artifacts/StateOps/contract.py:314 +__puya_arc4_router___verify_app_params_get_address_route@10: + // tests/artifacts/state-ops/contract.algo.ts:339 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Applications - // tests/artifacts/StateOps/contract.py:314 + // tests/artifacts/state-ops/contract.algo.ts:339 // @arc4.abimethod() callsub verify_app_params_get_address - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_bare_routing@13: - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): +__puya_arc4_router___bare_routing@13: + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@17 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub +__puya_arc4_router___after_if_else@17: + // tests/artifacts/state-ops/contract.algo.ts:266 + // export class StateAppParamsContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_approval_program(a: uint64) -> bytes: + +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_approval_program(a: uint64) -> bytes: verify_app_params_get_approval_program: - // tests/artifacts/StateOps/contract.py:250-251 + // tests/artifacts/state-ops/contract.algo.ts:267-268 // @arc4.abimethod() - // def verify_app_params_get_approval_program(self, a: Application) -> Bytes: + // public verify_app_params_get_approval_program(a: Application): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:252 - // value, exists = op.AppParamsGet.app_approval_program(a) + // tests/artifacts/state-ops/contract.algo.ts:269 + // const [value, exists] = op.AppParams.appApprovalProgram(a) frame_dig -1 app_params_get AppApprovalProgram - swap - // tests/artifacts/StateOps/contract.py:253 - // value_index, exists_index = op.AppParamsGet.app_approval_program(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:270 + // const [value_index, exists_index] = op.AppParams.appApprovalProgram(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppApprovalProgram - cover 2 - // tests/artifacts/StateOps/contract.py:254 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:271 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:255 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:272 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:256 + // tests/artifacts/state-ops/contract.algo.ts:273 // return value retsub -// tests.artifacts.StateOps.contract._get_1st_ref_index() -> uint64: -_get_1st_ref_index: - // tests/artifacts/StateOps/contract.py:19-20 - // @subroutine - // def _get_1st_ref_index() -> UInt64: +// tests/artifacts/state-ops/contract.algo.ts::get_1st_ref_index() -> uint64: +get_1st_ref_index: + // tests/artifacts/state-ops/contract.algo.ts:22 + // function get_1st_ref_index(): uint64 { proto 0 1 - // tests/artifacts/StateOps/contract.py:21 - // return op.btoi(Txn.application_args(1)) - txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:23 + // return op.btoi(Txn.applicationArgs(1)) + intc_0 // 1 + txnas ApplicationArgs btoi retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_clear_state_program(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_clear_state_program(a: uint64) -> bytes: verify_app_params_get_clear_state_program: - // tests/artifacts/StateOps/contract.py:258-259 + // tests/artifacts/state-ops/contract.algo.ts:276-277 // @arc4.abimethod() - // def verify_app_params_get_clear_state_program(self, a: Application) -> Bytes: + // public verify_app_params_get_clear_state_program(a: Application): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:260 - // value, exists = op.AppParamsGet.app_clear_state_program(a) + // tests/artifacts/state-ops/contract.algo.ts:278 + // const [value, exists] = op.AppParams.appClearStateProgram(a) frame_dig -1 app_params_get AppClearStateProgram - swap - // tests/artifacts/StateOps/contract.py:261 - // value_index, exists_index = op.AppParamsGet.app_clear_state_program(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:279 + // const [value_index, exists_index] = op.AppParams.appClearStateProgram(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppClearStateProgram - cover 2 - // tests/artifacts/StateOps/contract.py:262 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:280 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:263 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:281 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:264 + // tests/artifacts/state-ops/contract.algo.ts:282 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_global_num_uint(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_global_num_uint(a: uint64) -> uint64: verify_app_params_get_global_num_uint: - // tests/artifacts/StateOps/contract.py:266-267 + // tests/artifacts/state-ops/contract.algo.ts:285-286 // @arc4.abimethod() - // def verify_app_params_get_global_num_uint(self, a: Application) -> UInt64: + // public verify_app_params_get_global_num_uint(a: Application): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:268 - // value, exists = op.AppParamsGet.app_global_num_uint(a) + // tests/artifacts/state-ops/contract.algo.ts:287 + // const [value, exists] = op.AppParams.appGlobalNumUint(a) frame_dig -1 app_params_get AppGlobalNumUint - swap - // tests/artifacts/StateOps/contract.py:269 - // value_index, exists_index = op.AppParamsGet.app_global_num_uint(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:288 + // const [value_index, exists_index] = op.AppParams.appGlobalNumUint(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppGlobalNumUint - cover 2 - // tests/artifacts/StateOps/contract.py:270 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:289 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:271 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:290 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:272 + // tests/artifacts/state-ops/contract.algo.ts:291 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_global_num_byte_slice(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_global_num_byte_slice(a: uint64) -> uint64: verify_app_params_get_global_num_byte_slice: - // tests/artifacts/StateOps/contract.py:274-275 + // tests/artifacts/state-ops/contract.algo.ts:294-295 // @arc4.abimethod() - // def verify_app_params_get_global_num_byte_slice(self, a: Application) -> UInt64: + // public verify_app_params_get_global_num_byte_slice(a: Application): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:276 - // value, exists = op.AppParamsGet.app_global_num_byte_slice(a) + // tests/artifacts/state-ops/contract.algo.ts:296 + // const [value, exists] = op.AppParams.appGlobalNumByteSlice(a) frame_dig -1 app_params_get AppGlobalNumByteSlice - swap - // tests/artifacts/StateOps/contract.py:277 - // value_index, exists_index = op.AppParamsGet.app_global_num_byte_slice(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:297 + // const [value_index, exists_index] = op.AppParams.appGlobalNumByteSlice(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppGlobalNumByteSlice - cover 2 - // tests/artifacts/StateOps/contract.py:278 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:298 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:279 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:299 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:280 + // tests/artifacts/state-ops/contract.algo.ts:300 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_local_num_uint(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_local_num_uint(a: uint64) -> uint64: verify_app_params_get_local_num_uint: - // tests/artifacts/StateOps/contract.py:282-283 + // tests/artifacts/state-ops/contract.algo.ts:303-304 // @arc4.abimethod() - // def verify_app_params_get_local_num_uint(self, a: Application) -> UInt64: + // public verify_app_params_get_local_num_uint(a: Application): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:284 - // value, exists = op.AppParamsGet.app_local_num_uint(a) + // tests/artifacts/state-ops/contract.algo.ts:305 + // const [value, exists] = op.AppParams.appLocalNumUint(a) frame_dig -1 app_params_get AppLocalNumUint - swap - // tests/artifacts/StateOps/contract.py:285 - // value_index, exists_index = op.AppParamsGet.app_local_num_uint(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:306 + // const [value_index, exists_index] = op.AppParams.appLocalNumUint(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppLocalNumUint - cover 2 - // tests/artifacts/StateOps/contract.py:286 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:307 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:287 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:308 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:288 + // tests/artifacts/state-ops/contract.algo.ts:309 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_local_num_byte_slice(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_local_num_byte_slice(a: uint64) -> uint64: verify_app_params_get_local_num_byte_slice: - // tests/artifacts/StateOps/contract.py:290-291 + // tests/artifacts/state-ops/contract.algo.ts:312-313 // @arc4.abimethod() - // def verify_app_params_get_local_num_byte_slice(self, a: Application) -> UInt64: + // public verify_app_params_get_local_num_byte_slice(a: Application): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:292 - // value, exists = op.AppParamsGet.app_local_num_byte_slice(a) + // tests/artifacts/state-ops/contract.algo.ts:314 + // const [value, exists] = op.AppParams.appLocalNumByteSlice(a) frame_dig -1 app_params_get AppLocalNumByteSlice - swap - // tests/artifacts/StateOps/contract.py:293 - // value_index, exists_index = op.AppParamsGet.app_local_num_byte_slice(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:315 + // const [value_index, exists_index] = op.AppParams.appLocalNumByteSlice(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppLocalNumByteSlice - cover 2 - // tests/artifacts/StateOps/contract.py:294 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:316 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:295 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:317 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:296 + // tests/artifacts/state-ops/contract.algo.ts:318 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_extra_program_pages(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_extra_program_pages(a: uint64) -> uint64: verify_app_params_get_extra_program_pages: - // tests/artifacts/StateOps/contract.py:298-299 + // tests/artifacts/state-ops/contract.algo.ts:321-322 // @arc4.abimethod() - // def verify_app_params_get_extra_program_pages(self, a: Application) -> UInt64: + // public verify_app_params_get_extra_program_pages(a: Application): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:300 - // value, exists = op.AppParamsGet.app_extra_program_pages(a) + // tests/artifacts/state-ops/contract.algo.ts:323 + // const [value, exists] = op.AppParams.appExtraProgramPages(a) frame_dig -1 app_params_get AppExtraProgramPages - swap - // tests/artifacts/StateOps/contract.py:301 - // value_index, exists_index = op.AppParamsGet.app_extra_program_pages(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:324 + // const [value_index, exists_index] = op.AppParams.appExtraProgramPages(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppExtraProgramPages - cover 2 - // tests/artifacts/StateOps/contract.py:302 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:325 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:303 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:326 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:304 + // tests/artifacts/state-ops/contract.algo.ts:327 // return value retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_creator(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_creator(a: uint64) -> bytes: verify_app_params_get_creator: - // tests/artifacts/StateOps/contract.py:306-307 + // tests/artifacts/state-ops/contract.algo.ts:330-331 // @arc4.abimethod() - // def verify_app_params_get_creator(self, a: Application) -> arc4.Address: + // public verify_app_params_get_creator(a: Application): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:308 - // value, exists = op.AppParamsGet.app_creator(a) + // tests/artifacts/state-ops/contract.algo.ts:332 + // const [value, exists] = op.AppParams.appCreator(a) frame_dig -1 app_params_get AppCreator - swap - // tests/artifacts/StateOps/contract.py:309 - // value_index, exists_index = op.AppParamsGet.app_creator(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:333 + // const [value_index, exists_index] = op.AppParams.appCreator(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppCreator - cover 2 - // tests/artifacts/StateOps/contract.py:310 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:334 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:311 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:335 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:312 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:336 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAppParamsContract.verify_app_params_get_address(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.verify_app_params_get_address(a: uint64) -> bytes: verify_app_params_get_address: - // tests/artifacts/StateOps/contract.py:314-315 + // tests/artifacts/state-ops/contract.algo.ts:339-340 // @arc4.abimethod() - // def verify_app_params_get_address(self, a: Application) -> arc4.Address: + // public verify_app_params_get_address(a: Application): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:316 - // value, exists = op.AppParamsGet.app_address(a) + // tests/artifacts/state-ops/contract.algo.ts:341 + // const [value, exists] = op.AppParams.appAddress(a) frame_dig -1 app_params_get AppAddress - swap - // tests/artifacts/StateOps/contract.py:317 - // value_index, exists_index = op.AppParamsGet.app_address(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:342 + // const [value_index, exists_index] = op.AppParams.appAddress(get_1st_ref_index()) + callsub get_1st_ref_index app_params_get AppAddress - cover 2 - // tests/artifacts/StateOps/contract.py:318 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:343 + // assert(value.bytes.toString() === value_index.bytes.toString(), 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:319 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:344 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:320 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:345 + // return new Address(value) retsub diff --git a/tests/artifacts/state-ops/data/StateAppParamsContract.arc32.json b/tests/artifacts/state-ops/data/StateAppParamsContract.arc32.json index 76ab2a1..79db0e7 100644 --- a/tests/artifacts/state-ops/data/StateAppParamsContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAppParamsContract.arc32.json @@ -47,8 +47,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEzCiAgICBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKGFwcGxpY2F0aW9uKWJ5dGVbXSIKICAgIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW0oYXBwbGljYXRpb24pYnl0ZVtdIgogICAgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KGFwcGxpY2F0aW9uKXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludChhcHBsaWNhdGlvbil1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKGFwcGxpY2F0aW9uKXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYXBwbGljYXRpb24pYWRkcmVzcyIKICAgIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3MoYXBwbGljYXRpb24pYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW1fcm91dGVAMiBtYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtX3JvdXRlQDMgbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50X3JvdXRlQDQgbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlX3JvdXRlQDUgbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnRfcm91dGVANiBtYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3IG1haW5fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXNfcm91dGVAOCBtYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yX3JvdXRlQDkgbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc19yb3V0ZUAxMAogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDgKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW0KICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDgKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludAogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDgKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50CiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDgKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlcwogICAgaXRvYgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcl9yb3V0ZUA5OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDgKICAgIC8vIGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3Nfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQ4CiAgICAvLyBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW0oYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUwLTI1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYXBwcm92YWxfcHJvZ3JhbShzZWxmLCBhOiBBcHBsaWNhdGlvbikgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNTIKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2FwcHJvdmFsX3Byb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQXBwcm92YWxQcm9ncmFtCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjUzCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hcHByb3ZhbF9wcm9ncmFtKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFwcHJvdmFsUHJvZ3JhbQogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuX2dldF8xc3RfcmVmX2luZGV4KCkgLT4gdWludDY0OgpfZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2dldF8xc3RfcmVmX2luZGV4KCkgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEKICAgIC8vIHJldHVybiBvcC5idG9pKFR4bi5hcHBsaWNhdGlvbl9hcmdzKDEpKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW0oYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbShzZWxmLCBhOiBBcHBsaWNhdGlvbikgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjAKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjEKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NsZWFyX3N0YXRlX3Byb2dyYW0oX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjMKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludChhOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjYtMjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQoc2VsZiwgYTogQXBwbGljYXRpb24pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfZ2xvYmFsX251bV91aW50KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNjkKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1VaW50CiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcwCiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcxCiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjcyCiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjc0LTI3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlKHNlbGYsIGE6IEFwcGxpY2F0aW9uKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzYKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fYnl0ZV9zbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzcKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2dsb2JhbF9udW1fYnl0ZV9zbGljZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNzkKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjgyLTI4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQoc2VsZiwgYTogQXBwbGljYXRpb24pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI4NAogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX3VpbnQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjg1CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9sb2NhbF9udW1fdWludChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bVVpbnQKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODYKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODcKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyODgKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2Uoc2VsZiwgYTogQXBwbGljYXRpb24pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfbG9jYWxfbnVtX2J5dGVfc2xpY2UoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1CeXRlU2xpY2UKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTMKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2xvY2FsX251bV9ieXRlX3NsaWNlKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtQnl0ZVNsaWNlCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk1CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6Mjk2CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyOTgtMjk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKHNlbGYsIGE6IEFwcGxpY2F0aW9uKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDAKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDEKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2V4dHJhX3Byb2dyYW1fcGFnZXMoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDIKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDMKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDQKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3I6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA2LTMwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcihzZWxmLCBhOiBBcHBsaWNhdGlvbikgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzA4CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9jcmVhdG9yKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMDkKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5BcHBQYXJhbXNHZXQuYXBwX2NyZWF0b3IoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNC0zMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3Moc2VsZiwgYTogQXBwbGljYXRpb24pIC0+IGFyYzQuQWRkcmVzczoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjMxNgogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFwcFBhcmFtc0dldC5hcHBfYWRkcmVzcyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MzE3CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXBwUGFyYW1zR2V0LmFwcF9hZGRyZXNzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTgKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMTkKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weTozMjAKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBcHBQYXJhbXNDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMwogICAgcHVzaGJ5dGVzcyAweDVlN2I3ZDUyIDB4ZTI5ZTMwZWUgMHg1ODgxOTA5OSAweGNhNzdiNTliIDB4NTNjMGRkOWIgMHg1ZjAwMDcwMyAweGQ3N2JkMjFmIDB4YTk0MWE3NDYgMHhiZDNlOWVlYyAvLyBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKGFwcGxpY2F0aW9uKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW0oYXBwbGljYXRpb24pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KGFwcGxpY2F0aW9uKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludChhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKGFwcGxpY2F0aW9uKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYXBwbGljYXRpb24pYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3MoYXBwbGljYXRpb24pYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1fcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc19yb3V0ZUAxMAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW1fcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc19yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3Nfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE3CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2Ny0yNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW0oYTogQXBwbGljYXRpb24pOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBBcHByb3ZhbFByb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5BcHBQYXJhbXMuYXBwQXBwcm92YWxQcm9ncmFtKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbShhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYtMjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGE6IEFwcGxpY2F0aW9uKTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjc4CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwQ2xlYXJTdGF0ZVByb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBDbGVhclN0YXRlUHJvZ3JhbShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODIKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjg1LTI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KGE6IEFwcGxpY2F0aW9uKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bVVpbnQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bVVpbnQoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjk0LTI5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGE6IEFwcGxpY2F0aW9uKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBHbG9iYWxOdW1CeXRlU2xpY2UoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzLTMwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQoYTogQXBwbGljYXRpb24pOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwTG9jYWxOdW1VaW50KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcExvY2FsTnVtVWludChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2UoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTItMzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZShhOiBBcHBsaWNhdGlvbik6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBMb2NhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcExvY2FsTnVtQnl0ZVNsaWNlKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTcKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMS0zMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMoYTogQXBwbGljYXRpb24pOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwRXh0cmFQcm9ncmFtUGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBFeHRyYVByb2dyYW1QYWdlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjUKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMC0zMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogQXBwbGljYXRpb24pOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcENyZWF0b3IoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcENyZWF0b3IoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcyhhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzktMzQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzKGE6IEFwcGxpY2F0aW9uKTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBBZGRyZXNzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBBZGRyZXNzKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhc3NlcnQodmFsdWUuYnl0ZXMudG9TdHJpbmcoKSA9PT0gdmFsdWVfaW5kZXguYnl0ZXMudG9TdHJpbmcoKSwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gcmV0dXJuIG5ldyBBZGRyZXNzKHZhbHVlKQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { "global": { diff --git a/tests/artifacts/state-ops/data/StateAppParamsContract.arc56.json b/tests/artifacts/state-ops/data/StateAppParamsContract.arc56.json new file mode 100644 index 0000000..83355d7 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAppParamsContract.arc56.json @@ -0,0 +1,307 @@ +{ + "name": "StateAppParamsContract", + "structs": {}, + "methods": [ + { + "name": "verify_app_params_get_approval_program", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_clear_state_program", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_global_num_uint", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_global_num_byte_slice", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_local_num_uint", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_local_num_byte_slice", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_extra_program_pages", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_creator", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_app_params_get_address", + "args": [ + { + "type": "application", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 99, + 129, + 159, + 182, + 205, + 228, + 251, + 274, + 296 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 323 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 102, + 132, + 162, + 185, + 208, + 231, + 254, + 277, + 299 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 347, + 376, + 397, + 418, + 439, + 460, + 481, + 502, + 523 + ], + "errorMessage": "expected exists by index to match" + }, + { + "pc": [ + 345, + 374, + 395, + 416, + 437, + 458, + 479, + 500, + 521 + ], + "errorMessage": "expected value by index to match" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMwogICAgcHVzaGJ5dGVzcyAweDVlN2I3ZDUyIDB4ZTI5ZTMwZWUgMHg1ODgxOTA5OSAweGNhNzdiNTliIDB4NTNjMGRkOWIgMHg1ZjAwMDcwMyAweGQ3N2JkMjFmIDB4YTk0MWE3NDYgMHhiZDNlOWVlYyAvLyBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKGFwcGxpY2F0aW9uKWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW0oYXBwbGljYXRpb24pYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KGFwcGxpY2F0aW9uKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludChhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZShhcHBsaWNhdGlvbil1aW50NjQiLCBtZXRob2QgInZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzKGFwcGxpY2F0aW9uKXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYXBwbGljYXRpb24pYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3MoYXBwbGljYXRpb24pYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1fcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fdWludF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3Jfcm91dGVAOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzc19yb3V0ZUAxMAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW1fcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NsZWFyX3N0YXRlX3Byb2dyYW1fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludF9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fdWludAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2dsb2JhbF9udW1fYnl0ZV9zbGljZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZV9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV9ieXRlX3NsaWNlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXBwX3BhcmFtc19nZXRfZXh0cmFfcHJvZ3JhbV9wYWdlc19yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY3JlYXRvcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FkZHJlc3Nfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjY2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBcHBQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXBwUGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE3CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2Ny0yNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2FwcHJvdmFsX3Byb2dyYW0oYTogQXBwbGljYXRpb24pOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNjkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBBcHByb3ZhbFByb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQXBwcm92YWxQcm9ncmFtCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5BcHBQYXJhbXMuYXBwQXBwcm92YWxQcm9ncmFtKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBcHByb3ZhbFByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbShhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzYtMjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9jbGVhcl9zdGF0ZV9wcm9ncmFtKGE6IEFwcGxpY2F0aW9uKTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjc4CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwQ2xlYXJTdGF0ZVByb2dyYW0oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNzkKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBDbGVhclN0YXRlUHJvZ3JhbShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwQ2xlYXJTdGF0ZVByb2dyYW0KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjgxCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODIKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjg1LTI4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV91aW50KGE6IEFwcGxpY2F0aW9uKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bVVpbnQoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwR2xvYmFsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI4OAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bVVpbnQoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bVVpbnQKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyODkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjkwCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2UoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9nbG9iYWxfbnVtX2J5dGVfc2xpY2U6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6Mjk0LTI5NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfZ2xvYmFsX251bV9ieXRlX3NsaWNlKGE6IEFwcGxpY2F0aW9uKTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcEdsb2JhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBHbG9iYWxOdW1CeXRlU2xpY2UoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2xvY2FsX251bV91aW50KGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzAzLTMwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX3VpbnQoYTogQXBwbGljYXRpb24pOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwTG9jYWxOdW1VaW50KGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcExvY2FsTnVtVWludAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcExvY2FsTnVtVWludChnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwTG9jYWxOdW1VaW50CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMwOAogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfbG9jYWxfbnVtX2J5dGVfc2xpY2UoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTItMzEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9sb2NhbF9udW1fYnl0ZV9zbGljZShhOiBBcHBsaWNhdGlvbik6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBMb2NhbE51bUJ5dGVTbGljZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcExvY2FsTnVtQnl0ZVNsaWNlKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxNgogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMTcKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QudmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9leHRyYV9wcm9ncmFtX3BhZ2VzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMyMS0zMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2V4dHJhX3Byb2dyYW1fcGFnZXMoYTogQXBwbGljYXRpb24pOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5BcHBQYXJhbXMuYXBwRXh0cmFQcm9ncmFtUGFnZXMoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBFeHRyYVByb2dyYW1QYWdlcyhnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXBwX3BhcmFtc19nZXQgQXBwRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjUKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFwcFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hcHBfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMC0zMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2FwcF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogQXBwbGljYXRpb24pOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXBwUGFyYW1zLmFwcENyZWF0b3IoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXBwUGFyYW1zLmFwcENyZWF0b3IoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzM1CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBcHBQYXJhbXNDb250cmFjdC52ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzcyhhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXBwX3BhcmFtc19nZXRfYWRkcmVzczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozMzktMzQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hcHBfcGFyYW1zX2dldF9hZGRyZXNzKGE6IEFwcGxpY2F0aW9uKTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFwcFBhcmFtcy5hcHBBZGRyZXNzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDIKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFwcFBhcmFtcy5hcHBBZGRyZXNzKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyBhc3NlcnQodmFsdWUuYnl0ZXMudG9TdHJpbmcoKSA9PT0gdmFsdWVfaW5kZXguYnl0ZXMudG9TdHJpbmcoKSwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjM0NQogICAgLy8gcmV0dXJuIG5ldyBBZGRyZXNzKHZhbHVlKQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXBwUGFyYW1zQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAppParamsContract.clear.teal b/tests/artifacts/state-ops/data/StateAppParamsContract.clear.teal index d499707..99ff46e 100644 --- a/tests/artifacts/state-ops/data/StateAppParamsContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAppParamsContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAppParamsContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:248 - // class StateAppParamsContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAppParamsContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAssetHoldingContract.approval.teal b/tests/artifacts/state-ops/data/StateAssetHoldingContract.approval.teal index 6b077bd..a214d29 100644 --- a/tests/artifacts/state-ops/data/StateAssetHoldingContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAssetHoldingContract.approval.teal @@ -1,115 +1,129 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAssetHoldingContract.approval_program: - // tests/artifacts/StateOps/contract.py:138 - // class StateAssetHoldingContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAssetHoldingContract.approvalProgram: + intcblock 0 1 + bytecblock 0x151f7c75 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAssetHoldingContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:142 + // export class StateAssetHoldingContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@6 - method "verify_asset_holding_get(account,asset)uint64" - method "verify_asset_frozen_get(account,asset)bool" + bz __puya_arc4_router___bare_routing@6 + pushbytess 0x68301476 0x784c64eb // method "verify_asset_holding_get(account,asset)uint64", method "verify_asset_frozen_get(account,asset)bool" txna ApplicationArgs 0 - match main_verify_asset_holding_get_route@2 main_verify_asset_frozen_get_route@3 - err // reject transaction + match __puya_arc4_router___verify_asset_holding_get_route@2 __puya_arc4_router___verify_asset_frozen_get_route@3 + intc_0 // 0 + retsub -main_verify_asset_holding_get_route@2: - // tests/artifacts/StateOps/contract.py:139 +__puya_arc4_router___verify_asset_holding_get_route@2: + // tests/artifacts/state-ops/contract.algo.ts:143 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:138 - // class StateAssetHoldingContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:142 + // export class StateAssetHoldingContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:139 + // tests/artifacts/state-ops/contract.algo.ts:143 // @arc4.abimethod() callsub verify_asset_holding_get itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_1 // 1 + retsub -main_verify_asset_frozen_get_route@3: - // tests/artifacts/StateOps/contract.py:144 +__puya_arc4_router___verify_asset_frozen_get_route@3: + // tests/artifacts/state-ops/contract.algo.ts:149 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:138 - // class StateAssetHoldingContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:142 + // export class StateAssetHoldingContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Accounts txna ApplicationArgs 2 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:144 + // tests/artifacts/state-ops/contract.algo.ts:149 // @arc4.abimethod() callsub verify_asset_frozen_get - byte 0x00 - int 0 + pushbytes 0x00 + intc_0 // 0 uncover 2 setbit - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_1 // 1 + retsub -main_bare_routing@6: - // tests/artifacts/StateOps/contract.py:138 - // class StateAssetHoldingContract(ARC4Contract): +__puya_arc4_router___bare_routing@6: + // tests/artifacts/state-ops/contract.algo.ts:142 + // export class StateAssetHoldingContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@10 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_1 // 1 + retsub + +__puya_arc4_router___after_if_else@10: + // tests/artifacts/state-ops/contract.algo.ts:142 + // export class StateAssetHoldingContract extends arc4.Contract { + intc_0 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAssetHoldingContract.verify_asset_holding_get(a: bytes, b: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetHoldingContract.verify_asset_holding_get(a: bytes, b: uint64) -> uint64: verify_asset_holding_get: - // tests/artifacts/StateOps/contract.py:139-140 + // tests/artifacts/state-ops/contract.algo.ts:143-144 // @arc4.abimethod() - // def verify_asset_holding_get(self, a: Account, b: Asset) -> UInt64: + // public verify_asset_holding_get(a: Account, b: Asset): uint64 { proto 2 1 - // tests/artifacts/StateOps/contract.py:141 - // balance, _val = op.AssetHoldingGet.asset_balance(a, b) + // tests/artifacts/state-ops/contract.algo.ts:145 + // const [balance, _val] = op.AssetHolding.assetBalance(a, b) frame_dig -2 frame_dig -1 asset_holding_get AssetBalance pop - // tests/artifacts/StateOps/contract.py:142 + // tests/artifacts/state-ops/contract.algo.ts:146 // return balance retsub -// tests.artifacts.StateOps.contract.StateAssetHoldingContract.verify_asset_frozen_get(a: bytes, b: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetHoldingContract.verify_asset_frozen_get(a: bytes, b: uint64) -> uint64: verify_asset_frozen_get: - // tests/artifacts/StateOps/contract.py:144-145 + // tests/artifacts/state-ops/contract.algo.ts:149-150 // @arc4.abimethod() - // def verify_asset_frozen_get(self, a: Account, b: Asset) -> bool: + // public verify_asset_frozen_get(a: Account, b: Asset): boolean { proto 2 1 - // tests/artifacts/StateOps/contract.py:146 - // frozen, _val = op.AssetHoldingGet.asset_frozen(a, b) + // tests/artifacts/state-ops/contract.algo.ts:151 + // const [frozen, _val] = op.AssetHolding.assetFrozen(a, b) frame_dig -2 frame_dig -1 asset_holding_get AssetFrozen pop - // tests/artifacts/StateOps/contract.py:147 + // tests/artifacts/state-ops/contract.algo.ts:152 // return frozen retsub diff --git a/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc32.json b/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc32.json index a7b0497..2eee37c 100644 --- a/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc32.json @@ -12,8 +12,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDYKICAgIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KGFjY291bnQsYXNzZXQpdWludDY0IgogICAgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfZnJvemVuX2dldChhY2NvdW50LGFzc2V0KWJvb2wiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3ZlcmlmeV9hc3NldF9ob2xkaW5nX2dldF9yb3V0ZUAyIG1haW5fdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRfcm91dGVAMwogICAgZXJyIC8vIHJlamVjdCB0cmFuc2FjdGlvbgoKbWFpbl92ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXRfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM4CiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM4CiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfZnJvemVuX2dldAogICAgYnl0ZSAweDAwCiAgICBpbnQgMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTM4CiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gcmVqZWN0IHRyYW5zYWN0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KGE6IGJ5dGVzLCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzOS0xNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0KHNlbGYsIGE6IEFjY291bnQsIGI6IEFzc2V0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDEKICAgIC8vIGJhbGFuY2UsIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfYmFsYW5jZShhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQyCiAgICAvLyByZXR1cm4gYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNDQtMTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KHNlbGYsIGE6IEFjY291bnQsIGI6IEFzc2V0KSAtPiBib29sOgogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTQ2CiAgICAvLyBmcm96ZW4sIF92YWwgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfZnJvemVuKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gcmV0dXJuIGZyb3plbgogICAgcmV0c3ViCg==", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50IDEKICAgIHJldHVybgo=" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2CiAgICBwdXNoYnl0ZXNzIDB4NjgzMDE0NzYgMHg3ODRjNjRlYiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhY2NvdW50LGFzc2V0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYWNjb3VudCxhc3NldClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQyCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfZnJvemVuX2dldF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDIKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQyCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQzLTE0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQoYTogQWNjb3VudCwgYjogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBjb25zdCBbYmFsYW5jZSwgX3ZhbF0gPSBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDktMTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGE6IEFjY291bnQsIGI6IEFzc2V0KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IFtmcm96ZW4sIF92YWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0RnJvemVuKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gcmV0dXJuIGZyb3plbgogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { "global": { diff --git a/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc56.json b/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc56.json new file mode 100644 index 0000000..6aff1c8 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAssetHoldingContract.arc56.json @@ -0,0 +1,126 @@ +{ + "name": "StateAssetHoldingContract", + "structs": {}, + "methods": [ + { + "name": "verify_asset_holding_get", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "asset", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_frozen_get", + "args": [ + { + "type": "account", + "name": "a" + }, + { + "type": "asset", + "name": "b" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 79 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 119 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 53, + 82 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuYXBwcm92YWxQcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2CiAgICBwdXNoYnl0ZXNzIDB4NjgzMDE0NzYgMHg3ODRjNjRlYiAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9ob2xkaW5nX2dldChhY2NvdW50LGFzc2V0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYWNjb3VudCxhc3NldClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0X3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXRfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0X3JvdXRlQDI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQyCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X2hvbGRpbmdfZ2V0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfZnJvemVuX2dldF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE0MgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDIKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0SG9sZGluZ0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQyCiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldEhvbGRpbmdDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldEhvbGRpbmdDb250cmFjdC52ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQ6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQzLTE0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfaG9sZGluZ19nZXQoYTogQWNjb3VudCwgYjogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTQ1CiAgICAvLyBjb25zdCBbYmFsYW5jZSwgX3ZhbF0gPSBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIHJldHVybiBiYWxhbmNlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QudmVyaWZ5X2Fzc2V0X2Zyb3plbl9nZXQoYTogYnl0ZXMsIGI6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfZnJvemVuX2dldDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNDktMTUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9mcm96ZW5fZ2V0KGE6IEFjY291bnQsIGI6IEFzc2V0KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTEKICAgIC8vIGNvbnN0IFtmcm96ZW4sIF92YWxdID0gb3AuQXNzZXRIb2xkaW5nLmFzc2V0RnJvemVuKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRGcm96ZW4KICAgIHBvcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gcmV0dXJuIGZyb3plbgogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRIb2xkaW5nQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAssetHoldingContract.clear.teal b/tests/artifacts/state-ops/data/StateAssetHoldingContract.clear.teal index ec6efc8..7168de9 100644 --- a/tests/artifacts/state-ops/data/StateAssetHoldingContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAssetHoldingContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAssetHoldingContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:138 - // class StateAssetHoldingContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAssetHoldingContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/artifacts/state-ops/data/StateAssetParamsContract.approval.teal b/tests/artifacts/state-ops/data/StateAssetParamsContract.approval.teal index b0cda94..1bbcffd 100644 --- a/tests/artifacts/state-ops/data/StateAssetParamsContract.approval.teal +++ b/tests/artifacts/state-ops/data/StateAssetParamsContract.approval.teal @@ -1,115 +1,114 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAssetParamsContract.approval_program: - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): +tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.approvalProgram: + intcblock 1 0 + bytecblock 0x151f7c75 + callsub __puya_arc4_router__ + return + + +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.__puya_arc4_router__() -> uint64: +__puya_arc4_router__: + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { + proto 0 1 txn NumAppArgs - bz main_bare_routing@16 - method "verify_asset_params_get_total(asset)uint64" - method "verify_asset_params_get_decimals(asset)uint64" - method "verify_asset_params_get_default_frozen(asset)bool" - method "verify_asset_params_get_unit_name(asset)byte[]" - method "verify_asset_params_get_name(asset)byte[]" - method "verify_asset_params_get_url(asset)byte[]" - method "verify_asset_params_get_metadata_hash(asset)byte[]" - method "verify_asset_params_get_manager(asset)address" - method "verify_asset_params_get_reserve(asset)address" - method "verify_asset_params_get_freeze(asset)address" - method "verify_asset_params_get_clawback(asset)address" - method "verify_asset_params_get_creator(asset)address" + bz __puya_arc4_router___bare_routing@16 + pushbytess 0xad719a6f 0x1d603013 0x9fb731cd 0x0f5a4911 0xf5b370c6 0xc7d6af74 0x6b71a263 0x3040ebc8 0x1d07e844 0x3e40cb50 0x340c786b 0xe38a9815 // method "verify_asset_params_get_total(asset)uint64", method "verify_asset_params_get_decimals(asset)uint64", method "verify_asset_params_get_default_frozen(asset)bool", method "verify_asset_params_get_unit_name(asset)byte[]", method "verify_asset_params_get_name(asset)byte[]", method "verify_asset_params_get_url(asset)byte[]", method "verify_asset_params_get_metadata_hash(asset)byte[]", method "verify_asset_params_get_manager(asset)address", method "verify_asset_params_get_reserve(asset)address", method "verify_asset_params_get_freeze(asset)address", method "verify_asset_params_get_clawback(asset)address", method "verify_asset_params_get_creator(asset)address" txna ApplicationArgs 0 - match main_verify_asset_params_get_total_route@2 main_verify_asset_params_get_decimals_route@3 main_verify_asset_params_get_default_frozen_route@4 main_verify_asset_params_get_unit_name_route@5 main_verify_asset_params_get_name_route@6 main_verify_asset_params_get_url_route@7 main_verify_asset_params_get_metadata_hash_route@8 main_verify_asset_params_get_manager_route@9 main_verify_asset_params_get_reserve_route@10 main_verify_asset_params_get_freeze_route@11 main_verify_asset_params_get_clawback_route@12 main_verify_asset_params_get_creator_route@13 - err // reject transaction + match __puya_arc4_router___verify_asset_params_get_total_route@2 __puya_arc4_router___verify_asset_params_get_decimals_route@3 __puya_arc4_router___verify_asset_params_get_default_frozen_route@4 __puya_arc4_router___verify_asset_params_get_unit_name_route@5 __puya_arc4_router___verify_asset_params_get_name_route@6 __puya_arc4_router___verify_asset_params_get_url_route@7 __puya_arc4_router___verify_asset_params_get_metadata_hash_route@8 __puya_arc4_router___verify_asset_params_get_manager_route@9 __puya_arc4_router___verify_asset_params_get_reserve_route@10 __puya_arc4_router___verify_asset_params_get_freeze_route@11 __puya_arc4_router___verify_asset_params_get_clawback_route@12 __puya_arc4_router___verify_asset_params_get_creator_route@13 + intc_1 // 0 + retsub -main_verify_asset_params_get_total_route@2: - // tests/artifacts/StateOps/contract.py:151 +__puya_arc4_router___verify_asset_params_get_total_route@2: + // tests/artifacts/state-ops/contract.algo.ts:157 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:151 + // tests/artifacts/state-ops/contract.algo.ts:157 // @arc4.abimethod() callsub verify_asset_params_get_total itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_decimals_route@3: - // tests/artifacts/StateOps/contract.py:159 +__puya_arc4_router___verify_asset_params_get_decimals_route@3: + // tests/artifacts/state-ops/contract.algo.ts:166 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:159 + // tests/artifacts/state-ops/contract.algo.ts:166 // @arc4.abimethod() callsub verify_asset_params_get_decimals itob - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_default_frozen_route@4: - // tests/artifacts/StateOps/contract.py:167 +__puya_arc4_router___verify_asset_params_get_default_frozen_route@4: + // tests/artifacts/state-ops/contract.algo.ts:175 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:167 + // tests/artifacts/state-ops/contract.algo.ts:175 // @arc4.abimethod() callsub verify_asset_params_get_default_frozen - byte 0x00 - int 0 + pushbytes 0x00 + intc_1 // 0 uncover 2 setbit - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_unit_name_route@5: - // tests/artifacts/StateOps/contract.py:175 +__puya_arc4_router___verify_asset_params_get_unit_name_route@5: + // tests/artifacts/state-ops/contract.algo.ts:184 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:175 + // tests/artifacts/state-ops/contract.algo.ts:184 // @arc4.abimethod() callsub verify_asset_params_get_unit_name dup @@ -118,27 +117,27 @@ main_verify_asset_params_get_unit_name_route@5: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_name_route@6: - // tests/artifacts/StateOps/contract.py:183 +__puya_arc4_router___verify_asset_params_get_name_route@6: + // tests/artifacts/state-ops/contract.algo.ts:193 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:183 + // tests/artifacts/state-ops/contract.algo.ts:193 // @arc4.abimethod() callsub verify_asset_params_get_name dup @@ -147,27 +146,27 @@ main_verify_asset_params_get_name_route@6: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_url_route@7: - // tests/artifacts/StateOps/contract.py:191 +__puya_arc4_router___verify_asset_params_get_url_route@7: + // tests/artifacts/state-ops/contract.algo.ts:202 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:191 + // tests/artifacts/state-ops/contract.algo.ts:202 // @arc4.abimethod() callsub verify_asset_params_get_url dup @@ -176,27 +175,27 @@ main_verify_asset_params_get_url_route@7: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_metadata_hash_route@8: - // tests/artifacts/StateOps/contract.py:199 +__puya_arc4_router___verify_asset_params_get_metadata_hash_route@8: + // tests/artifacts/state-ops/contract.algo.ts:211 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:199 + // tests/artifacts/state-ops/contract.algo.ts:211 // @arc4.abimethod() callsub verify_asset_params_get_metadata_hash dup @@ -205,521 +204,502 @@ main_verify_asset_params_get_metadata_hash_route@8: extract 6 2 swap concat - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_manager_route@9: - // tests/artifacts/StateOps/contract.py:207 +__puya_arc4_router___verify_asset_params_get_manager_route@9: + // tests/artifacts/state-ops/contract.algo.ts:220 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:207 + // tests/artifacts/state-ops/contract.algo.ts:220 // @arc4.abimethod() callsub verify_asset_params_get_manager - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_reserve_route@10: - // tests/artifacts/StateOps/contract.py:215 +__puya_arc4_router___verify_asset_params_get_reserve_route@10: + // tests/artifacts/state-ops/contract.algo.ts:229 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:215 + // tests/artifacts/state-ops/contract.algo.ts:229 // @arc4.abimethod() callsub verify_asset_params_get_reserve - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_freeze_route@11: - // tests/artifacts/StateOps/contract.py:223 +__puya_arc4_router___verify_asset_params_get_freeze_route@11: + // tests/artifacts/state-ops/contract.algo.ts:238 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:223 + // tests/artifacts/state-ops/contract.algo.ts:238 // @arc4.abimethod() callsub verify_asset_params_get_freeze - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_clawback_route@12: - // tests/artifacts/StateOps/contract.py:231 +__puya_arc4_router___verify_asset_params_get_clawback_route@12: + // tests/artifacts/state-ops/contract.algo.ts:247 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:231 + // tests/artifacts/state-ops/contract.algo.ts:247 // @arc4.abimethod() callsub verify_asset_params_get_clawback - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_verify_asset_params_get_creator_route@13: - // tests/artifacts/StateOps/contract.py:239 +__puya_arc4_router___verify_asset_params_get_creator_route@13: + // tests/artifacts/state-ops/contract.algo.ts:256 // @arc4.abimethod() txn OnCompletion ! - assert // OnCompletion is NoOp + assert // OnCompletion is not NoOp txn ApplicationID - assert // is not creating - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): + assert // can only call when not creating + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txna ApplicationArgs 1 btoi txnas Assets - // tests/artifacts/StateOps/contract.py:239 + // tests/artifacts/state-ops/contract.algo.ts:256 // @arc4.abimethod() callsub verify_asset_params_get_creator - byte 0x151f7c75 + bytec_0 // 0x151f7c75 swap concat log - int 1 - return + intc_0 // 1 + retsub -main_bare_routing@16: - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): +__puya_arc4_router___bare_routing@16: + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { txn OnCompletion - ! - assert // reject transaction + bnz __puya_arc4_router___after_if_else@20 txn ApplicationID ! - assert // is creating - int 1 - return + assert // can only call when creating + intc_0 // 1 + retsub + +__puya_arc4_router___after_if_else@20: + // tests/artifacts/state-ops/contract.algo.ts:156 + // export class StateAssetParamsContract extends arc4.Contract { + intc_1 // 0 + retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_total(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_total(a: uint64) -> uint64: verify_asset_params_get_total: - // tests/artifacts/StateOps/contract.py:151-152 + // tests/artifacts/state-ops/contract.algo.ts:157-158 // @arc4.abimethod() - // def verify_asset_params_get_total(self, a: Asset) -> UInt64: + // public verify_asset_params_get_total(a: Asset): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:153 - // value, exists = op.AssetParamsGet.asset_total(a) + // tests/artifacts/state-ops/contract.algo.ts:159 + // const [value, exists] = op.AssetParams.assetTotal(a) frame_dig -1 asset_params_get AssetTotal - swap - // tests/artifacts/StateOps/contract.py:154 - // value_index, exists_index = op.AssetParamsGet.asset_total(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:160 + // const [value_index, exists_index] = op.AssetParams.assetTotal(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetTotal - cover 2 - // tests/artifacts/StateOps/contract.py:155 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:161 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:156 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:162 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:157 + // tests/artifacts/state-ops/contract.algo.ts:163 // return value retsub -// tests.artifacts.StateOps.contract._get_1st_ref_index() -> uint64: -_get_1st_ref_index: - // tests/artifacts/StateOps/contract.py:19-20 - // @subroutine - // def _get_1st_ref_index() -> UInt64: +// tests/artifacts/state-ops/contract.algo.ts::get_1st_ref_index() -> uint64: +get_1st_ref_index: + // tests/artifacts/state-ops/contract.algo.ts:22 + // function get_1st_ref_index(): uint64 { proto 0 1 - // tests/artifacts/StateOps/contract.py:21 - // return op.btoi(Txn.application_args(1)) - txna ApplicationArgs 1 + // tests/artifacts/state-ops/contract.algo.ts:23 + // return op.btoi(Txn.applicationArgs(1)) + intc_0 // 1 + txnas ApplicationArgs btoi retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_decimals(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_decimals(a: uint64) -> uint64: verify_asset_params_get_decimals: - // tests/artifacts/StateOps/contract.py:159-160 + // tests/artifacts/state-ops/contract.algo.ts:166-167 // @arc4.abimethod() - // def verify_asset_params_get_decimals(self, a: Asset) -> UInt64: + // public verify_asset_params_get_decimals(a: Asset): uint64 { proto 1 1 - // tests/artifacts/StateOps/contract.py:161 - // value, exists = op.AssetParamsGet.asset_decimals(a) + // tests/artifacts/state-ops/contract.algo.ts:168 + // const [value, exists] = op.AssetParams.assetDecimals(a) frame_dig -1 asset_params_get AssetDecimals - swap - // tests/artifacts/StateOps/contract.py:162 - // value_index, exists_index = op.AssetParamsGet.asset_decimals(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:169 + // const [value_index, exists_index] = op.AssetParams.assetDecimals(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetDecimals - cover 2 - // tests/artifacts/StateOps/contract.py:163 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:170 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:164 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:171 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:165 + // tests/artifacts/state-ops/contract.algo.ts:172 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_default_frozen(a: uint64) -> uint64: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_default_frozen(a: uint64) -> uint64: verify_asset_params_get_default_frozen: - // tests/artifacts/StateOps/contract.py:167-168 + // tests/artifacts/state-ops/contract.algo.ts:175-176 // @arc4.abimethod() - // def verify_asset_params_get_default_frozen(self, a: Asset) -> bool: + // public verify_asset_params_get_default_frozen(a: Asset): boolean { proto 1 1 - // tests/artifacts/StateOps/contract.py:169 - // value, exists = op.AssetParamsGet.asset_default_frozen(a) + // tests/artifacts/state-ops/contract.algo.ts:177 + // const [value, exists] = op.AssetParams.assetDefaultFrozen(a) frame_dig -1 asset_params_get AssetDefaultFrozen - swap - // tests/artifacts/StateOps/contract.py:170 - // value_index, exists_index = op.AssetParamsGet.asset_default_frozen(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:178 + // const [value_index, exists_index] = op.AssetParams.assetDefaultFrozen(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetDefaultFrozen - cover 2 - // tests/artifacts/StateOps/contract.py:171 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:179 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:172 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:180 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:173 + // tests/artifacts/state-ops/contract.algo.ts:181 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_unit_name(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_unit_name(a: uint64) -> bytes: verify_asset_params_get_unit_name: - // tests/artifacts/StateOps/contract.py:175-176 + // tests/artifacts/state-ops/contract.algo.ts:184-185 // @arc4.abimethod() - // def verify_asset_params_get_unit_name(self, a: Asset) -> Bytes: + // public verify_asset_params_get_unit_name(a: Asset): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:177 - // value, exists = op.AssetParamsGet.asset_unit_name(a) + // tests/artifacts/state-ops/contract.algo.ts:186 + // const [value, exists] = op.AssetParams.assetUnitName(a) frame_dig -1 asset_params_get AssetUnitName - swap - // tests/artifacts/StateOps/contract.py:178 - // value_index, exists_index = op.AssetParamsGet.asset_unit_name(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:187 + // const [value_index, exists_index] = op.AssetParams.assetUnitName(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetUnitName - cover 2 - // tests/artifacts/StateOps/contract.py:179 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:188 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:180 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:189 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:181 + // tests/artifacts/state-ops/contract.algo.ts:190 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_name(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_name(a: uint64) -> bytes: verify_asset_params_get_name: - // tests/artifacts/StateOps/contract.py:183-184 + // tests/artifacts/state-ops/contract.algo.ts:193-194 // @arc4.abimethod() - // def verify_asset_params_get_name(self, a: Asset) -> Bytes: + // public verify_asset_params_get_name(a: Asset): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:185 - // value, exists = op.AssetParamsGet.asset_name(a) + // tests/artifacts/state-ops/contract.algo.ts:195 + // const [value, exists] = op.AssetParams.assetName(a) frame_dig -1 asset_params_get AssetName - swap - // tests/artifacts/StateOps/contract.py:186 - // value_index, exists_index = op.AssetParamsGet.asset_name(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:196 + // const [value_index, exists_index] = op.AssetParams.assetName(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetName - cover 2 - // tests/artifacts/StateOps/contract.py:187 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:197 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:188 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:198 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:189 + // tests/artifacts/state-ops/contract.algo.ts:199 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_url(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_url(a: uint64) -> bytes: verify_asset_params_get_url: - // tests/artifacts/StateOps/contract.py:191-192 + // tests/artifacts/state-ops/contract.algo.ts:202-203 // @arc4.abimethod() - // def verify_asset_params_get_url(self, a: Asset) -> Bytes: + // public verify_asset_params_get_url(a: Asset): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:193 - // value, exists = op.AssetParamsGet.asset_url(a) + // tests/artifacts/state-ops/contract.algo.ts:204 + // const [value, exists] = op.AssetParams.assetUrl(a) frame_dig -1 asset_params_get AssetURL - swap - // tests/artifacts/StateOps/contract.py:194 - // value_index, exists_index = op.AssetParamsGet.asset_url(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:205 + // const [value_index, exists_index] = op.AssetParams.assetUrl(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetURL - cover 2 - // tests/artifacts/StateOps/contract.py:195 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:206 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:196 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:207 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:197 + // tests/artifacts/state-ops/contract.algo.ts:208 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_metadata_hash(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_metadata_hash(a: uint64) -> bytes: verify_asset_params_get_metadata_hash: - // tests/artifacts/StateOps/contract.py:199-200 + // tests/artifacts/state-ops/contract.algo.ts:211-212 // @arc4.abimethod() - // def verify_asset_params_get_metadata_hash(self, a: Asset) -> Bytes: + // public verify_asset_params_get_metadata_hash(a: Asset): bytes { proto 1 1 - // tests/artifacts/StateOps/contract.py:201 - // value, exists = op.AssetParamsGet.asset_metadata_hash(a) + // tests/artifacts/state-ops/contract.algo.ts:213 + // const [value, exists] = op.AssetParams.assetMetadataHash(a) frame_dig -1 asset_params_get AssetMetadataHash - swap - // tests/artifacts/StateOps/contract.py:202 - // value_index, exists_index = op.AssetParamsGet.asset_metadata_hash(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:214 + // const [value_index, exists_index] = op.AssetParams.assetMetadataHash(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetMetadataHash - cover 2 - // tests/artifacts/StateOps/contract.py:203 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:215 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:204 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:216 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:205 + // tests/artifacts/state-ops/contract.algo.ts:217 // return value retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_manager(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_manager(a: uint64) -> bytes: verify_asset_params_get_manager: - // tests/artifacts/StateOps/contract.py:207-208 + // tests/artifacts/state-ops/contract.algo.ts:220-221 // @arc4.abimethod() - // def verify_asset_params_get_manager(self, a: Asset) -> arc4.Address: + // public verify_asset_params_get_manager(a: Asset): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:209 - // value, exists = op.AssetParamsGet.asset_manager(a) + // tests/artifacts/state-ops/contract.algo.ts:222 + // const [value, exists] = op.AssetParams.assetManager(a) frame_dig -1 asset_params_get AssetManager - swap - // tests/artifacts/StateOps/contract.py:210 - // value_index, exists_index = op.AssetParamsGet.asset_manager(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:223 + // const [value_index, exists_index] = op.AssetParams.assetManager(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetManager - cover 2 - // tests/artifacts/StateOps/contract.py:211 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:224 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:212 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:225 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:213 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:226 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_reserve(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_reserve(a: uint64) -> bytes: verify_asset_params_get_reserve: - // tests/artifacts/StateOps/contract.py:215-216 + // tests/artifacts/state-ops/contract.algo.ts:229-230 // @arc4.abimethod() - // def verify_asset_params_get_reserve(self, a: Asset) -> arc4.Address: + // public verify_asset_params_get_reserve(a: Asset): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:217 - // value, exists = op.AssetParamsGet.asset_reserve(a) + // tests/artifacts/state-ops/contract.algo.ts:231 + // const [value, exists] = op.AssetParams.assetReserve(a) frame_dig -1 asset_params_get AssetReserve - swap - // tests/artifacts/StateOps/contract.py:218 - // value_index, exists_index = op.AssetParamsGet.asset_reserve(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:232 + // const [value_index, exists_index] = op.AssetParams.assetReserve(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetReserve - cover 2 - // tests/artifacts/StateOps/contract.py:219 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:233 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:220 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:234 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:221 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:235 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_freeze(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_freeze(a: uint64) -> bytes: verify_asset_params_get_freeze: - // tests/artifacts/StateOps/contract.py:223-224 + // tests/artifacts/state-ops/contract.algo.ts:238-239 // @arc4.abimethod() - // def verify_asset_params_get_freeze(self, a: Asset) -> arc4.Address: + // public verify_asset_params_get_freeze(a: Asset): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:225 - // value, exists = op.AssetParamsGet.asset_freeze(a) + // tests/artifacts/state-ops/contract.algo.ts:240 + // const [value, exists] = op.AssetParams.assetFreeze(a) frame_dig -1 asset_params_get AssetFreeze - swap - // tests/artifacts/StateOps/contract.py:226 - // value_index, exists_index = op.AssetParamsGet.asset_freeze(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:241 + // const [value_index, exists_index] = op.AssetParams.assetFreeze(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetFreeze - cover 2 - // tests/artifacts/StateOps/contract.py:227 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:242 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:228 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:243 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:229 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:244 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_clawback(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_clawback(a: uint64) -> bytes: verify_asset_params_get_clawback: - // tests/artifacts/StateOps/contract.py:231-232 + // tests/artifacts/state-ops/contract.algo.ts:247-248 // @arc4.abimethod() - // def verify_asset_params_get_clawback(self, a: Asset) -> arc4.Address: + // public verify_asset_params_get_clawback(a: Asset): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:233 - // value, exists = op.AssetParamsGet.asset_clawback(a) + // tests/artifacts/state-ops/contract.algo.ts:249 + // const [value, exists] = op.AssetParams.assetClawback(a) frame_dig -1 asset_params_get AssetClawback - swap - // tests/artifacts/StateOps/contract.py:234 - // value_index, exists_index = op.AssetParamsGet.asset_clawback(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:250 + // const [value_index, exists_index] = op.AssetParams.assetClawback(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetClawback - cover 2 - // tests/artifacts/StateOps/contract.py:235 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:251 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:236 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:252 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:237 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:253 + // return new Address(value) retsub -// tests.artifacts.StateOps.contract.StateAssetParamsContract.verify_asset_params_get_creator(a: uint64) -> bytes: +// tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.verify_asset_params_get_creator(a: uint64) -> bytes: verify_asset_params_get_creator: - // tests/artifacts/StateOps/contract.py:239-240 + // tests/artifacts/state-ops/contract.algo.ts:256-257 // @arc4.abimethod() - // def verify_asset_params_get_creator(self, a: Asset) -> arc4.Address: + // public verify_asset_params_get_creator(a: Asset): Address { proto 1 1 - // tests/artifacts/StateOps/contract.py:241 - // value, exists = op.AssetParamsGet.asset_creator(a) + // tests/artifacts/state-ops/contract.algo.ts:258 + // const [value, exists] = op.AssetParams.assetCreator(a) frame_dig -1 asset_params_get AssetCreator - swap - // tests/artifacts/StateOps/contract.py:242 - // value_index, exists_index = op.AssetParamsGet.asset_creator(_get_1st_ref_index()) - callsub _get_1st_ref_index + // tests/artifacts/state-ops/contract.algo.ts:259 + // const [value_index, exists_index] = op.AssetParams.assetCreator(get_1st_ref_index()) + callsub get_1st_ref_index asset_params_get AssetCreator - cover 2 - // tests/artifacts/StateOps/contract.py:243 - // assert value == value_index, "expected value by index to match" - dig 1 + // tests/artifacts/state-ops/contract.algo.ts:260 + // assert(value === value_index, 'expected value by index to match') + dig 3 + uncover 2 == assert // expected value by index to match - // tests/artifacts/StateOps/contract.py:244 - // assert exists == exists_index, "expected exists by index to match" - cover 2 + // tests/artifacts/state-ops/contract.algo.ts:261 + // assert(exists === exists_index, 'expected exists by index to match') == assert // expected exists by index to match - // tests/artifacts/StateOps/contract.py:245 - // return arc4.Address(value) + // tests/artifacts/state-ops/contract.algo.ts:262 + // return new Address(value) retsub diff --git a/tests/artifacts/state-ops/data/StateAssetParamsContract.arc32.json b/tests/artifacts/state-ops/data/StateAssetParamsContract.arc32.json index 04e164b..0d0d9d2 100644 --- a/tests/artifacts/state-ops/data/StateAssetParamsContract.arc32.json +++ b/tests/artifacts/state-ops/data/StateAssetParamsContract.arc32.json @@ -62,8 +62,8 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxNgogICAgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbChhc3NldCl1aW50NjQiCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKGFzc2V0KXVpbnQ2NCIKICAgIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4oYXNzZXQpYm9vbCIKICAgIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lKGFzc2V0KWJ5dGVbXSIKICAgIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZShhc3NldClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybChhc3NldClieXRlW10iCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2goYXNzZXQpYnl0ZVtdIgogICAgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKGFzc2V0KWFkZHJlc3MiCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUoYXNzZXQpYWRkcmVzcyIKICAgIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplKGFzc2V0KWFkZHJlc3MiCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKGFzc2V0KWFkZHJlc3MiCiAgICBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IoYXNzZXQpYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMiBtYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzX3JvdXRlQDMgbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbl9yb3V0ZUA0IG1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lX3JvdXRlQDUgbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lX3JvdXRlQDYgbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmxfcm91dGVANyBtYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2hfcm91dGVAOCBtYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXJfcm91dGVAOSBtYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmVfcm91dGVAMTAgbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVfcm91dGVAMTEgbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja19yb3V0ZUAxMiBtYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3Jfcm91dGVAMTMKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHNfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMKICAgIGl0b2IKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW5fcm91dGVANDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW4KICAgIGJ5dGUgMHgwMAogICAgaW50IDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTAKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsX3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaF9yb3V0ZUA4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTAKICAgIC8vIGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZV9yb3V0ZUAxMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZQogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVfcm91dGVAMTE6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZQogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl92ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja19yb3V0ZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sKICAgIGJ5dGUgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcl9yb3V0ZUAxMzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcgogICAgYnl0ZSAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50IDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyByZWplY3QgdHJhbnNhY3Rpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludCAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTEtMTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKHNlbGYsIGE6IEFzc2V0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTQKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF90b3RhbChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTUKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTYKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNTcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0Ll9nZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKX2dldF8xc3RfcmVmX2luZGV4OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9nZXRfMXN0X3JlZl9pbmRleCgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxCiAgICAvLyByZXR1cm4gb3AuYnRvaShUeG4uYXBwbGljYXRpb25fYXJncygxKSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMoYTogdWludDY0KSAtPiB1aW50NjQ6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE1OS0xNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMoc2VsZiwgYTogQXNzZXQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlY2ltYWxzKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2RlY2ltYWxzKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNjctMTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuKHNlbGYsIGE6IEFzc2V0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTY5CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzAKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWZhdWx0X2Zyb3plbihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVmYXVsdEZyb3plbgogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3MgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZShhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc1LTE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUoc2VsZiwgYTogQXNzZXQpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTc3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfdW5pdF9uYW1lKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VuaXRfbmFtZShfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxNzkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKHNlbGYsIGE6IEFzc2V0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X25hbWUoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxODYKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9uYW1lKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg4CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTg5CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybChzZWxmLCBhOiBBc3NldCkgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToxOTMKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF91cmwoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3VybChfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBjb3ZlciAyCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk1CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gdmFsdWVfaW5kZXgsICJleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk2CiAgICAvLyBhc3NlcnQgZXhpc3RzID09IGV4aXN0c19pbmRleCwgImV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCIKICAgIGNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTk3CiAgICAvLyByZXR1cm4gdmFsdWUKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjE5OS0yMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChzZWxmLCBhOiBBc3NldCkgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDEKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tZXRhZGF0YV9oYXNoKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDIKICAgIC8vIHZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXggPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tZXRhZGF0YV9oYXNoKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDUKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMuYXJ0aWZhY3RzLlN0YXRlT3BzLmNvbnRyYWN0LlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXI6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjA3LTIwOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyKHNlbGYsIGE6IEFzc2V0KSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMDkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9tYW5hZ2VyKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjEwCiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfbWFuYWdlcihfZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgX2dldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZShhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9yZXNlcnZlOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxNS0yMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZShzZWxmLCBhOiBBc3NldCkgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjE3CiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfcmVzZXJ2ZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0UmVzZXJ2ZQogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X3Jlc2VydmUoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFJlc2VydmUKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMTkKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjAKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjEKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZShhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjIzLTIyNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUoc2VsZiwgYTogQXNzZXQpIC0+IGFyYzQuQWRkcmVzczoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjI2CiAgICAvLyB2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4ID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZnJlZXplKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjcKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjgKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyMjkKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMS0yMzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2soc2VsZiwgYTogQXNzZXQpIC0+IGFyYzQuQWRkcmVzczoKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gdmFsdWUsIGV4aXN0cyA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NsYXdiYWNrKF9nZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBfZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDbGF3YmFjawogICAgY292ZXIgMgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gYXNzZXJ0IHZhbHVlID09IHZhbHVlX2luZGV4LCAiZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNgogICAgLy8gYXNzZXJ0IGV4aXN0cyA9PSBleGlzdHNfaW5kZXgsICJleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2giCiAgICBjb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzNwogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzLmFydGlmYWN0cy5TdGF0ZU9wcy5jb250cmFjdC5TdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcihhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jcmVhdG9yOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcihzZWxmLCBhOiBBc3NldCkgLT4gYXJjNC5BZGRyZXNzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MjQxCiAgICAvLyB2YWx1ZSwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgc3dhcAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL1N0YXRlT3BzL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleCA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2NyZWF0b3IoX2dldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIF9nZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGNvdmVyIDIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDMKICAgIC8vIGFzc2VydCB2YWx1ZSA9PSB2YWx1ZV9pbmRleCwgImV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDQKICAgIC8vIGFzc2VydCBleGlzdHMgPT0gZXhpc3RzX2luZGV4LCAiZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoIgogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9TdGF0ZU9wcy9jb250cmFjdC5weToyNDUKICAgIC8vIHJldHVybiBhcmM0LkFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy5hcnRpZmFjdHMuU3RhdGVPcHMuY29udHJhY3QuU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvU3RhdGVPcHMvY29udHJhY3QucHk6MTUwCiAgICAvLyBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludCAxCiAgICByZXR1cm4K" + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNgogICAgcHVzaGJ5dGVzcyAweGFkNzE5YTZmIDB4MWQ2MDMwMTMgMHg5ZmI3MzFjZCAweDBmNWE0OTExIDB4ZjViMzcwYzYgMHhjN2Q2YWY3NCAweDZiNzFhMjYzIDB4MzA0MGViYzggMHgxZDA3ZTg0NCAweDNlNDBjYjUwIDB4MzQwYzc4NmIgMHhlMzhhOTgxNSAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKGFzc2V0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMoYXNzZXQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhc3NldClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUoYXNzZXQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGFzc2V0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsKGFzc2V0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhc3NldClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIoYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZShhc3NldClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUoYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2soYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcihhc3NldClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsc19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZV9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2hfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2tfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcl9yb3V0ZUAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbl9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2gKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmVfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZV9yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja19yb3V0ZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3Jfcm91dGVAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbChhOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU3LTE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbChhOiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0VG90YWwoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldFRvdGFsKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYtMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKGE6IEFzc2V0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXREZWNpbWFscyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RGVjaW1hbHMoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc1LTE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhOiBBc3NldCk6IGJvb2xlYW4gewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldERlZmF1bHRGcm96ZW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RGVmYXVsdEZyb3plbihnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODQtMTg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZShhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVbml0TmFtZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0VW5pdE5hbWUoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkzLTE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGE6IEFzc2V0KTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldE5hbWUoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTYKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0TmFtZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTcKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDItMjAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybChhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVcmwoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVcmwoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMS0yMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRNZXRhZGF0YUhhc2goYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRNZXRhZGF0YUhhc2goZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcihhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMC0yMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcihhOiBBc3NldCk6IEFkZHJlc3MgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldE1hbmFnZXIoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0TWFuYWdlcihnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjQKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjYKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjktMjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUoYTogQXNzZXQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRSZXNlcnZlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldFJlc2VydmUoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzOC0yMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplKGE6IEFzc2V0KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RnJlZXplKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RnJlZXplKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQyCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0MwogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayhhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDctMjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKGE6IEFzc2V0KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0Q2xhd2JhY2soYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldENsYXdiYWNrKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTMKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYtMjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogQXNzZXQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1OAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRDcmVhdG9yKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjU5CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldENyZWF0b3IoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MQogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYyCiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { "global": { diff --git a/tests/artifacts/state-ops/data/StateAssetParamsContract.arc56.json b/tests/artifacts/state-ops/data/StateAssetParamsContract.arc56.json new file mode 100644 index 0000000..af64086 --- /dev/null +++ b/tests/artifacts/state-ops/data/StateAssetParamsContract.arc56.json @@ -0,0 +1,382 @@ +{ + "name": "StateAssetParamsContract", + "structs": {}, + "methods": [ + { + "name": "verify_asset_params_get_total", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_decimals", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_default_frozen", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_unit_name", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_name", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_url", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_metadata_hash", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_manager", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_reserve", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_freeze", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_clawback", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify_asset_params_get_creator", + "args": [ + { + "type": "asset", + "name": "a" + } + ], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 120, + 143, + 166, + 195, + 225, + 255, + 285, + 315, + 337, + 359, + 381, + 403 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 430 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 123, + 146, + 169, + 198, + 228, + 258, + 288, + 318, + 340, + 362, + 384, + 406 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 454, + 483, + 504, + 525, + 546, + 567, + 588, + 609, + 630, + 651, + 672, + 693 + ], + "errorMessage": "expected exists by index to match" + }, + { + "pc": [ + 452, + 481, + 502, + 523, + 544, + 565, + 586, + 607, + 628, + 649, + 670, + 691 + ], + "errorMessage": "expected value by index to match" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNgogICAgcHVzaGJ5dGVzcyAweGFkNzE5YTZmIDB4MWQ2MDMwMTMgMHg5ZmI3MzFjZCAweDBmNWE0OTExIDB4ZjViMzcwYzYgMHhjN2Q2YWY3NCAweDZiNzFhMjYzIDB4MzA0MGViYzggMHgxZDA3ZTg0NCAweDNlNDBjYjUwIDB4MzQwYzc4NmIgMHhlMzhhOTgxNSAvLyBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3RvdGFsKGFzc2V0KXVpbnQ2NCIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVjaW1hbHMoYXNzZXQpdWludDY0IiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhc3NldClib29sIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91bml0X25hbWUoYXNzZXQpYnl0ZVtdIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGFzc2V0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsKGFzc2V0KWJ5dGVbXSIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhc3NldClieXRlW10iLCBtZXRob2QgInZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIoYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZShhc3NldClhZGRyZXNzIiwgbWV0aG9kICJ2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUoYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2soYXNzZXQpYWRkcmVzcyIsIG1ldGhvZCAidmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcihhc3NldClhZGRyZXNzIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsc19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlZmF1bHRfZnJvemVuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZV9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2hfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemVfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2tfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcl9yb3V0ZUAxMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWxfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWwKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbl9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWVfcm91dGVANjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbmFtZQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybF9yb3V0ZUA3OgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE1NgogICAgLy8gZXhwb3J0IGNsYXNzIFN0YXRlQXNzZXRQYXJhbXNDb250cmFjdCBleHRlbmRzIGFyYzQuQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF91cmwKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoX3JvdXRlQDg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21ldGFkYXRhX2hhc2gKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyX3JvdXRlQDk6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X21hbmFnZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmVfcm91dGVAMTA6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2ZyZWV6ZV9yb3V0ZUAxMToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFja19yb3V0ZUAxMjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY2xhd2JhY2sKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3Jfcm91dGVAMTM6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyBleHBvcnQgY2xhc3MgU3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0IGV4dGVuZHMgYXJjNC5Db250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIwCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGV4cG9ydCBjbGFzcyBTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QgZXh0ZW5kcyBhcmM0LkNvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbChhOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdG90YWw6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTU3LTE1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF90b3RhbChhOiBBc3NldCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNTkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0VG90YWwoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFRvdGFsCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldFRvdGFsKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VG90YWwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjMKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpnZXRfMXN0X3JlZl9pbmRleCgpIC0+IHVpbnQ2NDoKZ2V0XzFzdF9yZWZfaW5kZXg6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGZ1bmN0aW9uIGdldF8xc3RfcmVmX2luZGV4KCk6IHVpbnQ2NCB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMwogICAgLy8gcmV0dXJuIG9wLmJ0b2koVHhuLmFwcGxpY2F0aW9uQXJncygxKSkKICAgIGludGNfMCAvLyAxCiAgICB0eG5hcyBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ0b2kKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKGE6IHVpbnQ2NCkgLT4gdWludDY0Ogp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWNpbWFsczoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjYtMTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2RlY2ltYWxzKGE6IEFzc2V0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXREZWNpbWFscyhhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNjkKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RGVjaW1hbHMoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzEKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZGVmYXVsdF9mcm96ZW46CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc1LTE3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9kZWZhdWx0X2Zyb3plbihhOiBBc3NldCk6IGJvb2xlYW4gewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTc3CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldERlZmF1bHRGcm96ZW4oYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RGVmYXVsdEZyb3plbihnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlZmF1bHRGcm96ZW4KICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxNzkKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODEKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdW5pdF9uYW1lKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODQtMTg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VuaXRfbmFtZShhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVbml0TmFtZShhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODcKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0VW5pdE5hbWUoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVbml0TmFtZQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE4OAogICAgLy8gYXNzZXJ0KHZhbHVlID09PSB2YWx1ZV9pbmRleCwgJ2V4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxODkKICAgIC8vIGFzc2VydChleGlzdHMgPT09IGV4aXN0c19pbmRleCwgJ2V4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaCcpCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGV4aXN0cyBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gcmV0dXJuIHZhbHVlCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X25hbWU6CiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTkzLTE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIHB1YmxpYyB2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9uYW1lKGE6IEFzc2V0KTogYnl0ZXMgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldE5hbWUoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTYKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0TmFtZShnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE5hbWUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTcKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MTk4CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfdXJsKGE6IHVpbnQ2NCkgLT4gYnl0ZXM6CnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybDoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDItMjAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3VybChhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVcmwoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVSTAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIwNQogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRVcmwoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRVUkwKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMS0yMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWV0YWRhdGFfaGFzaChhOiBBc3NldCk6IGJ5dGVzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRNZXRhZGF0YUhhc2goYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gY29uc3QgW3ZhbHVlX2luZGV4LCBleGlzdHNfaW5kZXhdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRNZXRhZGF0YUhhc2goZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNZXRhZGF0YUhhc2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIHJldHVybiB2YWx1ZQogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjpTdGF0ZUFzc2V0UGFyYW1zQ29udHJhY3QudmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcihhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9tYW5hZ2VyOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIyMC0yMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfbWFuYWdlcihhOiBBc3NldCk6IEFkZHJlc3MgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBjb25zdCBbdmFsdWUsIGV4aXN0c10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldE1hbmFnZXIoYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0TWFuYWdlcihnZXRfMXN0X3JlZl9pbmRleCgpKQogICAgY2FsbHN1YiBnZXRfMXN0X3JlZl9pbmRleAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjQKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjI1CiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjYKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfcmVzZXJ2ZToKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyMjktMjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X3Jlc2VydmUoYTogQXNzZXQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRSZXNlcnZlKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldFJlc2VydmUoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRSZXNlcnZlCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjMzCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9mcmVlemUoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplOgogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjIzOC0yMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfZnJlZXplKGE6IEFzc2V0KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDAKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RnJlZXplKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRGcmVlemUKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIGNvbnN0IFt2YWx1ZV9pbmRleCwgZXhpc3RzX2luZGV4XSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0RnJlZXplKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQyCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI0MwogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC52ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjayhhOiB1aW50NjQpIC0+IGJ5dGVzOgp2ZXJpZnlfYXNzZXRfcGFyYW1zX2dldF9jbGF3YmFjazoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDctMjQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NsYXdiYWNrKGE6IEFzc2V0KTogQWRkcmVzcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNDkKICAgIC8vIGNvbnN0IFt2YWx1ZSwgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0Q2xhd2JhY2soYSkKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldENsYXdiYWNrKGdldF8xc3RfcmVmX2luZGV4KCkpCiAgICBjYWxsc3ViIGdldF8xc3RfcmVmX2luZGV4CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTEKICAgIC8vIGFzc2VydCh2YWx1ZSA9PT0gdmFsdWVfaW5kZXgsICdleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaCcpCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIHZhbHVlIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBhc3NlcnQoZXhpc3RzID09PSBleGlzdHNfaW5kZXgsICdleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBleGlzdHMgYnkgaW5kZXggdG8gbWF0Y2gKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTMKICAgIC8vIHJldHVybiBuZXcgQWRkcmVzcyh2YWx1ZSkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czo6U3RhdGVBc3NldFBhcmFtc0NvbnRyYWN0LnZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogdWludDY0KSAtPiBieXRlczoKdmVyaWZ5X2Fzc2V0X3BhcmFtc19nZXRfY3JlYXRvcjoKICAgIC8vIHRlc3RzL2FydGlmYWN0cy9zdGF0ZS1vcHMvY29udHJhY3QuYWxnby50czoyNTYtMjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gcHVibGljIHZlcmlmeV9hc3NldF9wYXJhbXNfZ2V0X2NyZWF0b3IoYTogQXNzZXQpOiBBZGRyZXNzIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI1OAogICAgLy8gY29uc3QgW3ZhbHVlLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRDcmVhdG9yKGEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjU5CiAgICAvLyBjb25zdCBbdmFsdWVfaW5kZXgsIGV4aXN0c19pbmRleF0gPSBvcC5Bc3NldFBhcmFtcy5hc3NldENyZWF0b3IoZ2V0XzFzdF9yZWZfaW5kZXgoKSkKICAgIGNhbGxzdWIgZ2V0XzFzdF9yZWZfaW5kZXgKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYwCiAgICAvLyBhc3NlcnQodmFsdWUgPT09IHZhbHVlX2luZGV4LCAnZXhwZWN0ZWQgdmFsdWUgYnkgaW5kZXggdG8gbWF0Y2gnKQogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCB2YWx1ZSBieSBpbmRleCB0byBtYXRjaAogICAgLy8gdGVzdHMvYXJ0aWZhY3RzL3N0YXRlLW9wcy9jb250cmFjdC5hbGdvLnRzOjI2MQogICAgLy8gYXNzZXJ0KGV4aXN0cyA9PT0gZXhpc3RzX2luZGV4LCAnZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoJykKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgZXhpc3RzIGJ5IGluZGV4IHRvIG1hdGNoCiAgICAvLyB0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6MjYyCiAgICAvLyByZXR1cm4gbmV3IEFkZHJlc3ModmFsdWUpCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcnRpZmFjdHMvc3RhdGUtb3BzL2NvbnRyYWN0LmFsZ28udHM6OlN0YXRlQXNzZXRQYXJhbXNDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/artifacts/state-ops/data/StateAssetParamsContract.clear.teal b/tests/artifacts/state-ops/data/StateAssetParamsContract.clear.teal index 21cbde0..fc0579b 100644 --- a/tests/artifacts/state-ops/data/StateAssetParamsContract.clear.teal +++ b/tests/artifacts/state-ops/data/StateAssetParamsContract.clear.teal @@ -1,7 +1,5 @@ #pragma version 10 -tests.artifacts.StateOps.contract.StateAssetParamsContract.clear_state_program: - // tests/artifacts/StateOps/contract.py:150 - // class StateAssetParamsContract(ARC4Contract): - int 1 +tests/artifacts/state-ops/contract.algo.ts::StateAssetParamsContract.clearStateProgram: + pushint 1 // 1 return diff --git a/tests/avm-invoker.ts b/tests/avm-invoker.ts index edd23ae..4c6713a 100644 --- a/tests/avm-invoker.ts +++ b/tests/avm-invoker.ts @@ -1,6 +1,6 @@ import * as algokit from '@algorandfoundation/algokit-utils' import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' -import { ABIAppCallArg, ABIReturn } from '@algorandfoundation/algokit-utils/types/app' +import { ABIAppCallArg, AppCallTransactionResult } from '@algorandfoundation/algokit-utils/types/app' import { ApplicationClient } from '@algorandfoundation/algokit-utils/types/app-client' import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' import { KmdAccountManager } from '@algorandfoundation/algokit-utils/types/kmd-account-manager' @@ -35,13 +35,13 @@ const invokeMethod = async ( method: string, sendParams?: SendTransactionParams, ...methodArgs: ABIAppCallArg[] -): Promise => { +): Promise => { const response = await appClient.call({ method, methodArgs, note: randomUUID(), sendParams }) if (response.return?.decodeError) { throw response.return.decodeError } - return response.return + return response } export const getAvmResult = async ( @@ -50,7 +50,16 @@ export const getAvmResult = async ( ...methodArgs: ABIAppCallArg[] ): Promise => { const result = await invokeMethod(appClient, method, sendParams, ...methodArgs) - return result?.returnValue as TResult + return result?.return?.returnValue as TResult +} + +export const getAvmResultLog = async ( + { appClient, sendParams }: { appClient: ApplicationClient; sendParams?: SendTransactionParams }, + method: string, + ...methodArgs: ABIAppCallArg[] +): Promise => { + const result = await invokeMethod(appClient, method, sendParams, ...methodArgs) + return result?.confirmation?.logs } export const getAvmResultRaw = async ( @@ -59,7 +68,7 @@ export const getAvmResultRaw = async ( ...methodArgs: ABIAppCallArg[] ): Promise => { const result = await invokeMethod(appClient, method, sendParams, ...methodArgs) - return result?.rawReturnValue + return result?.return?.rawReturnValue } export const getLocalNetDefaultAccount = () => { diff --git a/tests/global-state-arc4-values.spec.ts b/tests/global-state-arc4-values.spec.ts new file mode 100644 index 0000000..e7900d3 --- /dev/null +++ b/tests/global-state-arc4-values.spec.ts @@ -0,0 +1,124 @@ +import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' +import { Bytes } from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { + AddressImpl, + BoolImpl, + ByteImpl, + DynamicBytesImpl, + StrImpl, + UintNImpl, +} from '@algorandfoundation/algorand-typescript-testing/runtime-helpers' +import { Address, ARC4Encoded, BitSize, Bool, Byte, DynamicBytes, Str, UintN } from '@algorandfoundation/algorand-typescript/arc4' +import { afterEach, describe, expect, test } from 'vitest' +import { DeliberateAny, FunctionKeys } from '../src/typescript-helpers' +import { GlobalStateContract } from './artifacts/state-ops/contract.algo' +import arc4AppGlobalAppSpecJson from './artifacts/state-ops/data/GlobalStateContract.arc32.json' +import { getAlgorandAppClient, getAvmResult, getLocalNetDefaultAccount } from './avm-invoker' +import { asUint8Array } from './util' + +describe('ARC4 AppGlobal values', async () => { + const appClient = await getAlgorandAppClient(arc4AppGlobalAppSpecJson as AppSpec) + const localNetAccount = await getLocalNetDefaultAccount() + const defaultSenderAccountAddress = Bytes.fromBase32(localNetAccount.addr) + const ctx = new TestExecutionContext(defaultSenderAccountAddress) + + afterEach(async () => { + ctx.reset() + }) + + const testData = ['_implicit_key', ''].flatMap((implicit) => [ + { + nativeValue: 42, + abiValue: new UintN<64>(42), + methodName: `get${implicit}_arc4_uintn64`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as UintNImpl + const bitSize = UintNImpl.getMaxBitsLength(arc4Value.typeInfo) + expect(arc4Value).toBeInstanceOf(UintN) + expect(bitSize).toEqual(64) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: 'World', + abiValue: new Str('World'), + methodName: `get${implicit}_arc4_str`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as StrImpl + expect(arc4Value).toBeInstanceOf(Str) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: 12, + abiValue: new Byte(12), + methodName: `get${implicit}_arc4_byte`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as ByteImpl + expect(arc4Value).toBeInstanceOf(Byte) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: false, + abiValue: new Bool(false), + methodName: `get${implicit}_arc4_bool`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as BoolImpl + expect(arc4Value).toBeInstanceOf(Bool) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: asUint8Array(Bytes.fromHex(`${'00'.repeat(31)}ff`)), + abiValue: new Address(Bytes.fromHex(`${'00'.repeat(31)}ff`)), + methodName: `get${implicit}_arc4_address`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as AddressImpl + expect(arc4Value).toBeInstanceOf(Address) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: 2n ** 102n, + abiValue: new UintN<128>(2n ** 102n), + methodName: `get${implicit}_arc4_uintn128`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as UintNImpl + const bitSize = UintNImpl.getMaxBitsLength(arc4Value.typeInfo) + expect(arc4Value).toBeInstanceOf(UintN) + expect(bitSize).toEqual(128) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + nativeValue: asUint8Array(Bytes.fromHex(`${'00'.repeat(30)}${'ff'.repeat(2)}`)), + abiValue: new DynamicBytes(Bytes.fromHex(`${'00'.repeat(30)}${'ff'.repeat(2)}`)), + methodName: `get${implicit}_arc4_dynamic_bytes`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as DynamicBytesImpl + expect(arc4Value).toBeInstanceOf(DynamicBytes) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + ]) + + test.each(testData)('should be able to get arc4 state values', async (data) => { + const avmResult = await getAvmResult({ appClient }, data.methodName) + const contract = ctx.contract.create(GlobalStateContract) + const result = contract[data.methodName as FunctionKeys](undefined as never) as ARC4Encoded + data.assert(result, avmResult) + }) + + test.each(testData)('should be able to set arc4 state values', async (data) => { + const setMethodName = data.methodName.replace('get', 'set') + await getAvmResult({ appClient }, setMethodName, data.nativeValue) + const contract = ctx.contract.create(GlobalStateContract) + contract[setMethodName as FunctionKeys](data.abiValue as never) + + const avmResult = await getAvmResult({ appClient }, data.methodName) + const result = contract[data.methodName as FunctionKeys](undefined as never) as ARC4Encoded + data.assert(result, avmResult) + }) +}) diff --git a/tests/local-state-arc4-values.spec.ts b/tests/local-state-arc4-values.spec.ts new file mode 100644 index 0000000..c214378 --- /dev/null +++ b/tests/local-state-arc4-values.spec.ts @@ -0,0 +1,111 @@ +import { ApplicationClient } from '@algorandfoundation/algokit-utils/types/app-client' +import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' +import { Account, Bytes } from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { + AddressImpl, + BoolImpl, + ByteImpl, + DynamicBytesImpl, + StrImpl, + UintNImpl, +} from '@algorandfoundation/algorand-typescript-testing/runtime-helpers' +import { Address, ARC4Encoded, BitSize, Bool, Byte, DynamicBytes, Str, UintN } from '@algorandfoundation/algorand-typescript/arc4' +import { afterEach, describe, expect, test } from 'vitest' +import { DeliberateAny } from '../src/typescript-helpers' +import { LocalStateContract } from './artifacts/state-ops/contract.algo' +import arc4AppLocalAppSpecJson from './artifacts/state-ops/data/LocalStateContract.arc32.json' +import { getAlgorandAppClient, getAvmResult, getLocalNetDefaultAccount } from './avm-invoker' + +describe('ARC4 AppLocal values', async () => { + const appClient = await getAlgorandAppClient(arc4AppLocalAppSpecJson as AppSpec) + const localNetAccount = await getLocalNetDefaultAccount() + const defaultSenderAccountAddress = Bytes.fromBase32(localNetAccount.addr) + const ctx = new TestExecutionContext(defaultSenderAccountAddress) + await tryOptIn(appClient) + + afterEach(async () => { + ctx.reset() + }) + + const testData = ['_implicit_key', ''].flatMap((implicit) => [ + { + methodName: `get${implicit}_arc4_uintn64`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as UintNImpl + const bitSize = UintNImpl.getMaxBitsLength(arc4Value.typeInfo) + expect(arc4Value).toBeInstanceOf(UintN) + expect(bitSize).toEqual(64) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_str`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as StrImpl + expect(arc4Value).toBeInstanceOf(Str) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_byte`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as ByteImpl + expect(arc4Value).toBeInstanceOf(Byte) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_bool`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as BoolImpl + expect(arc4Value).toBeInstanceOf(Bool) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_address`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as AddressImpl + expect(arc4Value).toBeInstanceOf(Address) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_uintn128`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as UintNImpl + const bitSize = UintNImpl.getMaxBitsLength(arc4Value.typeInfo) + expect(arc4Value).toBeInstanceOf(UintN) + expect(bitSize).toEqual(128) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + { + methodName: `get${implicit}_arc4_dynamic_bytes`, + assert: (value: ARC4Encoded, expectedValue: DeliberateAny) => { + const arc4Value = value as DynamicBytesImpl + expect(arc4Value).toBeInstanceOf(DynamicBytes) + expect(arc4Value.native).toEqual(expectedValue) + }, + }, + ]) + + test.each(testData)('should be able to get arc4 state values', async (data) => { + const avmResult = await getAvmResult({ appClient }, data.methodName, localNetAccount.addr) + const contract = ctx.contract.create(LocalStateContract) + contract.opt_in() + const result = contract[data.methodName as keyof LocalStateContract](Account(defaultSenderAccountAddress)) as ARC4Encoded + data.assert(result, avmResult) + }) +}) +const tryOptIn = async (client: ApplicationClient) => { + try { + await client.optIn({ method: 'opt_in', methodArgs: [] }) + } catch (e) { + if (!(e as DeliberateAny).message.includes('has already opted in to app')) { + throw e + } + // ignore error if account has already opted in + } +} diff --git a/tests/log.spec.ts b/tests/log.spec.ts new file mode 100644 index 0000000..4d29ddd --- /dev/null +++ b/tests/log.spec.ts @@ -0,0 +1,82 @@ +import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' +import { Bytes, log, Uint64 } from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { + Bool, + DynamicArray, + StaticArray, + Str, + Tuple, + UFixedNxM, + UintN, + UintN16, + UintN32, + UintN64, + UintN8, +} from '@algorandfoundation/algorand-typescript/arc4' +import { afterEach, describe, expect, it } from 'vitest' +import { MAX_UINT512, MAX_UINT64 } from '../src/constants' +import { ApplicationTransaction } from '../src/impl/transactions' +import { asBigUint, asBigUintCls } from '../src/util' +import { PrimitiveOpsContract } from './artifacts/primitive-ops/contract.algo' +import appSpecJson from './artifacts/primitive-ops/data/PrimitiveOpsContract.arc32.json' +import { getAlgorandAppClient, getAvmResultLog } from './avm-invoker' +import { asUint8Array } from './util' + +describe('log', async () => { + const appClient = await getAlgorandAppClient(appSpecJson as AppSpec) + const ctx = new TestExecutionContext() + + afterEach(async () => { + ctx.reset() + }) + + it('should log different data types', async () => { + const a = 'hello' + const b = Uint64(MAX_UINT64) + const c = Bytes('world') + const d = BigInt(MAX_UINT512) + const e = new Bool(true) + const f = new Str('greetings') + const g = new UintN<64>(42) + const h = new UintN<256>(512) + const i = new UFixedNxM<32, 8>('42.94967295') + const j = new UFixedNxM<256, 16>('25.5') + const k = new StaticArray(new UintN8(1), new UintN8(2), new UintN8(3)) + const m = new DynamicArray(new UintN16(1), new UintN16(2), new UintN16(3)) + const n = new Tuple((new UintN32(1), new UintN64(2), new Str('hello'))) + + const avmResult = await getAvmResultLog( + { appClient }, + 'verify_log', + a, + b.valueOf(), + asUint8Array(c), + asUint8Array(asBigUintCls(d).toBytes()), + e.native, + f.native, + g.native.valueOf(), + h.native.valueOf(), + asBigUint(i.bytes).valueOf(), + asBigUint(j.bytes).valueOf(), + asUint8Array(k.bytes), + asUint8Array(m.bytes), + asUint8Array(n.bytes), + ) + expect(Array.isArray(avmResult)).toBeTruthy() + ctx.txn.createScope([ctx.any.txn.payment()]).execute(() => { + expect(() => log(a, b, c, d, e, f, g, h, i, j, k, m, n)).toThrow('Can only add logs to ApplicationCallTransaction') + }) + const dummyApp = ctx.any.application() + ctx.txn.createScope([ctx.any.txn.applicationCall({ appId: dummyApp })]).execute(() => { + log(a, b, c, d, e, f, g, h, i, j, k, m, n) + }) + let lastTxn = ctx.txn.lastActive as ApplicationTransaction + expect(lastTxn.appLogs).toEqual(avmResult) + + const contract = ctx.contract.create(PrimitiveOpsContract) + contract.verify_log(a, b, c, asBigUintCls(d).toBytes().asAlgoTs(), e, f, g, h, i, j, k.bytes, m.bytes, n.bytes) + lastTxn = ctx.txn.lastActive as ApplicationTransaction + expect(lastTxn.appLogs).toEqual(avmResult) + }) +}) diff --git a/tests/references/arc4-contract.spec.ts b/tests/references/arc4-contract.spec.ts new file mode 100644 index 0000000..13b5c67 --- /dev/null +++ b/tests/references/arc4-contract.spec.ts @@ -0,0 +1,117 @@ +import { + Account, + arc4, + assert, + BaseContract, + bytes, + Bytes, + contract, + Contract, + Global, + Txn, + uint64, + Uint64, +} from '@algorandfoundation/algorand-typescript' +import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { afterEach, describe, expect, it } from 'vitest' +import { lazyContext } from '../../src/context-helpers/internal-context' + +class ContractTxnInit extends BaseContract { + arg1: bytes + creator: Account + + constructor() { + super() + this.arg1 = Txn.numAppArgs > 0 ? Txn.applicationArgs(0) : Bytes() + this.creator = Txn.sender + } + + approvalProgram(): boolean { + return true + } + + clearStateProgram(): boolean { + return true + } +} + +@contract({ stateTotals: { globalBytes: 4, globalUints: 5, localBytes: 6, localUints: 7 } }) +class ContractARC4Create extends Contract { + creator: Account + #name: string + #scratchSlots: uint64 + #stateTotals: uint64 + arg1: uint64 | undefined + + constructor() { + super() + this.creator = Txn.sender + this.#name = 'name' + this.#scratchSlots = Uint64() + this.#stateTotals = Uint64() + } + + @arc4.abimethod({ onCreate: 'require' }) + create(val: uint64): void { + this.arg1 = val + assert(Global.currentApplicationId.globalNumBytes === 4) + assert(Global.currentApplicationId.globalNumUint === 5) + assert(Global.currentApplicationId.localNumBytes === 6) + assert(Global.currentApplicationId.localNumUint === 7) + assert(this.#name === 'name') + assert(this.#scratchSlots === 0) + assert(this.#stateTotals === 0) + } +} + +describe('arc4 contract creation', () => { + const ctx = new TestExecutionContext() + + afterEach(() => { + ctx.reset() + }) + + it('can create contract with txn in init', () => { + const arg1 = ctx.any.bytes(5) + const sender = ctx.any.account() + + ctx.txn.createScope([ctx.any.txn.applicationCall({ appArgs: [arg1], sender })]).execute(() => { + const contract = ctx.contract.create(ContractTxnInit) + expect(contract.arg1).toEqual(arg1) + expect(contract.creator).toEqual(sender) + }) + }) + + it('can create contract without txn in init', () => { + const contract = ctx.contract.create(ContractTxnInit) + expect(contract.arg1).toEqual(Bytes()) + expect(contract.creator).toEqual(ctx.defaultSender) + }) + + it('can create arc4 contract with txn in init', () => { + const arg1 = ctx.any.uint64() + const sender = ctx.any.account() + + const contract = ctx.contract.create(ContractARC4Create) + ctx.txn.createScope([ctx.any.txn.applicationCall({ appId: ctx.ledger.getApplicationForContract(contract), sender })]).execute(() => { + contract.create(arg1) + expect(contract.arg1).toEqual(arg1) + expect(contract.creator).toEqual(sender) + }) + }) + + it('can create arc4 contract without txn in init', () => { + const arg1 = ctx.any.uint64() + + const contract = ctx.contract.create(ContractARC4Create) + + const appData = lazyContext.getApplicationData(contract) + expect(appData.isCreating).toBe(true) + + contract.create(arg1) + + expect(appData.isCreating).toBe(false) + expect(contract.arg1).toEqual(arg1) + expect(contract.creator).toEqual(ctx.defaultSender) + }) +}) diff --git a/tests/references/box-map.spec.ts b/tests/references/box-map.spec.ts index 32ebbdb..82bbed2 100644 --- a/tests/references/box-map.spec.ts +++ b/tests/references/box-map.spec.ts @@ -1,39 +1,103 @@ import { biguint, BigUint, BoxMap, Bytes, bytes, op, uint64, Uint64 } from '@algorandfoundation/algorand-typescript' import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { ARC4Encoded, DynamicArray, interpretAsArc4, Str, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' import { afterEach, describe, expect, test } from 'vitest' import { MAX_UINT64 } from '../../src/constants' import { DeliberateAny } from '../../src/typescript-helpers' -import { asBigUintCls, asBytes, asUint64Cls, toBytes } from '../../src/util' +import { asBytes, toBytes } from '../../src/util' const BOX_NOT_CREATED_ERROR = 'Box has not been created' describe('BoxMap', () => { const ctx = new TestExecutionContext() const keyPrefix = Bytes('test_key_prefix') - const testUint64BoxMap = (test: (boxMap: BoxMap) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const boxMap = BoxMap({ keyPrefix }) - test(boxMap) - }) - } - const testBytesBoxMap = (test: (boxMap: BoxMap) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const boxMap = BoxMap({ keyPrefix }) - test(boxMap) - }) - } - const testStringBoxMap = (test: (boxMap: BoxMap) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const boxMap = BoxMap({ keyPrefix }) - test(boxMap) - }) - } - const testBigUintBoxMap = (test: (boxMap: BoxMap) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const boxMap = BoxMap({ keyPrefix }) - test(boxMap) - }) - } + const testData = [ + { + key: Bytes('abc'), + value: Uint64(100), + newValue: Uint64(200), + emptyValue: Uint64(0), + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: 'def', + value: Bytes('Test1'), + newValue: Bytes('hello'), + emptyValue: Bytes(''), + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: BigUint(123), + value: 'Test1', + newValue: 'hello', + emptyValue: '', + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: Uint64(456), + value: BigUint(MAX_UINT64), + newValue: BigUint(MAX_UINT64 - 1n), + emptyValue: BigUint(0), + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: new Str('ghi'), + value: BigUint(100), + newValue: BigUint(200), + emptyValue: BigUint(0), + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: Uint64(456), + value: new Str('Test1'), + newValue: new Str('hello'), + emptyValue: interpretAsArc4(Bytes('')), + withBoxContext: (test: (boxMap: BoxMap) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap({ keyPrefix }) + test(boxMap) + }) + }, + }, + { + key: new Str('jkl'), + value: new DynamicArray(new UintN64(100), new UintN64(200)), + newValue: new DynamicArray(new UintN64(200), new UintN64(300)), + emptyValue: interpretAsArc4>(Bytes('')), + withBoxContext: (test: (boxMap: BoxMap>) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = BoxMap>({ keyPrefix }) + test(boxMap) + }) + }, + }, + ] + afterEach(() => { ctx.reset() }) @@ -49,14 +113,8 @@ describe('BoxMap', () => { }) }) - // TODO: add tests for settign arc4 types as value - test.each([ - [Bytes('abc'), Uint64(100), testUint64BoxMap], - ['def', Bytes('Test'), testBytesBoxMap], - [BigUint(123), 'Test', testStringBoxMap], - [Uint64(456), BigUint(MAX_UINT64), testBigUintBoxMap], - ])('key %s and value %s can be set as value', (key, value, testBoxMap) => { - testBoxMap((boxMap) => { + test.each(testData)('key %s and value %s can be set as value', ({ key, value, withBoxContext }) => { + withBoxContext((boxMap) => { boxMap.set(key as never, value as never) const boxContent = (boxMap as DeliberateAny).get(key) @@ -71,14 +129,8 @@ describe('BoxMap', () => { }) }) - // TODO: add tests for settign arc4 types as value - test.each([ - [Bytes('abc'), Uint64(100), testUint64BoxMap], - ['def', Bytes('Test'), testBytesBoxMap], - [BigUint(123), 'Test', testStringBoxMap], - [Uint64(456), BigUint(MAX_UINT64), testBigUintBoxMap], - ])('key %s and value %s can be delete', (key, value, testBoxMap) => { - testBoxMap((boxMap) => { + test.each(testData)('key %s and value %s can be delete', ({ key, value, withBoxContext }) => { + withBoxContext((boxMap) => { boxMap.set(key as never, value as never) boxMap.delete(key as never) @@ -91,14 +143,8 @@ describe('BoxMap', () => { }) }) - // TODO: add tests for settign arc4 types as value - test.each([ - [Bytes('abc'), Uint64(100), testUint64BoxMap], - ['def', Bytes('Test'), testBytesBoxMap], - [BigUint(123), 'Test', testStringBoxMap], - [Uint64(456), BigUint(MAX_UINT64), testBigUintBoxMap], - ])('can retrieve existing key %s and value %s using maybe', (key, value, testBoxMap) => { - testBoxMap((boxMap) => { + test.each(testData)('can retrieve existing key %s and value %s using maybe', ({ key, value, withBoxContext }) => { + withBoxContext((boxMap) => { boxMap.set(key as never, value as never) const [content, exists] = boxMap.maybe(key as never) @@ -114,21 +160,19 @@ describe('BoxMap', () => { }) }) - // TODO: add tests for settign arc4 types as value - test.each([ - [Bytes('abc'), Uint64(100), Uint64(0), testUint64BoxMap], - ['def', Bytes('Test'), Bytes(''), testBytesBoxMap], - [BigUint(123), 'Test', '', testStringBoxMap], - [Uint64(456), BigUint(MAX_UINT64), BigUint(0), testBigUintBoxMap], - ])('can retrieve non-existing value using maybe', (key, value, expectedEmptyValue, testBoxMap) => { - testBoxMap((boxMap) => { + test.each(testData)('can retrieve non-existing value using maybe', ({ key, value, emptyValue, withBoxContext }) => { + withBoxContext((boxMap) => { boxMap.set(key as never, value as never) boxMap.delete(key as never) const [content, exists] = boxMap.maybe(key as never) expect(exists).toBe(false) - expect(content).toEqual(expectedEmptyValue) + if (content instanceof ARC4Encoded) { + expect(content.bytes).toEqual((emptyValue as ARC4Encoded).bytes) + } else { + expect(content).toEqual(emptyValue) + } const fullKey = keyPrefix.concat(toBytes(key)) const [opContent, opExists] = op.Box.get(fullKey) @@ -137,22 +181,26 @@ describe('BoxMap', () => { }) }) - test.each([ - [Bytes('abc'), Uint64(100), Uint64(200), asUint64Cls(200).toBytes().asAlgoTs(), testUint64BoxMap], - ['def', Bytes('Test1'), Bytes('hello'), Bytes('hello'), testBytesBoxMap], - [BigUint(123), 'Test1', 'hello', Bytes('hello'), testStringBoxMap], - [Uint64(456), BigUint(100), BigUint(200), asBigUintCls(200).toBytes().asAlgoTs(), testBigUintBoxMap], - ])('can get typed value after using op.Box.put', (key, value, newValue, newBytesValue, testBoxMap) => { - testBoxMap((boxMap) => { + test.each(testData)('can get typed value after using op.Box.put', ({ key, value, newValue, withBoxContext }) => { + withBoxContext((boxMap) => { boxMap.set(key as never, value as never) - expect((boxMap as DeliberateAny).get(key)).toEqual(value) + if (value instanceof ARC4Encoded) { + expect((boxMap as DeliberateAny).get(key).bytes).toEqual(value.bytes) + } else { + expect((boxMap as DeliberateAny).get(key)).toEqual(value) + } + const newBytesValue = toBytes(newValue) const fullKey = keyPrefix.concat(toBytes(key)) op.Box.put(fullKey, newBytesValue) const [opContent, _] = op.Box.get(fullKey) expect(opContent).toEqual(newBytesValue) - expect((boxMap as DeliberateAny).get(key)).toEqual(newValue) + if (newValue instanceof ARC4Encoded) { + expect((boxMap as DeliberateAny).get(key).bytes).toEqual(newValue.bytes) + } else { + expect((boxMap as DeliberateAny).get(key)).toEqual(newValue) + } }) }) }) diff --git a/tests/references/box.spec.ts b/tests/references/box.spec.ts index b61dfce..c64894a 100644 --- a/tests/references/box.spec.ts +++ b/tests/references/box.spec.ts @@ -1,8 +1,10 @@ import { BigUint, biguint, Box, bytes, Bytes, op, uint64, Uint64 } from '@algorandfoundation/algorand-typescript' import { TestExecutionContext } from '@algorandfoundation/algorand-typescript-testing' +import { ARC4Encoded, DynamicArray, interpretAsArc4, Str, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' import { itob } from '@algorandfoundation/algorand-typescript/op' import { afterEach, describe, expect, it, test } from 'vitest' -import { asBigUintCls, asBytes, asUint64Cls, toBytes } from '../../src/util' +import { DeliberateAny } from '../../src/typescript-helpers' +import { asBytes, toBytes } from '../../src/util' import { BoxContract } from '../artifacts/box-contract/contract.algo' const BOX_NOT_CREATED_ERROR = 'Box has not been created' @@ -10,36 +12,85 @@ const BOX_NOT_CREATED_ERROR = 'Box has not been created' describe('Box', () => { const ctx = new TestExecutionContext() const key = Bytes('test_key') - const testUint64Box = (test: (box: Box) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const box = Box({ key }) - test(box) - }) - } - const testBytesBox = (test: (box: Box) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const box = Box({ key }) - test(box) - }) - } - const testStringBox = (test: (box: Box) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const box = Box({ key }) - test(box) - }) - } - const testBigUintBox = (test: (box: Box) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const box = Box({ key }) - test(box) - }) - } - const testBooleanBox = (test: (box: Box) => void) => { - ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { - const box = Box({ key }) - test(box) - }) - } + const testData = [ + { + value: Uint64(100), + newValue: Uint64(200), + emptyValue: Uint64(0), + withBoxContext: (test: (box: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const box = Box({ key }) + test(box) + }) + }, + }, + { + value: Bytes('Test1'), + newValue: Bytes('hello'), + emptyValue: Bytes(''), + withBoxContext: (test: (box: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const box = Box({ key }) + test(box) + }) + }, + }, + { + value: 'Test1', + newValue: 'hello', + emptyValue: '', + withBoxContext: (test: (box: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const box = Box({ key }) + test(box) + }) + }, + }, + { + value: BigUint(100), + newValue: BigUint(200), + emptyValue: BigUint(0), + withBoxContext: (test: (box: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const box = Box({ key }) + test(box) + }) + }, + }, + { + value: true, + newValue: false, + emptyValue: false, + withBoxContext: (test: (box: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const box = Box({ key }) + test(box) + }) + }, + }, + { + value: new Str('Test1'), + newValue: new Str('hello'), + emptyValue: interpretAsArc4(Bytes('')), + withBoxContext: (test: (boxMap: Box) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = Box({ key }) + test(boxMap) + }) + }, + }, + { + value: new DynamicArray(new UintN64(100), new UintN64(200)), + newValue: new DynamicArray(new UintN64(200), new UintN64(300)), + emptyValue: interpretAsArc4>(Bytes('')), + withBoxContext: (test: (boxMap: Box>) => void) => { + ctx.txn.createScope([ctx.any.txn.applicationCall()]).execute(() => { + const boxMap = Box>({ key }) + test(boxMap) + }) + }, + }, + ] afterEach(() => { ctx.reset() @@ -55,14 +106,8 @@ describe('Box', () => { }) }) - // TODO: add tests for settign arc4 types as value - test.each([ - [Uint64(100), testUint64Box], - [Bytes('Test'), testBytesBox], - ['Test', testStringBox], - [BigUint(100), testBigUintBox], - ])('%s can be set as value', (value, testBox) => { - testBox((box) => { + test.each(testData)('%s can be set as value', ({ value, withBoxContext }) => { + withBoxContext((box) => { box.value = value const [content, exists] = op.Box.get(key) @@ -74,14 +119,8 @@ describe('Box', () => { }) }) - // // TODO: add tests for settign arc4 types as value - test.each([ - [Uint64(100), testUint64Box], - [Bytes('Test'), testBytesBox], - ['Test', testStringBox], - [BigUint(100), testBigUintBox], - ])('%s value can be delete', (value, testBox) => { - testBox((box) => { + test.each(testData)('%s value can be delete', ({ value, withBoxContext }) => { + withBoxContext((box) => { box.value = value box.delete() @@ -95,14 +134,8 @@ describe('Box', () => { }) }) - // // TODO: add tests for settign arc4 types as value - test.each([ - [Uint64(100), testUint64Box], - [Bytes('Test'), testBytesBox], - ['Test', testStringBox], - [BigUint(100), testBigUintBox], - ])('can retrieve existing value %s using maybe', (value, testBox) => { - testBox((box) => { + test.each(testData)('can retrieve existing value %s using maybe', ({ value, withBoxContext }) => { + withBoxContext((box) => { box.value = value const [content, exists] = box.maybe() @@ -114,14 +147,8 @@ describe('Box', () => { }) }) - // // TODO: add tests for settign arc4 types as value - test.each([ - [Uint64(100), testUint64Box, Uint64(0)], - [Bytes('Test'), testBytesBox, Bytes('')], - ['Test', testStringBox, ''], - [BigUint(100), testBigUintBox, BigUint(0)], - ])('can retrieve non-existing value using maybe', (value, testBox, expectedValue) => { - testBox((box) => { + test.each(testData)('can retrieve non-existing value using maybe', ({ value, emptyValue, withBoxContext }) => { + withBoxContext((box) => { box.value = value box.delete() @@ -131,42 +158,49 @@ describe('Box', () => { expect(exists).toBe(false) expect(opExists).toBe(false) expect(opContent).toEqual(Bytes('')) - expect(content).toEqual(expectedValue) + if (content instanceof ARC4Encoded) { + expect(content.bytes).toEqual((emptyValue as ARC4Encoded).bytes) + } else { + expect(content).toEqual(emptyValue) + } }) }) it('can store enum values', () => { const contract = ctx.contract.create(BoxContract) - const deferredStoreCall = ctx.txn.deferAppCall(contract, contract.storeEnums) - const deferredReadCall = ctx.txn.deferAppCall(contract, contract.read_enums) + const deferredStoreCall = ctx.txn.deferAppCall(contract, contract.storeEnums, 'storeEnums') + const deferredReadCall = ctx.txn.deferAppCall(contract, contract.read_enums, 'read_enums') ctx.txn.createScope([deferredStoreCall, deferredReadCall]).execute(() => { deferredStoreCall.submit() - const [oca, txn] = deferredReadCall.submit() + const [oca, txn] = deferredReadCall.submit().native const app = ctx.ledger.getApplicationForContract(contract) - expect(toBytes(ctx.ledger.getBox(app, 'oca'))).toEqual(itob(oca)) - expect(toBytes(ctx.ledger.getBox(app, 'txn'))).toEqual(itob(txn)) + expect(toBytes(ctx.ledger.getBox(app, 'oca'))).toEqual(itob(oca.native)) + expect(toBytes(ctx.ledger.getBox(app, 'txn'))).toEqual(itob(txn.native)) }) }) - test.each([ - [Uint64(100), Uint64(200), asUint64Cls(200).toBytes().asAlgoTs(), testUint64Box], - [BigUint(100), BigUint(200), asBigUintCls(200).toBytes().asAlgoTs(), testBigUintBox], - [Bytes('abc'), Bytes('def'), Bytes('def'), testBytesBox], - ['abc', 'def', Bytes('def'), testStringBox], - [true, false, asUint64Cls(0).toBytes().asAlgoTs(), testBooleanBox], - ])('can get typed value after using op.Box.put', (value, newValue, newBytesValue, testBox) => { - testBox((box) => { + test.each(testData)('can get typed value after using op.Box.put', ({ value, newValue, withBoxContext }) => { + withBoxContext((box) => { box.value = value - expect(box.value).toEqual(value) + if (value instanceof ARC4Encoded) { + expect((box as DeliberateAny).get(key).bytes).toEqual(value.bytes) + } else { + expect(box.value).toEqual(value) + } + const newBytesValue = toBytes(newValue) op.Box.put(key, newBytesValue) const [opContent, _] = op.Box.get(key) expect(opContent).toEqual(newBytesValue) - expect(box.value).toEqual(newValue) + if (newValue instanceof ARC4Encoded) { + expect((box as DeliberateAny).get(key).bytes).toEqual(newValue.bytes) + } else { + expect(box.value).toEqual(newValue) + } }) }) }) diff --git a/tests/state-op-codes.spec.ts b/tests/state-op-codes.spec.ts index 7fa0ade..8bbeea6 100644 --- a/tests/state-op-codes.spec.ts +++ b/tests/state-op-codes.spec.ts @@ -2,10 +2,12 @@ import { AlgoAmount } from '@algorandfoundation/algokit-utils/types/amount' import { ApplicationClient } from '@algorandfoundation/algokit-utils/types/app-client' import { AppSpec } from '@algorandfoundation/algokit-utils/types/app-spec' import { Account, arc4, bytes, Bytes, internal, op, TransactionType, uint64, Uint64 } from '@algorandfoundation/algorand-typescript' +import { DynamicBytes, UintN64 } from '@algorandfoundation/algorand-typescript/arc4' import { afterEach, describe, expect, it, test } from 'vitest' import { TestExecutionContext } from '../src' -import { MIN_TXN_FEE, ZERO_ADDRESS } from '../src/constants' +import { ABI_RETURN_VALUE_LOG_PREFIX, MIN_TXN_FEE, ZERO_ADDRESS } from '../src/constants' import { testInvariant } from '../src/errors' +import { Block, gloadBytes, gloadUint64 } from '../src/impl' import { AccountCls } from '../src/impl/account' import { InnerTxn } from '../src/impl/itxn' import { ApplicationTransaction } from '../src/impl/transactions' @@ -42,7 +44,6 @@ import { INITIAL_BALANCE_MICRO_ALGOS, } from './avm-invoker' import { asUint8Array } from './util' -import { Block, gloadBytes, gloadUint64 } from '../src/impl' describe('State op codes', async () => { const ctx = new TestExecutionContext() @@ -284,22 +285,12 @@ describe('State op codes', async () => { it('should be able to pass app call txn as app arg', async () => { const appCallTxn = ctx.any.txn.applicationCall({ - appArgs: [Bytes('some_value()uint64')], - appLogs: [Bytes('this is a log statement')], + appArgs: [arc4.methodSelector('some_value()uint64')], + appLogs: [ABI_RETURN_VALUE_LOG_PREFIX.concat(new UintN64(2).bytes)], }) const contract = ctx.contract.create(AppExpectingEffects) contract.log_group(appCallTxn) }) - - // TODO: uncomment when arc4 stubs are implemented - // it('should be able to pass app call txn as app arg', async () => { - // const appCallTxn = ctx.any.txn.applicationCall({ - // appArgs: [arc4.arc4Signature("some_value()uint64")], - // logs: [arc4Prefix.concat(arc4.Uint64(2).bytes)] - // }) - // const contract = ctx.contract.create(AppExpectingEffects) - // contract.log_group(appCallTxn) - // }) }) describe('itxn', async () => { @@ -491,7 +482,7 @@ describe('State op codes', async () => { const secondContract = ctx.contract.create(StateAppGlobalExContract) const secondApp = ctx.ledger.getApplicationForContract(secondContract) expect(secondApp.globalNumUint.valueOf()).toEqual(2) - expect(secondApp.globalNumBytes.valueOf()).toEqual(2) + expect(secondApp.globalNumBytes.valueOf()).toEqual(4) const bytesAvmResult = await getAvmResult({ appClient }, 'verify_get_ex_bytes', exApp.appId, asUint8Array(key)) @@ -501,20 +492,25 @@ describe('State op codes', async () => { expect(bytesResult).toEqual(bytesAvmResult) }) - // TODO: implement test_app_global_ex_get_arc4 test method when arc4 stubs are implemented + test.each(['global_arc4_bytes_explicit', 'global_arc4_bytes'])( + 'should be able to use _ex methods to get arc4 state values of another app', + async (key) => { + const secondContract = ctx.contract.create(StateAppGlobalExContract) + const secondApp = ctx.ledger.getApplicationForContract(secondContract) + expect(secondApp.globalNumUint.valueOf()).toEqual(2) + expect(secondApp.globalNumBytes.valueOf()).toEqual(4) + + const bytesAvmResult = await getAvmResult({ appClient }, 'verify_get_ex_bytes', exApp.appId, asUint8Array(key)) + + const contract = ctx.contract.create(StateAppGlobalContract) + const bytesResult = contract.verify_get_ex_bytes(secondApp, Bytes(key)) + + expect(bytesResult).toEqual(bytesAvmResult) + }, + ) }) describe('AppLocal', async () => { - const tryOptIn = async (client: ApplicationClient) => { - try { - await client.optIn({ method: 'opt_in', methodArgs: [] }) - } catch (e) { - if (!(e as DeliberateAny).message.includes('has already opted in to app')) { - throw e - } - // ignore error if account has already opted in - } - } const appClient = await getAlgorandAppClient(appLocalAppSpecJson as AppSpec) const [exAppClient, exApp] = await getAlgorandAppClientWithApp(appLocalExAppSpecJson as AppSpec) await tryOptIn(appClient) @@ -566,7 +562,7 @@ describe('State op codes', async () => { const secondContract = ctx.contract.create(StateAppLocalExContract) const secondApp = ctx.ledger.getApplicationForContract(secondContract) expect(secondApp.localNumUint.valueOf()).toEqual(1) - expect(secondApp.localNumBytes.valueOf()).toEqual(1) + expect(secondApp.localNumBytes.valueOf()).toEqual(2) const bytesAvmResult = await getAvmResult({ appClient }, 'verify_get_ex_bytes', localNetAccount.addr, exApp.appId, asUint8Array(key)) @@ -577,6 +573,32 @@ describe('State op codes', async () => { expect(bytesResult).toEqual(bytesAvmResult) }) - // TODO: implement test_app_local_ex_get_arc4 test method when arc4 stubs are implemented + it('should be able to use _ex methods to get arc4 state values of another app', async () => { + const key = 'local_arc4_bytes' + const localNetAccount = await getLocalNetDefaultAccount() + const account = Account(Bytes.fromBase32(localNetAccount.addr)) + const secondContract = ctx.contract.create(StateAppLocalExContract) + const secondApp = ctx.ledger.getApplicationForContract(secondContract) + expect(secondApp.localNumUint.valueOf()).toEqual(1) + expect(secondApp.localNumBytes.valueOf()).toEqual(2) + + const bytesAvmResult = await getAvmResult({ appClient }, 'verify_get_ex_bytes', localNetAccount.addr, exApp.appId, asUint8Array(key)) + + const contract = ctx.contract.create(StateAppLocalContract) + secondContract.localArc4Bytes(account).value = new DynamicBytes('dummy_arc4_bytes') + const bytesResult = contract.verify_get_ex_bytes(account, secondApp, Bytes(key)) + + expect(bytesResult).toEqual(bytesAvmResult) + }) }) }) +const tryOptIn = async (client: ApplicationClient) => { + try { + await client.optIn({ method: 'opt_in', methodArgs: [] }) + } catch (e) { + if (!(e as DeliberateAny).message.includes('has already opted in to app')) { + throw e + } + // ignore error if account has already opted in + } +}