@akta/sdk 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/auction/index.js +5 -5
  2. package/dist/auction/index.mjs +4 -4
  3. package/dist/{chunk-DRN45QLK.mjs → chunk-35FZLG7E.mjs} +3 -3
  4. package/dist/{chunk-3NSSJP42.js → chunk-3K3PI3MS.js} +7 -7
  5. package/dist/{chunk-3NSSJP42.js.map → chunk-3K3PI3MS.js.map} +1 -1
  6. package/dist/{chunk-XU4ITGXG.js → chunk-3MYGUB46.js} +5 -5
  7. package/dist/{chunk-XU4ITGXG.js.map → chunk-3MYGUB46.js.map} +1 -1
  8. package/dist/{chunk-URJA7W37.js → chunk-4HUNFJHH.js} +34 -34
  9. package/dist/{chunk-URJA7W37.js.map → chunk-4HUNFJHH.js.map} +1 -1
  10. package/dist/{chunk-WXJI33BX.js → chunk-4M47ML5B.js} +16 -16
  11. package/dist/{chunk-WXJI33BX.js.map → chunk-4M47ML5B.js.map} +1 -1
  12. package/dist/{chunk-CSBKLP4L.mjs → chunk-5UOVWSOZ.mjs} +2 -2
  13. package/dist/{chunk-5NJZUJMU.js → chunk-6MJUMIDU.js} +5 -5
  14. package/dist/{chunk-5NJZUJMU.js.map → chunk-6MJUMIDU.js.map} +1 -1
  15. package/dist/{chunk-SRJSQAZG.mjs → chunk-6PQXPZ4L.mjs} +4 -4
  16. package/dist/{chunk-3PNY2JHX.mjs → chunk-7W2QW4LL.mjs} +3 -3
  17. package/dist/{chunk-GKK4NN54.mjs → chunk-ABYVO2ES.mjs} +4 -4
  18. package/dist/{chunk-O3UY4REA.mjs → chunk-ADVSZM5D.mjs} +3 -3
  19. package/dist/{chunk-PREUQDP5.mjs → chunk-AT43XHIC.mjs} +2 -2
  20. package/dist/{chunk-I2QWPEZJ.mjs → chunk-BM3VEIPN.mjs} +4 -4
  21. package/dist/{chunk-BP2QQVM2.mjs → chunk-CELIOF7S.mjs} +2 -2
  22. package/dist/{chunk-BP2QQVM2.mjs.map → chunk-CELIOF7S.mjs.map} +1 -1
  23. package/dist/{chunk-S74KUBXO.js → chunk-CNBZJOUH.js} +4 -4
  24. package/dist/{chunk-S74KUBXO.js.map → chunk-CNBZJOUH.js.map} +1 -1
  25. package/dist/{chunk-7CYO4FRU.mjs → chunk-CRFLWLZM.mjs} +3 -3
  26. package/dist/{chunk-S5VB2RG3.mjs → chunk-FGIEL2OP.mjs} +3 -3
  27. package/dist/{chunk-HPP6DCRO.js → chunk-FYPYEWGQ.js} +5 -5
  28. package/dist/{chunk-HPP6DCRO.js.map → chunk-FYPYEWGQ.js.map} +1 -1
  29. package/dist/{chunk-J2NZ4M55.mjs → chunk-HVPJ2WJQ.mjs} +3 -3
  30. package/dist/{chunk-4K2ZMC7H.js → chunk-I5AT2KOB.js} +2 -2
  31. package/dist/{chunk-4K2ZMC7H.js.map → chunk-I5AT2KOB.js.map} +1 -1
  32. package/dist/{chunk-WSWJUZEE.mjs → chunk-IDV5XTW4.mjs} +3 -3
  33. package/dist/{chunk-CTG7ZYXI.js → chunk-IUN2ES43.js} +8 -8
  34. package/dist/{chunk-CTG7ZYXI.js.map → chunk-IUN2ES43.js.map} +1 -1
  35. package/dist/{chunk-4RY6XBZX.mjs → chunk-K5PD3LNB.mjs} +4 -4
  36. package/dist/{chunk-H6WDKSFN.js → chunk-KCBZBDE6.js} +8 -8
  37. package/dist/{chunk-H6WDKSFN.js.map → chunk-KCBZBDE6.js.map} +1 -1
  38. package/dist/{chunk-QRX6JALT.js → chunk-KTA4UUAL.js} +6 -6
  39. package/dist/{chunk-QRX6JALT.js.map → chunk-KTA4UUAL.js.map} +1 -1
  40. package/dist/{chunk-V6WMM5HK.js → chunk-LG7TVAL6.js} +7 -7
  41. package/dist/{chunk-V6WMM5HK.js.map → chunk-LG7TVAL6.js.map} +1 -1
  42. package/dist/{chunk-RBK7C6YC.js → chunk-MG6VYVYU.js} +5 -5
  43. package/dist/{chunk-RBK7C6YC.js.map → chunk-MG6VYVYU.js.map} +1 -1
  44. package/dist/{chunk-HDOL6YZD.js → chunk-NIQLRKUH.js} +6 -6
  45. package/dist/{chunk-HDOL6YZD.js.map → chunk-NIQLRKUH.js.map} +1 -1
  46. package/dist/{chunk-7Q75O4NN.mjs → chunk-ORBRQGTP.mjs} +3 -3
  47. package/dist/{chunk-5JASK4RN.mjs → chunk-RCGFZWNB.mjs} +3 -3
  48. package/dist/{chunk-BBDHRXDA.js → chunk-REHPQ5MP.js} +10 -10
  49. package/dist/{chunk-BBDHRXDA.js.map → chunk-REHPQ5MP.js.map} +1 -1
  50. package/dist/{chunk-H6GGQNTY.js → chunk-TAYTLPIM.js} +8 -8
  51. package/dist/{chunk-H6GGQNTY.js.map → chunk-TAYTLPIM.js.map} +1 -1
  52. package/dist/{chunk-4PRB4GYJ.mjs → chunk-XAYLPXAU.mjs} +2 -2
  53. package/dist/{chunk-2LTBRR7Z.js → chunk-XBVXSRWD.js} +5 -5
  54. package/dist/{chunk-2LTBRR7Z.js.map → chunk-XBVXSRWD.js.map} +1 -1
  55. package/dist/{chunk-HMPVHEWD.js → chunk-YW5AOFQI.js} +6 -6
  56. package/dist/{chunk-HMPVHEWD.js.map → chunk-YW5AOFQI.js.map} +1 -1
  57. package/dist/{chunk-LF6QXKLT.mjs → chunk-ZSQDFCJC.mjs} +3 -3
  58. package/dist/dao/index.js +5 -5
  59. package/dist/dao/index.mjs +4 -4
  60. package/dist/escrow/index.js +4 -4
  61. package/dist/escrow/index.mjs +3 -3
  62. package/dist/gates/index.js +4 -4
  63. package/dist/gates/index.mjs +3 -3
  64. package/dist/hyper-swap/index.js +4 -4
  65. package/dist/hyper-swap/index.mjs +3 -3
  66. package/dist/index.js +19 -19
  67. package/dist/index.mjs +18 -18
  68. package/dist/marketplace/index.js +5 -5
  69. package/dist/marketplace/index.mjs +4 -4
  70. package/dist/meta-merkles/index.js +4 -4
  71. package/dist/meta-merkles/index.mjs +3 -3
  72. package/dist/poll/index.js +4 -4
  73. package/dist/poll/index.mjs +3 -3
  74. package/dist/prize-box/index.js +4 -4
  75. package/dist/prize-box/index.mjs +3 -3
  76. package/dist/raffle/index.js +5 -5
  77. package/dist/raffle/index.mjs +4 -4
  78. package/dist/rewards/index.js +4 -4
  79. package/dist/rewards/index.mjs +3 -3
  80. package/dist/social/index.js +3 -3
  81. package/dist/social/index.mjs +2 -2
  82. package/dist/staking/index.js +4 -4
  83. package/dist/staking/index.mjs +3 -3
  84. package/dist/staking-pool/index.js +4 -4
  85. package/dist/staking-pool/index.mjs +3 -3
  86. package/dist/subscriptions/index.js +4 -4
  87. package/dist/subscriptions/index.mjs +3 -3
  88. package/dist/wallet/index.js +4 -4
  89. package/dist/wallet/index.mjs +3 -3
  90. package/package.json +1 -1
  91. /package/dist/{chunk-DRN45QLK.mjs.map → chunk-35FZLG7E.mjs.map} +0 -0
  92. /package/dist/{chunk-CSBKLP4L.mjs.map → chunk-5UOVWSOZ.mjs.map} +0 -0
  93. /package/dist/{chunk-SRJSQAZG.mjs.map → chunk-6PQXPZ4L.mjs.map} +0 -0
  94. /package/dist/{chunk-3PNY2JHX.mjs.map → chunk-7W2QW4LL.mjs.map} +0 -0
  95. /package/dist/{chunk-GKK4NN54.mjs.map → chunk-ABYVO2ES.mjs.map} +0 -0
  96. /package/dist/{chunk-O3UY4REA.mjs.map → chunk-ADVSZM5D.mjs.map} +0 -0
  97. /package/dist/{chunk-PREUQDP5.mjs.map → chunk-AT43XHIC.mjs.map} +0 -0
  98. /package/dist/{chunk-I2QWPEZJ.mjs.map → chunk-BM3VEIPN.mjs.map} +0 -0
  99. /package/dist/{chunk-7CYO4FRU.mjs.map → chunk-CRFLWLZM.mjs.map} +0 -0
  100. /package/dist/{chunk-S5VB2RG3.mjs.map → chunk-FGIEL2OP.mjs.map} +0 -0
  101. /package/dist/{chunk-J2NZ4M55.mjs.map → chunk-HVPJ2WJQ.mjs.map} +0 -0
  102. /package/dist/{chunk-WSWJUZEE.mjs.map → chunk-IDV5XTW4.mjs.map} +0 -0
  103. /package/dist/{chunk-4RY6XBZX.mjs.map → chunk-K5PD3LNB.mjs.map} +0 -0
  104. /package/dist/{chunk-7Q75O4NN.mjs.map → chunk-ORBRQGTP.mjs.map} +0 -0
  105. /package/dist/{chunk-5JASK4RN.mjs.map → chunk-RCGFZWNB.mjs.map} +0 -0
  106. /package/dist/{chunk-4PRB4GYJ.mjs.map → chunk-XAYLPXAU.mjs.map} +0 -0
  107. /package/dist/{chunk-LF6QXKLT.mjs.map → chunk-ZSQDFCJC.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-RBK7C6YC.js","../src/rewards/index.ts","../src/generated/RewardsClient.ts","../src/rewards/errors.ts"],"names":[],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-RBK7C6YC.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { ABIMethod } from \"@algorandfoundation/algokit-utils/abi\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n RewardsClient,\n RewardsFactory,\n RewardsComposer,\n DisbursementDetails,\n RewardsMbrData,\n} from '../generated/RewardsClient';\nimport { ExpandedSendParams, MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n GetMbrParams,\n GetAllocationMbrCreditShortfallParams,\n GetDisbursementParams,\n GetUserAllocationParams,\n RewardsGlobalState,\n OptInAssetParams,\n CreateDisbursementParams,\n EditDisbursementParams,\n FundMbrCreditsParams,\n WithdrawMbrCreditsParams,\n CreateUserAllocationsParams,\n CreateAsaUserAllocationsParams,\n FinalizeDisbursementParams,\n CreateInstantDisbursementParams,\n CreateInstantAsaDisbursementParams,\n CreateAsaDisbursementFromGroupParams,\n ClaimRewardsParams,\n ReclaimRewardsParams,\n UpdateAkitaDaoParams,\n UserAllocation,\n} from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./errors\";\n\n/** Base references available per transaction */\nconst BASE_REFERENCES = 8;\n/** References added by each opUp call */\nconst REFERENCES_PER_OPUP = 8;\nconst MAX_ALGORAND_GROUP_SIZE = 16;\nconst CREATE_ASA_DISBURSEMENT_FROM_GROUP = ABIMethod.fromSignature(\n \"createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64\",\n);\n\n/**\n * SDK for interacting with the Rewards contract.\n * Use this to create disbursements, manage allocations, and claim/reclaim rewards.\n */\nexport class RewardsSDK extends BaseSDK<RewardsClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: RewardsFactory, ...params }, ENV_VAR_NAMES.REWARDS_APP_ID);\n }\n\n // ========== OpUp Helpers ==========\n\n /**\n * Calculates the number of opUp calls needed for a given reference count.\n * @param referencesNeeded - Number of references needed for the operation\n * @param baseReferences - Base references available (default 8)\n * @returns Number of opUp calls needed (0 if none needed)\n */\n private calculateOpUpsNeeded(referencesNeeded: number, baseReferences = BASE_REFERENCES): number {\n if (referencesNeeded <= baseReferences) {\n return 0;\n }\n return Math.ceil((referencesNeeded - baseReferences) / REFERENCES_PER_OPUP);\n }\n\n /**\n * Adds the required number of opUp calls to a transaction group.\n * Each opUp call adds 8 more reference slots to the group.\n */\n private addOpUps<T extends unknown[]>(\n group: RewardsComposer<T>,\n count: number,\n sendParams: ExpandedSendParams,\n ): void {\n for (let i = 0; i < count; i++) {\n group.opUp({\n ...sendParams,\n args: {},\n // Add unique note to avoid duplicate transaction issues\n note: i > 0 ? `opUp-${i}` : undefined,\n });\n }\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current global state of the rewards contract.\n */\n async getState(): Promise<RewardsGlobalState> {\n const state = await this.client.state.global.getAll();\n\n return {\n disbursementId: state.disbursementId ?? 1n,\n version: state.version ?? '',\n akitaDao: state.akitaDao ?? 0n,\n };\n }\n\n /**\n * Gets the MBR (Minimum Balance Requirement) data for creating disbursements.\n * @param title - The disbursement title\n * @param note - The disbursement note\n */\n async mbr({ title, note }: GetMbrParams): Promise<RewardsMbrData> {\n return await this.client.mbr({ args: { title, note } });\n }\n\n /**\n * Gets a specific disbursement by ID.\n */\n async getDisbursement({ id }: GetDisbursementParams): Promise<DisbursementDetails> {\n const disbursement = await this.client.state.box.disbursements.value(id);\n\n if (disbursement === undefined) {\n throw new Error(`Disbursement ${id} not found`);\n }\n\n return disbursement;\n }\n\n /**\n * Gets all disbursements as a map.\n */\n async getDisbursements(): Promise<Map<bigint, DisbursementDetails>> {\n const disbursements = await this.client.state.box.disbursements.getMap();\n return new Map(Array.from(disbursements.entries()).map(([key, value]) => [BigInt(key), value]));\n }\n\n /**\n * Gets a user's allocation for a specific disbursement and asset.\n *\n * NOTE: Property order MUST match the APP_SPEC struct declaration order\n * (address, asset, disbursementId). v10's ABIStructType encoder uses\n * Object.values() which iterates in input-object property order and then\n * maps positionally onto the declared struct fields — a mismatched order\n * silently produces the wrong box key.\n */\n async getUserAllocation({ address, disbursementId, asset }: GetUserAllocationParams): Promise<bigint> {\n const allocation = await this.client.state.box.userAllocations.value({\n address,\n asset: BigInt(asset),\n disbursementId: BigInt(disbursementId),\n });\n\n if (allocation === undefined) {\n throw new Error(`Allocation not found for address ${address}, disbursement ${disbursementId}`);\n }\n\n return allocation;\n }\n\n /**\n * Checks if a user has an allocation for a specific disbursement and asset.\n *\n * NOTE: Property order MUST match APP_SPEC struct order (address, asset,\n * disbursementId). See getUserAllocation for the full explanation.\n */\n async hasAllocation({ address, disbursementId, asset }: GetUserAllocationParams): Promise<boolean> {\n try {\n const allocation = await this.client.state.box.userAllocations.value({\n address,\n asset: BigInt(asset),\n disbursementId: BigInt(disbursementId),\n });\n return allocation !== undefined;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the additional MBR credit needed to create allocation boxes.\n */\n async allocationMbrCreditShortfall({\n id,\n allocationCount,\n }: GetAllocationMbrCreditShortfallParams): Promise<bigint> {\n return await this.client.allocationMbrCreditShortfall({\n args: { id, allocationCount },\n });\n }\n\n // ========== Write Methods ==========\n\n /**\n * Opts the rewards contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptInAssetParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Asset opt-in costs 100,000 microAlgo\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(100_000),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({\n ...sendParams,\n extraFee: microAlgo(1000),\n args: {\n payment,\n asset,\n },\n });\n }\n\n /**\n * Creates a new disbursement.\n * Returns the disbursement ID.\n */\n async createDisbursement({\n sender,\n signer,\n title,\n timeToUnlock,\n expiration,\n note,\n mbrCredits = 0n,\n }: CreateDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get MBR for this disbursement\n const mbrData = await this.mbr({ title, note });\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.disbursements + BigInt(mbrCredits)),\n receiver: this.client.appAddress,\n });\n\n const { return: disbursementId } = await this.client.send.createDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n title,\n timeToUnlock,\n expiration,\n note,\n },\n });\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Edits an existing disbursement (only before finalization).\n */\n async editDisbursement({\n sender,\n signer,\n id,\n title,\n timeToUnlock,\n expiration,\n note,\n }: EditDisbursementParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.editDisbursement({\n ...sendParams,\n args: {\n id,\n title,\n timeToUnlock,\n expiration,\n note,\n },\n });\n }\n\n /**\n * Helper to format allocations for the contract.\n */\n private formatAllocations(allocations: UserAllocation[]): [string, bigint | number][] {\n return allocations.map(a => [a.address, a.amount]);\n }\n\n /**\n * Calculates the total amount from allocations.\n */\n private sumAllocations(allocations: UserAllocation[]): bigint {\n return allocations.reduce((sum, a) => sum + BigInt(a.amount), 0n);\n }\n\n /**\n * Funds reusable MBR credits on a disbursement.\n */\n async fundMbrCredits({ sender, signer, id, amount }: FundMbrCreditsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(BigInt(amount)),\n receiver: this.client.appAddress,\n });\n\n await (this.client.send as any).fundMbrCredits({\n ...sendParams,\n args: { id, payment },\n });\n }\n\n /**\n * Withdraws reusable MBR credits from a disbursement.\n */\n async withdrawMbrCredits({ sender, signer, id, amount }: WithdrawMbrCreditsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await (this.client.send as any).withdrawMbrCredits({\n ...sendParams,\n extraFee: microAlgo(1000),\n args: { id, amount },\n });\n }\n\n /**\n * Creates ALGO allocations using existing disbursement MBR credits.\n * Fund credits separately with fundMbrCredits when allocationMbrCreditShortfall reports a shortfall.\n */\n async createUserAllocations({\n sender,\n signer,\n id,\n allocations,\n }: CreateUserAllocationsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const totalAmount = this.sumAllocations(allocations);\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(totalAmount),\n receiver: this.client.appAddress,\n });\n\n const referencesNeeded = allocations.length + 2;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await (this.client.send as any).createUserAllocations({\n ...sendParams,\n args: {\n payment,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n } else {\n const group = this.client.newGroup();\n\n (group as any).createUserAllocations({\n ...sendParams,\n args: {\n payment,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group as any, opUpsNeeded, sendParams);\n await group.send(sendParams);\n }\n }\n\n /**\n * Creates ASA allocations using existing disbursement MBR credits.\n * Fund credits separately with fundMbrCredits when allocationMbrCreditShortfall reports a shortfall.\n */\n async createAsaUserAllocations({\n sender,\n signer,\n id,\n asset,\n allocations,\n }: CreateAsaUserAllocationsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const totalAmount = this.sumAllocations(allocations);\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: totalAmount,\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n const referencesNeeded = allocations.length + 3;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await (this.client.send as any).createAsaUserAllocations({\n ...sendParams,\n args: {\n assetXfer,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n } else {\n const group = this.client.newGroup();\n\n (group as any).createAsaUserAllocations({\n ...sendParams,\n args: {\n assetXfer,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group as any, opUpsNeeded, sendParams);\n await group.send(sendParams);\n }\n }\n\n /**\n * Creates and finalizes a multi-ASA disbursement in a single transaction group.\n *\n * Group shape:\n * 0: MBR payment\n * 1..N: ASA transfers to the rewards app\n * N+1: createAsaDisbursementFromGroup app call\n *\n * This supports up to 14 ASA allocations in one Algorand group.\n */\n async createAsaDisbursementFromGroup({\n sender,\n signer,\n title,\n timeToUnlock,\n expiration,\n note,\n allocations,\n }: CreateAsaDisbursementFromGroupParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n const transactionCount = 1 + allocations.length + 1;\n if (transactionCount > MAX_ALGORAND_GROUP_SIZE) {\n throw new Error(\n `ASA disbursement requires ${transactionCount} transactions; maximum group size is ${MAX_ALGORAND_GROUP_SIZE}`,\n );\n }\n\n const { disbursementId } = await this.getState();\n const mbrData = await this.mbr({ title, note });\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.disbursements + (mbrData.userAllocations * BigInt(allocations.length))),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n (group as any).addTransaction(mbrPayment, sendParams.signer);\n\n for (const allocation of allocations) {\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n receiver: this.client.appAddress,\n assetId: BigInt(allocation.asset),\n amount: BigInt(allocation.amount),\n });\n (group as any).addTransaction(assetXfer, sendParams.signer);\n }\n\n const appCall = await this.client.algorand.createTransaction.appCallMethodCall({\n ...sendParams,\n appId: this.client.appId,\n method: CREATE_ASA_DISBURSEMENT_FROM_GROUP,\n args: [\n 0n,\n 1n,\n title,\n timeToUnlock,\n expiration,\n note,\n allocations.map(({ address, amount }) => [address, amount]),\n ],\n note: `asa-disbursement-${disbursementId}`,\n });\n\n (group as any).addTransaction(appCall, sendParams.signer);\n await group.send(sendParams);\n\n return disbursementId;\n }\n\n /**\n * Finalizes a disbursement, locking it for distribution.\n */\n async finalizeDisbursement({ sender, signer, id }: FinalizeDisbursementParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalizeDisbursement({\n ...sendParams,\n args: { id },\n });\n }\n\n /**\n * Creates and finalizes an ALGO disbursement in a single call.\n * Returns the disbursement ID.\n * Automatically adds opUp calls for large allocation batches.\n */\n async createInstantDisbursement({\n sender,\n signer,\n timeToUnlock,\n expiration,\n allocations,\n }: CreateInstantDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // MinDisbursementsMBR (41,700) + UserAllocationMBR (25,300) per allocation\n const MIN_DISBURSEMENTS_MBR = 41_700n;\n const USER_ALLOCATION_MBR = 25_300n;\n\n const mbrAmount = MIN_DISBURSEMENTS_MBR + (USER_ALLOCATION_MBR * BigInt(allocations.length));\n const totalAmount = this.sumAllocations(allocations);\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrAmount + totalAmount),\n receiver: this.client.appAddress,\n });\n\n // Each allocation needs ~1 box reference, plus 1 for disbursement box\n const referencesNeeded = allocations.length + 1;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n let disbursementId: bigint | undefined;\n\n if (opUpsNeeded === 0) {\n const result = await this.client.send.createInstantDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n disbursementId = result.return;\n } else {\n const group = this.client.newGroup();\n\n group.createInstantDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n const result = await group.send(sendParams);\n disbursementId = result.returns?.[0];\n }\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create instant disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Creates and finalizes an ASA disbursement in a single call.\n * Returns the disbursement ID.\n * Automatically adds opUp calls for large allocation batches.\n */\n async createInstantAsaDisbursement({\n sender,\n signer,\n timeToUnlock,\n expiration,\n asset,\n allocations,\n }: CreateInstantAsaDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // MinDisbursementsMBR (41,700) + UserAllocationMBR (25,300) per allocation\n const MIN_DISBURSEMENTS_MBR = 41_700n;\n const USER_ALLOCATION_MBR = 25_300n;\n\n const mbrAmount = MIN_DISBURSEMENTS_MBR + (USER_ALLOCATION_MBR * BigInt(allocations.length));\n const totalAmount = this.sumAllocations(allocations);\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrAmount),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: totalAmount,\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n // Each allocation needs ~1 box reference, plus 1 for disbursement box, plus 1 for asset\n const referencesNeeded = allocations.length + 2;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n let disbursementId: bigint | undefined;\n\n if (opUpsNeeded === 0) {\n const result = await this.client.send.createInstantAsaDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n disbursementId = result.return;\n } else {\n const group = this.client.newGroup();\n\n group.createInstantAsaDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n const result = await group.send(sendParams);\n disbursementId = result.returns?.[0];\n }\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create instant ASA disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Claims rewards from one or more disbursements.\n * The caller claims their allocated rewards.\n * Automatically adds opUp calls for claiming from many disbursements.\n */\n async claimRewards({ sender, signer, rewards }: ClaimRewardsParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n // Format rewards as [id, asset] tuples\n const formattedRewards: [bigint | number, bigint | number][] = rewards.map(r => [r.id, r.asset]);\n\n // Each claim needs references for: disbursement box, allocation box, possibly asset\n // Plus inner transactions use references\n const referencesNeeded = rewards.length * 3;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await this.client.send.claimRewards({\n ...sendParams,\n // Extra fee for inner transactions (1 reward transfer per claim; MBR refund is credited)\n extraFee: microAlgo(1000 * rewards.length),\n args: {\n rewards: formattedRewards,\n },\n });\n } else {\n const group = this.client.newGroup();\n\n group.claimRewards({\n ...sendParams,\n extraFee: microAlgo(1000 * rewards.length),\n args: {\n rewards: formattedRewards,\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n await group.send(sendParams);\n }\n }\n\n /**\n * Reclaims unclaimed rewards after a disbursement has expired.\n * Only the disbursement creator can reclaim.\n * Automatically adds opUp calls for reclaiming many allocations.\n */\n async reclaimRewards({ sender, signer, id, reclaims }: ReclaimRewardsParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n // Format reclaims as [address, asset] tuples\n const formattedReclaims: [string, bigint | number][] = reclaims.map(r => [r.address, r.asset]);\n\n // Each reclaim needs references for: allocation box, possibly asset, receiver account\n const referencesNeeded = reclaims.length * 2 + 1; // +1 for disbursement box\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await this.client.send.reclaimRewards({\n ...sendParams,\n // Extra fee for inner transactions (1 reward transfer per reclaim; MBR refund is credited)\n extraFee: microAlgo(1000 * reclaims.length),\n args: {\n id,\n reclaims: formattedReclaims,\n },\n });\n } else {\n const group = this.client.newGroup();\n\n group.reclaimRewards({\n ...sendParams,\n extraFee: microAlgo(1000 * reclaims.length),\n args: {\n id,\n reclaims: formattedReclaims,\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n await group.send(sendParams);\n }\n }\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDao({ sender, signer, akitaDao }: UpdateAkitaDaoParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Rewards\",\"structs\":{\"DisbursementDetails\":[{\"name\":\"creator\",\"type\":\"address\"},{\"name\":\"finalized\",\"type\":\"bool\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"timeToUnlock\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"allocations\",\"type\":\"uint64\"},{\"name\":\"distributed\",\"type\":\"uint64\"},{\"name\":\"mbrCredits\",\"type\":\"uint64\"},{\"name\":\"usedMbrCredits\",\"type\":\"uint64\"},{\"name\":\"note\",\"type\":\"string\"}],\"RewardsMBRData\":[{\"name\":\"disbursements\",\"type\":\"uint64\"},{\"name\":\"userAllocations\",\"type\":\"uint64\"}],\"UserAllocationsKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"disbursementId\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"fundMbrCredits\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"pay\",\"name\":\"payment\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdrawMbrCredits\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"amount\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"editDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createUserAllocations\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createAsaUserAllocations\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createAsaDisbursementFromGroup\",\"args\":[{\"type\":\"uint64\",\"name\":\"mbrPaymentIndex\"},{\"type\":\"uint64\",\"name\":\"assetTransferStartIndex\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalizeDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createInstantDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createInstantAsaDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"claimRewards\",\"args\":[{\"type\":\"(uint64,uint64)[]\",\"name\":\"rewards\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"reclaimRewards\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"reclaims\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"allocationMbrCreditShortfall\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"allocationCount\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"(uint64,uint64)\",\"struct\":\"RewardsMBRData\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":1},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"disbursementID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZGlzYnVyc2VtZW50X2lk\",\"desc\":\"the disbursement id cursor\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"disbursements\":{\"keyType\":\"uint64\",\"valueType\":\"DisbursementDetails\",\"desc\":\"the disbursement map of tokens\\n\\nthe key is the uint64 id of the disbursement\\nthe value is the details of the disbursement\",\"prefix\":\"ZA==\"},\"userAllocations\":{\"keyType\":\"UserAllocationsKey\",\"valueType\":\"uint64\",\"desc\":\"the user allocations of disbursements\\n\\nthe key is the address of the qualified account with the uint64 id of the disbursement\\nthe value is the amount they are owed\",\"prefix\":\"dQ==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[915,2990,3271],\"errorMessage\":\"Box must have value\"},{\"pc\":[1205,1512,1952],\"errorMessage\":\"ERR:ALAE\"},{\"pc\":[2985,3266],\"errorMessage\":\"ERR:ALNE\"},{\"pc\":[911,1149,1453,2241,3189],\"errorMessage\":\"ERR:DBAF\"},{\"pc\":[2101,2295],\"errorMessage\":\"ERR:DBEM\"},{\"pc\":[2954],\"errorMessage\":\"ERR:DBFD\"},{\"pc\":[2922,2934],\"errorMessage\":\"ERR:DBLK\"},{\"pc\":[2115,2304],\"errorMessage\":\"ERR:DBMA\"},{\"pc\":[422,513,877,1067,1371,2171,2851,3143,3401],\"errorMessage\":\"ERR:DBNE\"},{\"pc\":[3209],\"errorMessage\":\"ERR:DBNX\"},{\"pc\":[2063,2262],\"errorMessage\":\"ERR:IDUT\"},{\"pc\":[2087,2286],\"errorMessage\":\"ERR:IDXT\"},{\"pc\":[537,553,3657,3716],\"errorMessage\":\"ERR:IMBR\"},{\"pc\":[450,463,684,700,1293,1306,1763,1782,2461,2477,2681,2694],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[3597],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[3575],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[1601,1615,1966,1986,2708,2722],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[3485],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[437,528,902,1140,1444,2232,3180],\"errorMessage\":\"ERR:YNCR\"},{\"pc\":[3469],\"errorMessage\":\"application exists\"},{\"pc\":[3456,3624],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1176,1480,1921,2412,2629,2824,3233],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[427,469,478,518,542,559,574,883,888,979,985,1073,1079,1223,1234,1239,1248,1377,1383,1530,1541,1546,1555,2001,2012,2017,2026,2093,2107,2129,2177,2183,2193,2202,2211,2219,2317,2858,2865,2874,2883,3001,3012,3017,3026,3149,3159,3167,3282,3293,3298,3307,3415,3646,3664,3676,3681,3690,3705,3723,3735,3740,3749],\"errorMessage\":\"index out of bounds\"},{\"pc\":[349,608,649,819,857,1040,1344,1649,1690,1712,2362,2579,2791,3116,3498,3514],\"errorMessage\":\"invalid array length header\"},{\"pc\":[356,615,656,828,863,1656,1697,3505,3521],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[3128],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::AllocationReclaimDetails>\"},{\"pc\":[2803],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::ClaimDetails>\"},{\"pc\":[1052,1356,1726,2376,2593],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::UserAllocation>\"},{\"pc\":[367,395,488,497,629,640,809,838,848,1029,1333,1631,1641,1670,1681,2156,2345,2354,2562,2571,3105,3376,3385,3448,3553],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[1325,1908,2554],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[408,602,1021,1738,2337,2543,3545],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAyNTMwMCA0MTcwMAogICAgYnl0ZWNibG9jayAiZCIgIkVSUjpJUEFZIiAiIiAiRVJSOkRCTkUiICJFUlI6WU5DUiIgInUiIDB4MTUxZjdjNzUgIkVSUjpJWEZSIiAiRVJSOkRCQUYiICJFUlI6SU1CUiIgImRpc2J1cnNlbWVudF9pZCIgImFraXRhX2RhbyIgIkVSUjpBTEFFIiAweDAwMDA1ZCAiRVJSOklEVVQiICJFUlI6SURYVCIgIkVSUjpEQkVNIiAiRVJSOkRCTUEiIDB4ODAwMDVkIDB4MDA1ZjAwMDAwMDAwICJFUlI6REJMSyIgIkVSUjpBTE5FIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gZGlzYnVyc2VtZW50SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFJld2FyZHNHbG9iYWxTdGF0ZUtleURpc2J1cnNlbWVudElEIH0pCiAgICBieXRlYyAxMCAvLyAiZGlzYnVyc2VtZW50X2lkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBSZXdhcmRzIGV4dGVuZHMgY2xhc3NlcyhCYXNlUmV3YXJkcywgQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIzCiAgICBwdXNoYnl0ZXNzIDB4NjY2MTIwNWEgMHhkNjFhNjlmYSAweDFjOWViYmRiIDB4OGY0OTI2MmQgMHg1NjU2YWNmOSAweGY2MmNkYzJiIDB4NmY1YzEwY2YgMHg1NDI0YTU5MSAweDdiN2RjNWZjIDB4YWYxYTE0ZjIgMHgzZWM0MGFhNCAweGJkM2NkMDkwIDB4MTQ5NjlkOTcgMHgzM2U5MmM5NCAweDg1NGRlZGUwIDB4ZDU0YmJhZDkgMHgzOTRlYWViMiAvLyBtZXRob2QgImZ1bmRNYnJDcmVkaXRzKHVpbnQ2NCxwYXkpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdNYnJDcmVkaXRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY3JlYXRlRGlzYnVyc2VtZW50KHBheSxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IiwgbWV0aG9kICJlZGl0RGlzYnVyc2VtZW50KHVpbnQ2NCxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY3JlYXRlVXNlckFsbG9jYXRpb25zKHBheSx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucyhheGZlcix1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCh1aW50NjQsdWludDY0LHN0cmluZyx1aW50NjQsdWludDY0LHN0cmluZywoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJmaW5hbGl6ZURpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIsIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50KHBheSxheGZlcix1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNsYWltUmV3YXJkcygodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJyZWNsYWltUmV3YXJkcyh1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIoc3RyaW5nLHN0cmluZykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRNYnJDcmVkaXRzIHdpdGhkcmF3TWJyQ3JlZGl0cyBjcmVhdGVEaXNidXJzZW1lbnQgZWRpdERpc2J1cnNlbWVudCBjcmVhdGVVc2VyQWxsb2NhdGlvbnMgY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCBmaW5hbGl6ZURpc2J1cnNlbWVudCBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQgY2xhaW1SZXdhcmRzIHJlY2xhaW1SZXdhcmRzIGFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGwgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE5IG1iciBvcHRJbgogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBSZXdhcmRzIGV4dGVuZHMgY2xhc3NlcyhCYXNlUmV3YXJkcywgQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICBwdXNoYnl0ZXMgMHhjZDlhZDY3ZSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDcKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTA5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDExIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuZnVuZE1ickNyZWRpdHNbcm91dGluZ10oKSAtPiB2b2lkOgpmdW5kTWJyQ3JlZGl0czoKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTE1CiAgICAvLyBmdW5kTWJyQ3JlZGl0cyhpZDogdWludDY0LCBwYXltZW50OiBndHhuLlBheW1lbnRUeG4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGZ1bmRNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6REJORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5FCgpmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5jcmVhdG9yID09PSBUeG4uc2VuZGVyLCBFUlJfWU9VX0FSRV9OT1RfVEhFX0NSRUFUT1IpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGJueiBmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANwogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID4gMCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmZ1bmRNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzICs9IGFtb3VudAogICAgZHVwbiAyCiAgICBwdXNoaW50IDc1CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyA0CiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDc1CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGZ1bmRNYnJDcmVkaXRzKGlkOiB1aW50NjQsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMud2l0aGRyYXdNYnJDcmVkaXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdNYnJDcmVkaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHdpdGhkcmF3TWJyQ3JlZGl0cyhpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHdpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKd2l0aGRyYXdNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmNyZWF0b3IgPT09IFR4bi5zZW5kZXIsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYm56IHdpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKd2l0aGRyYXdNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiAwLCBFUlJfSU5WQUxJRF9NQlJfQU1PVU5UKQogICAgZGlnIDEKICAgIGJueiB3aXRoZHJhd01ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCndpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGR1cAogICAgcHVzaGludCA3NQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgPj0KICAgIGJueiB3aXRoZHJhd01ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCndpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm1ickNyZWRpdHMgLT0gYW1vdW50CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDc1CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEzMS0xMzQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBhbW91bnQsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTMxLTEzNAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHdpdGhkcmF3TWJyQ3JlZGl0cyhpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlRGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlRGlzYnVyc2VtZW50OgogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMzctMTQzCiAgICAvLyBjcmVhdGVEaXNidXJzZW1lbnQoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdGltZVRvVW5sb2NrOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgbm90ZTogc3RyaW5nCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE0NAogICAgLy8gY29uc3QgaWQgPSB0aGlzLm5ld0Rpc2J1cnNlbWVudElEKCkKICAgIGNhbGxzdWIgbmV3RGlzYnVyc2VtZW50SUQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ2CiAgICAvLyBjb25zdCBjb3N0cyA9IHRoaXMubWJyKHRpdGxlLCBub3RlKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBtYnJBbW91bnQgPSBjb3N0cy5kaXNidXJzZW1lbnRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID49IG1ickFtb3VudCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA2CiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkaWcgMQogICAgPj0KICAgIGJueiBjcmVhdGVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIG1ickNyZWRpdHM6IG1iclBheW1lbnQuYW1vdW50IC0gbWJyQW1vdW50LAogICAgZGlnIDgKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBkaWcgNwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTMgLy8gMHgwMDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCA5MwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEzNy0xNDMKICAgIC8vIGNyZWF0ZURpc2J1cnNlbWVudCgKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0aXRsZTogc3RyaW5nLAogICAgLy8gICB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICBub3RlOiBzdHJpbmcKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5lZGl0RGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZWRpdERpc2J1cnNlbWVudDoKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTY5LTE3NQogICAgLy8gZWRpdERpc2J1cnNlbWVudCgKICAgIC8vICAgaWQ6IHVpbnQ2NCwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdGltZVRvVW5sb2NrOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgbm90ZTogc3RyaW5nCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTc4CiAgICAvLyBjb25zdCB7IGNyZWF0b3IsIGZpbmFsaXplZCB9ID0gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IGNyZWF0b3IsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyBsb2dnZWRBc3NlcnQoZmluYWxpemVkID09PSBmYWxzZSwgRVJSX0RJU0JVUlNFTUVOVF9BTFJFQURZX0ZJTkFMKQogICAgZGlnIDYKICAgIGJ6IGVkaXREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCmVkaXREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS50aXRsZSA9IHRpdGxlCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDkKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHB1c2hpbnQgOTEKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICAtCiAgICB1bmNvdmVyIDIKICAgIGRpZyA4CiAgICArCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgOTEKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS50aW1lVG9VbmxvY2sgPSB0aW1lVG9VbmxvY2sKICAgIGR1cAogICAgcHVzaGludCA0MwogICAgZGlnIDYKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5leHBpcmF0aW9uID0gZXhwaXJhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDUxCiAgICBkaWcgNQogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm5vdGUgPSBub3RlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDkxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE2OS0xNzUKICAgIC8vIGVkaXREaXNidXJzZW1lbnQoCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZwogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5jcmVhdGVVc2VyQWxsb2NhdGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVVc2VyQWxsb2NhdGlvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg4LTE5MgogICAgLy8gY3JlYXRlVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL3R5cGVzLnRzOjpVc2VyQWxsb2NhdGlvbj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS5leGlzdHMsIEVSUl9ESVNCVVJTRU1FTlRfRE9FU19OT1RfRVhJU1QpCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCB0aXRsZSwgbm90ZSB9ID0gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyCiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ1cnkgMTEKICAgIGRpZyAxCiAgICBwdXNoaW50IDkzCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMgogICAgcHVzaGludCA5MwogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBwdXNoaW50IDkxCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gY3JlYXRvciwgRVJSX1lPVV9BUkVfTk9UX1RIRV9DUkVBVE9SKQogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGJueiBjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTk3CiAgICAvLyBsb2dnZWRBc3NlcnQoIWZpbmFsaXplZCwgRVJSX0RJU0JVUlNFTUVOVF9BTFJFQURZX0ZJTkFMKQogICAgZGlnIDgKICAgIGJ6IGNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANwogICAgYnl0ZWMgOCAvLyAiRVJSOkRCQUYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJBRgoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIGxldCBzdW06IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc193aGlsZV90b3BAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBkaWcgMwogICAgPAogICAgYnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX3doaWxlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDgKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDE0CiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBhc3NldDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwMS0yMDUKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogaWQsCiAgICAvLyAgIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMudXNlckFsbG9jYXRpb25zKHVzZXJBbGxvY2F0aW9uc0tleSkuZXhpc3RzLCBFUlJfQUxMT0NBVElPTl9BTFJFQURZX0VYSVNUUykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEyCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDU5CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5hbW91bnQgKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgMzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gc3VtICs9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDgKICAgIGIgY3JlYXRlVXNlckFsbG9jYXRpb25zX3doaWxlX3RvcEA4CgpjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icih0aXRsZSwgbm90ZSkKICAgIGRpZyA5CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gY29uc3QgbWJyQW1vdW50OiB1aW50NjQgPSBjb3N0cy51c2VyQWxsb2NhdGlvbnMgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyB0aGlzLnVzZU1ickNyZWRpdChpZCwgbWJyQW1vdW50KQogICAgZGlnIDUKICAgIHN3YXAKICAgIGNhbGxzdWIgdXNlTWJyQ3JlZGl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDUKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0CiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gc3VtLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDUKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDcKICAgID09CiAgICBibnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg4LTE5MgogICAgLy8gY3JlYXRlVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjQtMjI4CiAgICAvLyBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnMoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBpZDogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXQogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoaW50IDQwCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6REJORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5FCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgeyBjcmVhdG9yLCBmaW5hbGl6ZWQsIHRpdGxlLCBub3RlIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMQogICAgZGlnIDEKICAgIHB1c2hpbnQgOTMKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDkzCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIHB1c2hpbnQgOTEKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzIKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSBjcmVhdG9yLCBFUlJfWU9VX0FSRV9OT1RfVEhFX0NSRUFUT1IpCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYm56IGNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGxvZ2dlZEFzc2VydCghZmluYWxpemVkLCBFUlJfRElTQlVSU0VNRU5UX0FMUkVBRFlfRklOQUwpCiAgICBkaWcgOAogICAgYnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA4IC8vICJFUlI6REJBRiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQkFGCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gbGV0IG1hdGNoU3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfd2hpbGVfdG9wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgZGlnIDMKICAgIDwKICAgIGJ6IGNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl93aGlsZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA4CiAgICBwdXNoaW50IDQwCiAgICAqCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxNAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gYXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICBkaWcgNgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDEKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogaWQsCiAgICAvLyAgIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjQyCiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMudXNlckFsbG9jYXRpb25zKHVzZXJBbGxvY2F0aW9uc0tleSkuZXhpc3RzLCBFUlJfQUxMT0NBVElPTl9BTFJFQURZX0VYSVNUUykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEyCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDU5CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5hbW91bnQgKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgMzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gbWF0Y2hTdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgNwogICAgKwogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgOAogICAgYiBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfd2hpbGVfdG9wQDgKCmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBjb25zdCBjb3N0cyA9IHRoaXMubWJyKHRpdGxlLCBub3RlKQogICAgZGlnIDkKICAgIGRpZyAxMQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IGNvc3RzLnVzZXJBbGxvY2F0aW9ucyAqIGFsbG9jYXRpb25zLmxlbmd0aAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIHRoaXMudXNlTWJyQ3JlZGl0KGlkLCBtYnJBbW91bnQpCiAgICBkaWcgNQogICAgc3dhcAogICAgY2FsbHN1YiB1c2VNYnJDcmVkaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjU2CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyA1CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0CiAgICBieXRlYyA3IC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNTcKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IG1hdGNoU3VtLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyA1CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZGlnIDcKICAgID09CiAgICBibnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjI0LTIyOAogICAgLy8gY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgaWQ6IHVpbnQ2NCwKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjgKICAgIC8vIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCgKICAgIC8vICAgbWJyUGF5bWVudEluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFzc2V0VHJhbnNmZXJTdGFydEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZywKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA1CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL3R5cGVzLnRzOjpVc2VyQWxsb2NhdGlvbj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjY5CiAgICAvLyBjb25zdCBpZCA9IHRoaXMubmV3RGlzYnVyc2VtZW50SUQoKQogICAgY2FsbHN1YiBuZXdEaXNidXJzZW1lbnRJRAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBndHhuLlBheW1lbnRUeG4obWJyUGF5bWVudEluZGV4KQogICAgZGlnIDMKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icih0aXRsZSwgbm90ZSkKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gY29uc3QgZGlzYnVyc2VtZW50TWJyQW1vdW50ID0gY29zdHMuZGlzYnVyc2VtZW50cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBjb25zdCBhbGxvY2F0aW9uTWJyQW1vdW50OiB1aW50NjQgPSBjb3N0cy51c2VyQWxsb2NhdGlvbnMgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPj0gZGlzYnVyc2VtZW50TWJyQW1vdW50ICsgYWxsb2NhdGlvbk1ickFtb3VudCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMAogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyAyCiAgICBkaWcgMgogICAgKwogICAgPj0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIG1ickNyZWRpdHM6IHBheW1lbnQuYW1vdW50IC0gZGlzYnVyc2VtZW50TWJyQW1vdW50LAogICAgZGlnIDEyCiAgICBkaWcgMwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzktMjkxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IGZhbHNlLAogICAgLy8gICB0aXRsZSwKICAgIC8vICAgYW1vdW50OiAwLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiAwLAogICAgLy8gICBkaXN0cmlidXRlZDogMCwKICAgIC8vICAgbWJyQ3JlZGl0czogcGF5bWVudC5hbW91bnQgLSBkaXNidXJzZW1lbnRNYnJBbW91bnQsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiAwLAogICAgLy8gICBub3RlLAogICAgLy8gfQogICAgZGlnIDEwCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyAxMyAvLyAweDAwMDA1ZAogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICBwdXNoaW50IDkzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gYW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc5LTI5MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiBmYWxzZSwKICAgIC8vICAgdGl0bGUsCiAgICAvLyAgIGFtb3VudDogMCwKICAgIC8vICAgdGltZVRvVW5sb2NrLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gICBhbGxvY2F0aW9uczogMCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IHBheW1lbnQuYW1vdW50IC0gZGlzYnVyc2VtZW50TWJyQW1vdW50LAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogMCwKICAgIC8vICAgbm90ZSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzktMjkxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IGZhbHNlLAogICAgLy8gICB0aXRsZSwKICAgIC8vICAgYW1vdW50OiAwLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiAwLAogICAgLy8gICBkaXN0cmlidXRlZDogMCwKICAgIC8vICAgbWJyQ3JlZGl0czogcGF5bWVudC5hbW91bnQgLSBkaXNidXJzZW1lbnRNYnJBbW91bnQsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiAwLAogICAgLy8gICBub3RlLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjkzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfd2hpbGVfdG9wQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgMTMKICAgIGRpZyA0CiAgICA8CiAgICBieiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfd2hpbGVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjk0CiAgICAvLyBjb25zdCBhc3NldFhmZXIgPSBndHhuLkFzc2V0VHJhbnNmZXJUeG4oYXNzZXRUcmFuc2ZlclN0YXJ0SW5kZXggKyBpKQogICAgZGlnIDkKICAgIGRpZyAxNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbi5hZGRyZXNzLAogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDIxCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjk5CiAgICAvLyBhc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIHN3YXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyOTYtMzAwCiAgICAvLyBjb25zdCB1c2VyQWxsb2NhdGlvbnNLZXk6IFVzZXJBbGxvY2F0aW9uc0tleSA9IHsKICAgIC8vICAgZGlzYnVyc2VtZW50SUQ6IGlkLAogICAgLy8gICBhZGRyZXNzOiBhbGxvY2F0aW9uLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmV4aXN0cywgRVJSX0FMTE9DQVRJT05fQUxSRUFEWV9FWElTVFMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAxNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSBhbGxvY2F0aW9uLmFtb3VudCwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgMTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgMTkKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTUKICAgID09CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA2CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbi5hbW91bnQKICAgIGRpZyAxMgogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTcKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxNwogICAgZHVwCiAgICBwdXNoaW50IDU5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCA1OQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYW1vdW50ICs9IGFsbG9jYXRpb24uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDM1CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyOTMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDEzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxNAogICAgYiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfd2hpbGVfdG9wQDYKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyB0aGlzLnVzZU1ickNyZWRpdChpZCwgYWxsb2NhdGlvbk1ickFtb3VudCkKICAgIGRpZyAyCiAgICBkaWcgMQogICAgY2FsbHN1YiB1c2VNYnJDcmVkaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyB0aW1lVG9VbmxvY2sgPj0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCB0aW1lVG9VbmxvY2sgPT09IDAsCiAgICBkaWcgNwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPj0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYm9vbF90cnVlQDE2CiAgICBkaWcgNwogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDE3CgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMTMtMzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgIHRpbWVUb1VubG9jayA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IHRpbWVUb1VubG9jayA9PT0gMCwKICAgIC8vICAgRVJSX0lOVkFMSURfRElTQlVSU0VNRU5UX1VOTE9DS19USU1FCiAgICAvLyApCiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAyMAogICAgYnl0ZWMgMTQgLy8gIkVSUjpJRFVUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklEVVQKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHB1c2hpbnQgNjAKICAgICsKICAgIGRpZyA3CiAgICA8PQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX3RydWVAMjIKICAgIGRpZyA2CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfZmFsc2VAMjMKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX3RydWVAMjI6CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMxNy0zMjAKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIC8vICAgRVJSX0lOVkFMSURfRElTQlVSU0VNRU5UX0VYUElSQVRJT05fVElNRQogICAgLy8gKQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjYKICAgIGJ5dGVjIDE1IC8vICJFUlI6SURYVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRFhUCgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFtb3VudCA+IDAsIEVSUl9ESVNCVVJTRU1FTlRTX0NBTk5PVF9CRV9FTVBUWSkKICAgIGRpZyAxNgogICAgcHVzaGludCAzNQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAyOAogICAgYnl0ZWMgMTYgLy8gIkVSUjpEQkVNIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCRU0KCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYWxsb2NhdGlvbnMgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19NVVNUX0hBVkVfQUxMT0NBVElPTlMpCiAgICBkaWcgMTYKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMzAKICAgIGJ5dGVjIDE3IC8vICJFUlI6REJNQSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk1BCgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuZmluYWxpemVkID0gdHJ1ZQogICAgZGlnIDE2CiAgICBkdXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAxCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjgKICAgIC8vIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCgKICAgIC8vICAgbWJyUGF5bWVudEluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFzc2V0VHJhbnNmZXJTdGFydEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZywKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxOAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDIzOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMjQKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMTgKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmZpbmFsaXplRGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemVEaXNidXJzZW1lbnQ6CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBmaW5hbGl6ZURpc2J1cnNlbWVudChpZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpEQk5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTkUKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCB0aW1lVG9VbmxvY2ssIGV4cGlyYXRpb24sIGFtb3VudCwgYWxsb2NhdGlvbnMgfSA9IHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAzMgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTEKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA2CiAgICBkaWcgMQogICAgcHVzaGludCAzNQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IGNyZWF0b3IsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGxvZ2dlZEFzc2VydCghZmluYWxpemVkLCBFUlJfRElTQlVSU0VNRU5UX0FMUkVBRFlfRklOQUwpCiAgICBkaWcgMgogICAgYnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIHRpbWVUb1VubG9jayA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IHRpbWVUb1VubG9jayA9PT0gMCwKICAgIGRpZyAxCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUA5CiAgICBkaWcgMQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMTAKCmZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUA5OgogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzNS0zMzgKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGltZVRvVW5sb2NrID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgfHwgdGltZVRvVW5sb2NrID09PSAwLAogICAgLy8gICBFUlJfSU5WQUxJRF9ESVNCVVJTRU1FTlRfVU5MT0NLX1RJTUUKICAgIC8vICkKICAgIGJueiBmaW5hbGl6ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTMKICAgIGJ5dGVjIDE0IC8vICJFUlI6SURVVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRFVUCgpmaW5hbGl6ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHB1c2hpbnQgNjAKICAgICsKICAgIGRpZyA0CiAgICA8PQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDMKICAgIGJueiBmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDE2CgpmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzM5LTM0MgogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICBleHBpcmF0aW9uID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyA2MCB8fCBleHBpcmF0aW9uID09PSAwLAogICAgLy8gICBFUlJfSU5WQUxJRF9ESVNCVVJTRU1FTlRfRVhQSVJBVElPTl9USU1FCiAgICAvLyApCiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDE5CiAgICBieXRlYyAxNSAvLyAiRVJSOklEWFQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SURYVAoKZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19DQU5OT1RfQkVfRU1QVFkpCiAgICBkaWcgNAogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMQogICAgYnl0ZWMgMTYgLy8gIkVSUjpEQkVNIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCRU0KCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBsb2dnZWRBc3NlcnQoYWxsb2NhdGlvbnMgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19NVVNUX0hBVkVfQUxMT0NBVElPTlMpCiAgICBkaWcgNQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMwogICAgYnl0ZWMgMTcgLy8gIkVSUjpEQk1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTUEKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmZpbmFsaXplZCA9IHRydWUKICAgIGR1cG4gMgogICAgcHVzaGludCAzMgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDEKICAgIHNldGJpdAogICAgcHVzaGludCAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBmaW5hbGl6ZURpc2J1cnNlbWVudChpZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9tZXJnZUAxNwoKZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9mYWxzZUAxMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VAMTEKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDktMzU0CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5uZXdEaXNidXJzZW1lbnRJRCgpCiAgICBjYWxsc3ViIG5ld0Rpc2J1cnNlbWVudElECiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gY29uc3QgYWxsb2NhdGlvbnNNYnI6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgICoKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIGFsbG9jYXRpb25zTWJyCiAgICBpbnRjIDUgLy8gNDE3MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBsZXQgc3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgNgogICAgPAogICAgYnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2NAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIGFzc2V0OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzYyLTM2NgogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBzdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgMwogICAgKwogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfd2hpbGVfdG9wQDIKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzcyCiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgOQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDYKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM3MwogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID09PSBtYnJBbW91bnQgKyBzdW0sIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgOQogICAgZ3R4bnMgQW1vdW50CiAgICBkaWcgMwogICAgZGlnIDMKICAgICsKICAgID09CiAgICBibnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAOAogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mzc2CiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNzUtMzg3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IHRydWUsCiAgICAvLyAgIHRpdGxlOiAnJywKICAgIC8vICAgYW1vdW50OiBzdW0sCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IGFsbG9jYXRpb25zLmxlbmd0aCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IDAsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiBhbGxvY2F0aW9uc01iciwKICAgIC8vICAgbm90ZTogJycsCiAgICAvLyB9CiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgYnl0ZWMgMTggLy8gMHg4MDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMTkgLy8gMHgwMDVmMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mzc1LTM4NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiB0cnVlLAogICAgLy8gICB0aXRsZTogJycsCiAgICAvLyAgIGFtb3VudDogc3VtLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiBhbGxvY2F0aW9ucy5sZW5ndGgsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiAwLAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogYWxsb2NhdGlvbnNNYnIsCiAgICAvLyAgIG5vdGU6ICcnLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDktMzU0CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgYnl0ZWMgNiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM5Mi0zOTgKICAgIC8vIGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5uZXdEaXNidXJzZW1lbnRJRCgpCiAgICBjYWxsc3ViIG5ld0Rpc2J1cnNlbWVudElECiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gY29uc3QgYWxsb2NhdGlvbnNNYnI6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgICoKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIGFsbG9jYXRpb25zTWJyCiAgICBpbnRjIDUgLy8gNDE3MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyBsZXQgc3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgNgogICAgPAogICAgYnogY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudF9hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgZGlnIDEyCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQxMAogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBzdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgMwogICAgKwogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfd2hpbGVfdG9wQDIKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDE2CiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA2CiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gbWJyQW1vdW50LCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDgKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFzc2V0WGZlci5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgOQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTAKICAgIGJ5dGVjIDcgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IHN1bSwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgOQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGRpZyAyCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDEyCiAgICBieXRlYyA3IC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjItNDM0CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IHRydWUsCiAgICAvLyAgIHRpdGxlOiAnJywKICAgIC8vICAgYW1vdW50OiBzdW0sCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IGFsbG9jYXRpb25zLmxlbmd0aCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IDAsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiBhbGxvY2F0aW9uc01iciwKICAgIC8vICAgbm90ZTogJycsCiAgICAvLyB9CiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgYnl0ZWMgMTggLy8gMHg4MDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMTkgLy8gMHgwMDVmMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDIyLTQzNAogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiB0cnVlLAogICAgLy8gICB0aXRsZTogJycsCiAgICAvLyAgIGFtb3VudDogc3VtLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiBhbGxvY2F0aW9ucy5sZW5ndGgsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiAwLAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogYWxsb2NhdGlvbnNNYnIsCiAgICAvLyAgIG5vdGU6ICcnLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozOTItMzk4CiAgICAvLyBjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXQogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjIDYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNsYWltUmV3YXJkc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltUmV3YXJkczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGNsYWltUmV3YXJkcyhyZXdhcmRzOiBDbGFpbURldGFpbHNbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OkNsYWltRGV0YWlscz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmV3YXJkcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmNsYWltUmV3YXJkc193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmV3YXJkcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogY2xhaW1SZXdhcmRzX2FmdGVyX3doaWxlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhyZXdhcmRzW2ldLmlkKS5leGlzdHMsIEVSUl9ESVNCVVJTRU1FTlRfRE9FU19OT1RfRVhJU1QpCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBkaXNidXJzZW1lbnRzID0gQm94TWFwPHVpbnQ2NCwgRGlzYnVyc2VtZW50RGV0YWlscz4oeyBrZXlQcmVmaXg6IFJld2FyZHNCb3hQcmVmaXhEaXNidXJzZW1lbnRzIH0pCiAgICBieXRlY18wIC8vICJkIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKHJld2FyZHNbaV0uaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGNvbnN0IHsgdGltZVRvVW5sb2NrLCBleHBpcmF0aW9uLCBhbW91bnQsIGRpc3RyaWJ1dGVkLCBub3RlIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMocmV3YXJkc1tpXS5pZCkudmFsdWUKICAgIGRpZyAxMAogICAgZHVwCiAgICBwdXNoaW50IDQzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDUxCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgZGlnIDEKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSAxMAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjcKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA5CiAgICBkaWcgMQogICAgcHVzaGludCA5MQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRpbWVUb1VubG9jayA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfRElTQlVSU0VNRU5UX0xPQ0tFRCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyAyMCAvLyAiRVJSOkRCTEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJMSwoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDUKICAgIC8vIGxvZ2dlZEFzc2VydChleHBpcmF0aW9uID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9ESVNCVVJTRU1FTlRfTE9DS0VEKQogICAgZGlnIDUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID49CiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA5CiAgICBieXRlYyAyMCAvLyAiRVJSOkRCTEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJMSwoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiBkaXN0cmlidXRlZCwgRVJSX0RJU0JVUlNFTUVOVF9GVUxMWV9ESVNUUklCVVRFRCkKICAgIGRpZyA3CiAgICBkaWcgNwogICAgPgogICAgYm56IGNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOkRCRkQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJGRAoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDUwCiAgICAvLyBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NTEKICAgIC8vIGFzc2V0OiByZXdhcmRzW2ldLmFzc2V0LAogICAgZGlnIDEzCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0OC00NTIKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogcmV3YXJkc1tpXS5pZCwKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IHJld2FyZHNbaV0uYXNzZXQsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS5leGlzdHMsIEVSUl9BTExPQ0FUSU9OX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMjEgLy8gIkVSUjpBTE5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMTkUKCmNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ1NAogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb24gPSB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlCiAgICBkaWcgOQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKHJld2FyZHNbaV0uaWQpLnZhbHVlLmFsbG9jYXRpb25zIC09IDEKICAgIGRpZyAxMwogICAgZHVwCiAgICBwdXNoaW50IDU5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCA1OQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhyZXdhcmRzW2ldLmlkKS52YWx1ZS5kaXN0cmlidXRlZCArPSB1c2VyQWxsb2NhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDY3CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgcHVzaGludCA2NwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyB0aGlzLnJlZnVuZEFsbG9jYXRpb25NYnIocmV3YXJkc1tpXS5pZCkKICAgIGRpZyA0CiAgICBjYWxsc3ViIHJlZnVuZEFsbG9jYXRpb25NYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBpZiAoIWlzQWxnbykgewogICAgZGlnIDUKICAgIGJ6IGNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIGFzc2V0WGZlci5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ2NC00NjkKICAgIC8vIGNvbnN0IGFzc2V0WGZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgeGZlckFzc2V0OiByZXdhcmRzW2ldLmFzc2V0LAogICAgLy8gICBub3RlLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3MQogICAgLy8gYXNzZXRYZmVyLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJld2FyZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBjbGFpbVJld2FyZHNfd2hpbGVfdG9wQDIKCmNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3NAogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3OQogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3My00NzcKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgbm90ZSwKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3OQogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTgKCmNsYWltUmV3YXJkc19hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDM5CiAgICAvLyBjbGFpbVJld2FyZHMocmV3YXJkczogQ2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLnJlY2xhaW1SZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVjbGFpbVJld2FyZHM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyByZWNsYWltUmV3YXJkcyhpZDogdWludDY0LCByZWNsYWltczogQWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvcmV3YXJkcy90eXBlcy50czo6QWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpEQk5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTkUKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODYKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCBleHBpcmF0aW9uIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEzCiAgICBkdXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMAogICAgcHVzaGludCA1MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ4OAogICAgLy8gbG9nZ2VkQXNzZXJ0KGNyZWF0b3IgPT09IFR4bi5zZW5kZXIsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGxvZ2dlZEFzc2VydChmaW5hbGl6ZWQsIEVSUl9ESVNCVVJTRU1FTlRfQUxSRUFEWV9GSU5BTCkKICAgIGRpZyA3CiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGxvZ2dlZEFzc2VydChleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9ESVNCVVJTRU1FTlRfTk9UX0VYUElSRUQpCiAgICBkaWcgOAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGJueiByZWNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAOQogICAgcHVzaGJ5dGVzICJFUlI6REJOWCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5YCgpyZWNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnJlY2xhaW1SZXdhcmRzX3doaWxlX3RvcEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA2CiAgICBkaWcgMwogICAgPAogICAgYnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfd2hpbGVAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk1CiAgICAvLyBhZGRyZXNzOiByZWNsYWltc1tpXS5hZGRyZXNzLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNwogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0OTYKICAgIC8vIGFzc2V0OiByZWNsYWltc1tpXS5hc3NldCwKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk1LTQ5NgogICAgLy8gYWRkcmVzczogcmVjbGFpbXNbaV0uYWRkcmVzcywKICAgIC8vIGFzc2V0OiByZWNsYWltc1tpXS5hc3NldCwKICAgIHB1c2hpbnQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBhc3NldDogcmVjbGFpbXNbaV0uYXNzZXQsCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkzLTQ5NwogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogcmVjbGFpbXNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IHJlY2xhaW1zW2ldLmFzc2V0LAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk4CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS5leGlzdHMsIEVSUl9BTExPQ0FUSU9OX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBieXRlYyAyMSAvLyAiRVJSOkFMTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QUxORQoKcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uID0gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZQogICAgZGlnIDkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYWxsb2NhdGlvbnMgLT0gMQogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA1OQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZGlnIDEKICAgIHB1c2hpbnQgNTkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFtb3VudCAtPSB1c2VyQWxsb2NhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDM1CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgcHVzaGludCAzNQogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTA0CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTA1CiAgICAvLyB0aGlzLnJlZnVuZEFsbG9jYXRpb25NYnIoaWQpCiAgICBkaWcgNQogICAgY2FsbHN1YiByZWZ1bmRBbGxvY2F0aW9uTWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gaWYgKCFpc0FsZ28pIHsKICAgIGRpZyA2CiAgICBieiByZWNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE2CiAgICAvLyB4ZmVyLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyAxMAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUxMC01MTQKICAgIC8vIGNvbnN0IHhmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICBhc3NldEFtb3VudDogdXNlckFsbG9jYXRpb24sCiAgICAvLyAgIHhmZXJBc3NldDogcmVjbGFpbXNbaV0uYXNzZXQsCiAgICAvLyB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE2CiAgICAvLyB4ZmVyLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcmVjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIHJlY2xhaW1SZXdhcmRzX3doaWxlX3RvcEAxMAoKcmVjbGFpbVJld2FyZHNfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MTgtNTIzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgICBhbW91bnQ6IHVzZXJBbGxvY2F0aW9uLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiByZWNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE4CgpyZWNsYWltUmV3YXJkc19hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyByZWNsYWltUmV3YXJkcyhpZDogdWludDY0LCByZWNsYWltczogQWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGxbcm91dGluZ10oKSAtPiB2b2lkOgphbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsOgogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbkNvdW50CiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIGRpZyAyCiAgICAqCiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzUKICAgIC8vIGNvbnN0IGNyZWRpdHM6IHVpbnQ2NCA9IHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUubWJyQ3JlZGl0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTM2CiAgICAvLyBpZiAoY3JlZGl0cyA+PSBtYnJBbW91bnQpIHsKICAgIDw9CiAgICBieiBhbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzcKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjU0MAogICAgLy8gcmV0dXJuIG1ickFtb3VudCAtIGNyZWRpdHMKICAgIGRpZyAyCiAgICBkaWcgNAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBhbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5hbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsQDYKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMTEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMTEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OkJhc2VSZXdhcmRzLm1icltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjpDb250cmFjdFdpdGhPcHRJbi5vcHRJbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjIzCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjUKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVF9SRUNFSVZFUikKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6SVBNUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUE1SCgpvcHRJbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyNgogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZGlnIDEKICAgIGd0eG5zIEFtb3VudAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI4LTM0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjMwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozMQogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjgtMzMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjgtMzQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjIzCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMubmV3RGlzYnVyc2VtZW50SUQoKSAtPiB1aW50NjQ6Cm5ld0Rpc2J1cnNlbWVudElEOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgaWQgPSB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gZGlzYnVyc2VtZW50SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFJld2FyZHNHbG9iYWxTdGF0ZUtleURpc2J1cnNlbWVudElEIH0pCiAgICBieXRlYyAxMCAvLyAiZGlzYnVyc2VtZW50X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgaWQgPSB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRJRC52YWx1ZSArPSAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBkaXNidXJzZW1lbnRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUmV3YXJkc0dsb2JhbFN0YXRlS2V5RGlzYnVyc2VtZW50SUQgfSkKICAgIGJ5dGVjIDEwIC8vICJkaXNidXJzZW1lbnRfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlICs9IDEKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyByZXR1cm4gaWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMudXNlTWJyQ3JlZGl0KGlkOiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgp1c2VNYnJDcmVkaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBwcml2YXRlIHVzZU1ickNyZWRpdChpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgYm56IHVzZU1ickNyZWRpdF9hZnRlcl9hc3NlcnRAMgogICAgYnl0ZWMgOSAvLyAiRVJSOklNQlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SU1CUgoKdXNlTWJyQ3JlZGl0X2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzIC09IGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDc1CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzICs9IGFtb3VudAogICAgZHVwCiAgICBwdXNoaW50IDgzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaXRvYgogICAgcHVzaGludCA4MwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMucmVmdW5kQWxsb2NhdGlvbk1icihpZDogdWludDY0KSAtPiB2b2lkOgpyZWZ1bmRBbGxvY2F0aW9uTWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIHByaXZhdGUgcmVmdW5kQWxsb2NhdGlvbk1icihpZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyA+PSBhbW91bnQsIEVSUl9JTlZBTElEX01CUl9BTU9VTlQpCiAgICBwdXNoaW50IDgzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLnJlbGVhc2VNYnJDcmVkaXQoaWQsIFVzZXJBbGxvY2F0aW9uTUJSKQogICAgaW50YyA0IC8vIDI1MzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyA+PSBhbW91bnQsIEVSUl9JTlZBTElEX01CUl9BTU9VTlQpCiAgICA+PQogICAgYm56IHJlZnVuZEFsbG9jYXRpb25NYnJfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCnJlZnVuZEFsbG9jYXRpb25NYnJfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzIC09IGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA4MwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5yZWxlYXNlTWJyQ3JlZGl0KGlkLCBVc2VyQWxsb2NhdGlvbk1CUikKICAgIGludGMgNCAvLyAyNTMwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyAtPSBhbW91bnQKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDgzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm1ickNyZWRpdHMgKz0gYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHRoaXMucmVsZWFzZU1ickNyZWRpdChpZCwgVXNlckFsbG9jYXRpb25NQlIpCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUubWJyQ3JlZGl0cyArPSBhbW91bnQKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIodGl0bGU6IGJ5dGVzLCBub3RlOiBieXRlcykgLT4gYnl0ZXM6CnNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OkJhc2VSZXdhcmRzLm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6Ny04CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIG1icih0aXRsZTogc3RyaW5nLCBub3RlOiBzdHJpbmcpOiBSZXdhcmRzTUJSRGF0YSB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6MTAKICAgIC8vIGRpc2J1cnNlbWVudHM6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXModGl0bGUpLmxlbmd0aCArIEJ5dGVzKG5vdGUpLmxlbmd0aCkpLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDQwMAogICAgKgogICAgaW50YyA1IC8vIDQxNzAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjktMTIKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGRpc2J1cnNlbWVudHM6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXModGl0bGUpLmxlbmd0aCArIEJ5dGVzKG5vdGUpLmxlbmd0aCkpLAogICAgLy8gICB1c2VyQWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uTUJSCiAgICAvLyB9CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjExCiAgICAvLyB1c2VyQWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uTUJSCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OS0xMgogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZGlzYnVyc2VtZW50czogTWluRGlzYnVyc2VtZW50c01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIChCeXRlcyh0aXRsZSkubGVuZ3RoICsgQnl0ZXMobm90ZSkubGVuZ3RoKSksCiAgICAvLyAgIHVzZXJBbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25NQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type DisbursementDetails = {\n creator: string,\n finalized: boolean,\n title: string,\n amount: bigint,\n timeToUnlock: bigint,\n expiration: bigint,\n allocations: bigint,\n distributed: bigint,\n mbrCredits: bigint,\n usedMbrCredits: bigint,\n note: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a DisbursementDetails to the struct representation\n */\nexport function DisbursementDetailsFromTuple(abiTuple: [string, boolean, string, bigint, bigint, bigint, bigint, bigint, bigint, bigint, string]) {\n const abiStructType = ABIStructType.fromStruct('DisbursementDetails', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as DisbursementDetails\n}\n\nexport type RewardsMbrData = {\n disbursements: bigint,\n userAllocations: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a RewardsMBRData to the struct representation\n */\nexport function RewardsMbrDataFromTuple(abiTuple: [bigint, bigint]) {\n const abiStructType = ABIStructType.fromStruct('RewardsMBRData', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as RewardsMbrData\n}\n\nexport type UserAllocationsKey = {\n address: string,\n asset: bigint,\n disbursementId: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a UserAllocationsKey to the struct representation\n */\nexport function UserAllocationsKeyFromTuple(abiTuple: [string, bigint, bigint]) {\n const abiStructType = ABIStructType.fromStruct('UserAllocationsKey', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as UserAllocationsKey\n}\n\n/**\n * The argument types for the Rewards contract\n */\nexport type RewardsArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'fundMbrCredits(uint64,pay)void': {\n id: bigint | number\n payment: AppMethodCallTransactionArgument\n }\n 'withdrawMbrCredits(uint64,uint64)void': {\n id: bigint | number\n amount: bigint | number\n }\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n }\n 'editDisbursement(uint64,string,uint64,uint64,string)void': {\n id: bigint | number\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n }\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': {\n payment: AppMethodCallTransactionArgument\n id: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': {\n assetXfer: AppMethodCallTransactionArgument\n id: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': {\n mbrPaymentIndex: bigint | number\n assetTransferStartIndex: bigint | number\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n allocations: [string, bigint | number][]\n }\n 'finalizeDisbursement(uint64)void': {\n id: bigint | number\n }\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n timeToUnlock: bigint | number\n expiration: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n timeToUnlock: bigint | number\n expiration: bigint | number\n allocations: [string, bigint | number][]\n }\n 'claimRewards((uint64,uint64)[])void': {\n rewards: [bigint | number, bigint | number][]\n }\n 'reclaimRewards(uint64,(address,uint64)[])void': {\n id: bigint | number\n reclaims: [string, bigint | number][]\n }\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': {\n id: bigint | number\n allocationCount: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr(string,string)(uint64,uint64)': {\n title: string\n note: string\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint64)void': [version: string, akitaDao: bigint | number]\n 'fundMbrCredits(uint64,pay)void': [id: bigint | number, payment: AppMethodCallTransactionArgument]\n 'withdrawMbrCredits(uint64,uint64)void': [id: bigint | number, amount: bigint | number]\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': [mbrPayment: AppMethodCallTransactionArgument, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string]\n 'editDisbursement(uint64,string,uint64,uint64,string)void': [id: bigint | number, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string]\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': [payment: AppMethodCallTransactionArgument, id: bigint | number, allocations: [string, bigint | number][]]\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': [assetXfer: AppMethodCallTransactionArgument, id: bigint | number, allocations: [string, bigint | number][]]\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': [mbrPaymentIndex: bigint | number, assetTransferStartIndex: bigint | number, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string, allocations: [string, bigint | number][]]\n 'finalizeDisbursement(uint64)void': [id: bigint | number]\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': [mbrPayment: AppMethodCallTransactionArgument, timeToUnlock: bigint | number, expiration: bigint | number, allocations: [string, bigint | number][]]\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': [mbrPayment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, timeToUnlock: bigint | number, expiration: bigint | number, allocations: [string, bigint | number][]]\n 'claimRewards((uint64,uint64)[])void': [rewards: [bigint | number, bigint | number][]]\n 'reclaimRewards(uint64,(address,uint64)[])void': [id: bigint | number, reclaims: [string, bigint | number][]]\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': [id: bigint | number, allocationCount: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr(string,string)(uint64,uint64)': [title: string, note: string]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type RewardsReturns = {\n 'create(string,uint64)void': void\n 'fundMbrCredits(uint64,pay)void': void\n 'withdrawMbrCredits(uint64,uint64)void': void\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': bigint\n 'editDisbursement(uint64,string,uint64,uint64,string)void': void\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': void\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': void\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': bigint\n 'finalizeDisbursement(uint64)void': void\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': bigint\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': bigint\n 'claimRewards((uint64,uint64)[])void': void\n 'reclaimRewards(uint64,(address,uint64)[])void': void\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': bigint\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr(string,string)(uint64,uint64)': RewardsMbrData\n 'optIn(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Rewards smart contract.\n */\nexport type RewardsTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: RewardsArgs['obj']['create(string,uint64)void']\n argsTuple: RewardsArgs['tuple']['create(string,uint64)void']\n returns: RewardsReturns['create(string,uint64)void']\n }>\n & Record<'fundMbrCredits(uint64,pay)void' | 'fundMbrCredits', {\n argsObj: RewardsArgs['obj']['fundMbrCredits(uint64,pay)void']\n argsTuple: RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']\n returns: RewardsReturns['fundMbrCredits(uint64,pay)void']\n }>\n & Record<'withdrawMbrCredits(uint64,uint64)void' | 'withdrawMbrCredits', {\n argsObj: RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void']\n argsTuple: RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']\n returns: RewardsReturns['withdrawMbrCredits(uint64,uint64)void']\n }>\n & Record<'createDisbursement(pay,string,uint64,uint64,string)uint64' | 'createDisbursement', {\n argsObj: RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64']\n argsTuple: RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']\n returns: RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64']\n }>\n & Record<'editDisbursement(uint64,string,uint64,uint64,string)void' | 'editDisbursement', {\n argsObj: RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void']\n argsTuple: RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']\n returns: RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void']\n }>\n & Record<'createUserAllocations(pay,uint64,(address,uint64)[])void' | 'createUserAllocations', {\n argsObj: RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']\n returns: RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void']\n }>\n & Record<'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void' | 'createAsaUserAllocations', {\n argsObj: RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n returns: RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n }>\n & Record<'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64' | 'createAsaDisbursementFromGroup', {\n argsObj: RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n returns: RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n }>\n & Record<'finalizeDisbursement(uint64)void' | 'finalizeDisbursement', {\n argsObj: RewardsArgs['obj']['finalizeDisbursement(uint64)void']\n argsTuple: RewardsArgs['tuple']['finalizeDisbursement(uint64)void']\n returns: RewardsReturns['finalizeDisbursement(uint64)void']\n }>\n & Record<'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64' | 'createInstantDisbursement', {\n argsObj: RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n returns: RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n }>\n & Record<'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64' | 'createInstantAsaDisbursement', {\n argsObj: RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n returns: RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n }>\n & Record<'claimRewards((uint64,uint64)[])void' | 'claimRewards', {\n argsObj: RewardsArgs['obj']['claimRewards((uint64,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']\n returns: RewardsReturns['claimRewards((uint64,uint64)[])void']\n }>\n & Record<'reclaimRewards(uint64,(address,uint64)[])void' | 'reclaimRewards', {\n argsObj: RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']\n returns: RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void']\n }>\n & Record<'allocationMbrCreditShortfall(uint64,uint64)uint64' | 'allocationMbrCreditShortfall', {\n argsObj: RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64']\n argsTuple: RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']\n returns: RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: RewardsArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: RewardsArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: RewardsReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: RewardsArgs['obj']['opUp()void']\n argsTuple: RewardsArgs['tuple']['opUp()void']\n returns: RewardsReturns['opUp()void']\n }>\n & Record<'mbr(string,string)(uint64,uint64)' | 'mbr', {\n argsObj: RewardsArgs['obj']['mbr(string,string)(uint64,uint64)']\n argsTuple: RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']\n returns: RewardsReturns['mbr(string,string)(uint64,uint64)']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: RewardsArgs['obj']['optIn(pay,uint64)void']\n argsTuple: RewardsArgs['tuple']['optIn(pay,uint64)void']\n returns: RewardsReturns['optIn(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the disbursement id cursor\n */\n disbursementId: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * the disbursement map of tokens\n \n the key is the uint64 id of the disbursement\n the value is the details of the disbursement\n\n */\n disbursements: Map<bigint | number, DisbursementDetails>\n /**\n * the user allocations of disbursements\n \n the key is the address of the qualified account with the uint64 id of the disbursement\n the value is the amount they are owed\n\n */\n userAllocations: Map<UserAllocationsKey, bigint>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type RewardsSignatures = keyof RewardsTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type RewardsNonVoidMethodSignatures = keyof RewardsTypes['methods'] extends infer T ? T extends keyof RewardsTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Rewards smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends RewardsSignatures> = RewardsTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Rewards smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends RewardsSignatures> = RewardsTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = RewardsTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = RewardsTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type RewardsCreateCallParams =\n | Expand<CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type RewardsDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: RewardsCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Rewards smart contract\n */\nexport abstract class RewardsParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends RewardsCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return RewardsParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Rewards smart contract using the create(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the fundMbrCredits(uint64,pay)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static fundMbrCredits(params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'fundMbrCredits(uint64,pay)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.payment],\n }\n }\n /**\n * Constructs a no op call for the withdrawMbrCredits(uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdrawMbrCredits(params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdrawMbrCredits(uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.amount],\n }\n }\n /**\n * Constructs a no op call for the createDisbursement(pay,string,uint64,uint64,string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createDisbursement(params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createDisbursement(pay,string,uint64,uint64,string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the editDisbursement(uint64,string,uint64,uint64,string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static editDisbursement(params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'editDisbursement(uint64,string,uint64,uint64,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the createUserAllocations(pay,uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createUserAllocations(params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createUserAllocations(pay,uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.id, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createAsaUserAllocations(axfer,uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createAsaUserAllocations(params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.id, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createAsaDisbursementFromGroup(params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPaymentIndex, params.args.assetTransferStartIndex, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the finalizeDisbursement(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalizeDisbursement(params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalizeDisbursement(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id],\n }\n }\n /**\n * Constructs a no op call for the createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createInstantDisbursement(params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.timeToUnlock, params.args.expiration, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createInstantAsaDisbursement(params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.assetXfer, params.args.timeToUnlock, params.args.expiration, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the claimRewards((uint64,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static claimRewards(params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'claimRewards((uint64,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewards],\n }\n }\n /**\n * Constructs a no op call for the reclaimRewards(uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static reclaimRewards(params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'reclaimRewards(uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.reclaims],\n }\n }\n /**\n * Constructs a no op call for the allocationMbrCreditShortfall(uint64,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'allocationMbrCreditShortfall(uint64,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.allocationCount],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(string,string)(uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(string,string)(uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.title, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Rewards smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class RewardsFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `RewardsFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new RewardsClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new RewardsClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Rewards smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: RewardsDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? RewardsParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (RewardsCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new RewardsClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(RewardsParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(RewardsParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using an ABI method call using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(RewardsParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | RewardsReturns['create(string,uint64)void']) }, appClient: new RewardsClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Rewards smart contract\n */\nexport class RewardsClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `RewardsClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Rewards app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `RewardsClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `RewardsClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<RewardsClient> {\n return new RewardsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `RewardsClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<RewardsClient> {\n return new RewardsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n fundMbrCredits: (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.fundMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdrawMbrCredits: (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.withdrawMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createDisbursement: (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n editDisbursement: (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.editDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createUserAllocations: (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createAsaUserAllocations: (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createAsaUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createAsaDisbursementFromGroup: (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalizeDisbursement: (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.finalizeDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createInstantDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createInstantDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createInstantAsaDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n claimRewards: (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.claimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n reclaimRewards: (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.reclaimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n allocationMbrCreditShortfall: (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(RewardsParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n mbr: (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.optIn(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n fundMbrCredits: (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.fundMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdrawMbrCredits: (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.withdrawMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createDisbursement: (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n editDisbursement: (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.editDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createUserAllocations: (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createAsaUserAllocations: (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createAsaUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createAsaDisbursementFromGroup: (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalizeDisbursement: (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.finalizeDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createInstantDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createInstantDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createInstantAsaDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n claimRewards: (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.claimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n reclaimRewards: (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.reclaimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n allocationMbrCreditShortfall: (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mbr: (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.optIn(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n fundMbrCredits: async (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.fundMbrCredits(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['fundMbrCredits(uint64,pay)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdrawMbrCredits: async (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.withdrawMbrCredits(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['withdrawMbrCredits(uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createDisbursement: async (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n editDisbursement: async (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.editDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createUserAllocations: async (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createUserAllocations(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createAsaUserAllocations: async (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createAsaUserAllocations(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createAsaDisbursementFromGroup: async (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalizeDisbursement: async (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.finalizeDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['finalizeDisbursement(uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createInstantDisbursement: async (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createInstantDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createInstantAsaDisbursement: async (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n claimRewards: async (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.claimRewards(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['claimRewards((uint64,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n reclaimRewards: async (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.reclaimRewards(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n allocationMbrCreditShortfall: async (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n mbr: async (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['mbr(string,string)(uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['optIn(pay,uint64)void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new RewardsClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']>) {\n const result = await this.appClient.send.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n return result.return as unknown as RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']>) {\n const result = await this.appClient.send.call(RewardsParamsFactory.mbr(params))\n return result.return as unknown as RewardsReturns['mbr(string,string)(uint64,uint64)']\n }\n\n /**\n * Methods to access state for the current Rewards app\n */\n state = {\n /**\n * Methods to access global state for the current Rewards app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n disbursementId: result.disbursementID,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the disbursementID key in global state\n */\n disbursementId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"disbursementID\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Rewards app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the disbursements map in box state\n */\n disbursements: {\n /**\n * Get all current values of the disbursements map in box state\n */\n getMap: async (): Promise<Map<bigint, DisbursementDetails>> => { return (await this.appClient.state.box.getMap(\"disbursements\")) as Map<bigint, DisbursementDetails> },\n /**\n * Get a current value of the disbursements map by key from box state\n */\n value: async (key: bigint | number): Promise<DisbursementDetails | undefined> => { return await this.appClient.state.box.getMapValue(\"disbursements\", key) as DisbursementDetails | undefined },\n },\n /**\n * Get values from the userAllocations map in box state\n */\n userAllocations: {\n /**\n * Get all current values of the userAllocations map in box state\n */\n getMap: async (): Promise<Map<UserAllocationsKey, bigint>> => { return (await this.appClient.state.box.getMap(\"userAllocations\")) as Map<UserAllocationsKey, bigint> },\n /**\n * Get a current value of the userAllocations map by key from box state\n */\n value: async (key: UserAllocationsKey): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"userAllocations\", key) as bigint | undefined },\n },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): RewardsComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a fundMbrCredits(uint64,pay)void method call against the Rewards contract\n */\n fundMbrCredits(params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.fundMbrCredits(params)))\n return this\n },\n /**\n * Add a withdrawMbrCredits(uint64,uint64)void method call against the Rewards contract\n */\n withdrawMbrCredits(params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawMbrCredits(params)))\n return this\n },\n /**\n * Add a createDisbursement(pay,string,uint64,uint64,string)uint64 method call against the Rewards contract\n */\n createDisbursement(params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createDisbursement(params)))\n return this\n },\n /**\n * Add a editDisbursement(uint64,string,uint64,uint64,string)void method call against the Rewards contract\n */\n editDisbursement(params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.editDisbursement(params)))\n return this\n },\n /**\n * Add a createUserAllocations(pay,uint64,(address,uint64)[])void method call against the Rewards contract\n */\n createUserAllocations(params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createUserAllocations(params)))\n return this\n },\n /**\n * Add a createAsaUserAllocations(axfer,uint64,(address,uint64)[])void method call against the Rewards contract\n */\n createAsaUserAllocations(params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createAsaUserAllocations(params)))\n return this\n },\n /**\n * Add a createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createAsaDisbursementFromGroup(params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createAsaDisbursementFromGroup(params)))\n return this\n },\n /**\n * Add a finalizeDisbursement(uint64)void method call against the Rewards contract\n */\n finalizeDisbursement(params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalizeDisbursement(params)))\n return this\n },\n /**\n * Add a createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createInstantDisbursement(params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createInstantDisbursement(params)))\n return this\n },\n /**\n * Add a createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createInstantAsaDisbursement(params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createInstantAsaDisbursement(params)))\n return this\n },\n /**\n * Add a claimRewards((uint64,uint64)[])void method call against the Rewards contract\n */\n claimRewards(params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.claimRewards(params)))\n return this\n },\n /**\n * Add a reclaimRewards(uint64,(address,uint64)[])void method call against the Rewards contract\n */\n reclaimRewards(params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.reclaimRewards(params)))\n return this\n },\n /**\n * Add a allocationMbrCreditShortfall(uint64,uint64)uint64 method call against the Rewards contract\n */\n allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.allocationMbrCreditShortfall(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Rewards contract\n */\n updateAkitaDao(params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Rewards contract\n */\n opUp(params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n /**\n * Add a mbr(string,string)(uint64,uint64) method call against the Rewards contract\n */\n mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Rewards contract\n */\n optIn(params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n return this\n },\n /**\n * Add a clear state call to the Rewards contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as RewardsComposer\n }\n}\nexport type RewardsComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the fundMbrCredits(uint64,pay)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n fundMbrCredits(params?: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']>): RewardsComposer<[...TReturns, RewardsReturns['fundMbrCredits(uint64,pay)void'] | undefined]>\n\n /**\n * Calls the withdrawMbrCredits(uint64,uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n withdrawMbrCredits(params?: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['withdrawMbrCredits(uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the createDisbursement(pay,string,uint64,uint64,string)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createDisbursement(params?: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64'] | undefined]>\n\n /**\n * Calls the editDisbursement(uint64,string,uint64,uint64,string)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n editDisbursement(params?: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']>): RewardsComposer<[...TReturns, RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void'] | undefined]>\n\n /**\n * Calls the createUserAllocations(pay,uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createUserAllocations(params?: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the createAsaUserAllocations(axfer,uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createAsaUserAllocations(params?: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createAsaDisbursementFromGroup(params?: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the finalizeDisbursement(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalizeDisbursement(params?: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['finalizeDisbursement(uint64)void'] | undefined]>\n\n /**\n * Calls the createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createInstantDisbursement(params?: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createInstantAsaDisbursement(params?: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the claimRewards((uint64,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n claimRewards(params?: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['claimRewards((uint64,uint64)[])void'] | undefined]>\n\n /**\n * Calls the reclaimRewards(uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n reclaimRewards(params?: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the allocationMbrCreditShortfall(uint64,uint64)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n allocationMbrCreditShortfall(params?: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']>): RewardsComposer<[...TReturns, RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']>): RewardsComposer<[...TReturns, RewardsReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr(string,string)(uint64,uint64) ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']>): RewardsComposer<[...TReturns, RewardsReturns['mbr(string,string)(uint64,uint64)'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): RewardsComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): RewardsComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<RewardsComposerResults<TReturns>>\n}\nexport type RewardsComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/**\n * ARC-65 error codes emitted by the Rewards contract.\n *\n * The contract logs `ERR:{code}` via `loggedAssert` / `loggedErr` before\n * failing, where `code` is one of the short alphanumeric tags in this file.\n * Keep this in sync with `akita-sc/smart_contracts/rewards/errors.ts` —\n * the short codes are the shared wire format between contract and SDK.\n *\n * Use `translateRewardsError(code)` to turn a code back into a\n * human-readable message for display in a UI or log.\n */\n\nimport { makeErrorTranslator } from '../errors'\n\n/**\n * Short code → human-readable message for every error the Rewards contract\n * can emit. Ordered roughly the same way as the contract-side file.\n */\nexport const REWARDS_ERROR_MESSAGES: Record<string, string> = {\n // --- Plugin / wallet ----------------------------------------------------\n PNCW: 'Plugin does not control wallet',\n\n // --- Token allocation boxes --------------------------------------------\n TABE: 'Token allocation box already exists',\n TBNE: 'Token allocation box does not exist',\n\n // --- Disbursement authorization ----------------------------------------\n YNCR: 'You are not the creator of this disbursement',\n\n // --- Asset opt-in -------------------------------------------------------\n ANOI: 'App is not opted into asset',\n\n // --- Disbursement lifecycle --------------------------------------------\n DBNE: 'Disbursement does not exist',\n DBAF: 'Disbursement already final',\n DBLK: 'Disbursement is locked',\n DBFD: 'Disbursement is fully distributed',\n DBNX: 'Disbursement has not expired',\n\n // --- Disbursement validation -------------------------------------------\n IDUT: 'Invalid disbursement unlock time',\n IDXT: 'Invalid disbursement expiration time',\n DBEM: 'Disbursements cannot be empty',\n DBMA: 'Disbursements must have allocations',\n\n // --- Allocations --------------------------------------------------------\n ALAE: 'Allocation already exists',\n ALNE: 'Allocation does not exist',\n\n // --- Totals -------------------------------------------------------------\n ISUM: 'Invalid sum',\n IMBR: 'Invalid MBR amount',\n}\n\n/**\n * Translates a short Rewards error code (or raw ARC-65 log entry) into a\n * human-readable message. Falls back to the common error table when the code\n * isn't domain-specific. Unknown codes pass through as-is.\n */\nexport const translateRewardsError = makeErrorTranslator(REWARDS_ERROR_MESSAGES)\n"]}
1
+ {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-MG6VYVYU.js","../src/rewards/index.ts","../src/generated/RewardsClient.ts","../src/rewards/errors.ts"],"names":[],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-MG6VYVYU.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { ABIMethod } from \"@algorandfoundation/algokit-utils/abi\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n RewardsClient,\n RewardsFactory,\n RewardsComposer,\n DisbursementDetails,\n RewardsMbrData,\n} from '../generated/RewardsClient';\nimport { ExpandedSendParams, MaybeSigner, NewContractSDKParams } from \"../types\";\nimport {\n GetMbrParams,\n GetAllocationMbrCreditShortfallParams,\n GetDisbursementParams,\n GetUserAllocationParams,\n RewardsGlobalState,\n OptInAssetParams,\n CreateDisbursementParams,\n EditDisbursementParams,\n FundMbrCreditsParams,\n WithdrawMbrCreditsParams,\n CreateUserAllocationsParams,\n CreateAsaUserAllocationsParams,\n FinalizeDisbursementParams,\n CreateInstantDisbursementParams,\n CreateInstantAsaDisbursementParams,\n CreateAsaDisbursementFromGroupParams,\n ClaimRewardsParams,\n ReclaimRewardsParams,\n UpdateAkitaDaoParams,\n UserAllocation,\n} from \"./types\";\n\nexport * from \"./types\";\nexport * from \"./errors\";\n\n/** Base references available per transaction */\nconst BASE_REFERENCES = 8;\n/** References added by each opUp call */\nconst REFERENCES_PER_OPUP = 8;\nconst MAX_ALGORAND_GROUP_SIZE = 16;\nconst CREATE_ASA_DISBURSEMENT_FROM_GROUP = ABIMethod.fromSignature(\n \"createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64\",\n);\n\n/**\n * SDK for interacting with the Rewards contract.\n * Use this to create disbursements, manage allocations, and claim/reclaim rewards.\n */\nexport class RewardsSDK extends BaseSDK<RewardsClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: RewardsFactory, ...params }, ENV_VAR_NAMES.REWARDS_APP_ID);\n }\n\n // ========== OpUp Helpers ==========\n\n /**\n * Calculates the number of opUp calls needed for a given reference count.\n * @param referencesNeeded - Number of references needed for the operation\n * @param baseReferences - Base references available (default 8)\n * @returns Number of opUp calls needed (0 if none needed)\n */\n private calculateOpUpsNeeded(referencesNeeded: number, baseReferences = BASE_REFERENCES): number {\n if (referencesNeeded <= baseReferences) {\n return 0;\n }\n return Math.ceil((referencesNeeded - baseReferences) / REFERENCES_PER_OPUP);\n }\n\n /**\n * Adds the required number of opUp calls to a transaction group.\n * Each opUp call adds 8 more reference slots to the group.\n */\n private addOpUps<T extends unknown[]>(\n group: RewardsComposer<T>,\n count: number,\n sendParams: ExpandedSendParams,\n ): void {\n for (let i = 0; i < count; i++) {\n group.opUp({\n ...sendParams,\n args: {},\n // Add unique note to avoid duplicate transaction issues\n note: i > 0 ? `opUp-${i}` : undefined,\n });\n }\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current global state of the rewards contract.\n */\n async getState(): Promise<RewardsGlobalState> {\n const state = await this.client.state.global.getAll();\n\n return {\n disbursementId: state.disbursementId ?? 1n,\n version: state.version ?? '',\n akitaDao: state.akitaDao ?? 0n,\n };\n }\n\n /**\n * Gets the MBR (Minimum Balance Requirement) data for creating disbursements.\n * @param title - The disbursement title\n * @param note - The disbursement note\n */\n async mbr({ title, note }: GetMbrParams): Promise<RewardsMbrData> {\n return await this.client.mbr({ args: { title, note } });\n }\n\n /**\n * Gets a specific disbursement by ID.\n */\n async getDisbursement({ id }: GetDisbursementParams): Promise<DisbursementDetails> {\n const disbursement = await this.client.state.box.disbursements.value(id);\n\n if (disbursement === undefined) {\n throw new Error(`Disbursement ${id} not found`);\n }\n\n return disbursement;\n }\n\n /**\n * Gets all disbursements as a map.\n */\n async getDisbursements(): Promise<Map<bigint, DisbursementDetails>> {\n const disbursements = await this.client.state.box.disbursements.getMap();\n return new Map(Array.from(disbursements.entries()).map(([key, value]) => [BigInt(key), value]));\n }\n\n /**\n * Gets a user's allocation for a specific disbursement and asset.\n *\n * NOTE: Property order MUST match the APP_SPEC struct declaration order\n * (address, asset, disbursementId). v10's ABIStructType encoder uses\n * Object.values() which iterates in input-object property order and then\n * maps positionally onto the declared struct fields — a mismatched order\n * silently produces the wrong box key.\n */\n async getUserAllocation({ address, disbursementId, asset }: GetUserAllocationParams): Promise<bigint> {\n const allocation = await this.client.state.box.userAllocations.value({\n address,\n asset: BigInt(asset),\n disbursementId: BigInt(disbursementId),\n });\n\n if (allocation === undefined) {\n throw new Error(`Allocation not found for address ${address}, disbursement ${disbursementId}`);\n }\n\n return allocation;\n }\n\n /**\n * Checks if a user has an allocation for a specific disbursement and asset.\n *\n * NOTE: Property order MUST match APP_SPEC struct order (address, asset,\n * disbursementId). See getUserAllocation for the full explanation.\n */\n async hasAllocation({ address, disbursementId, asset }: GetUserAllocationParams): Promise<boolean> {\n try {\n const allocation = await this.client.state.box.userAllocations.value({\n address,\n asset: BigInt(asset),\n disbursementId: BigInt(disbursementId),\n });\n return allocation !== undefined;\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the additional MBR credit needed to create allocation boxes.\n */\n async allocationMbrCreditShortfall({\n id,\n allocationCount,\n }: GetAllocationMbrCreditShortfallParams): Promise<bigint> {\n return await this.client.allocationMbrCreditShortfall({\n args: { id, allocationCount },\n });\n }\n\n // ========== Write Methods ==========\n\n /**\n * Opts the rewards contract into an asset.\n */\n async optIn({ sender, signer, asset }: OptInAssetParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Asset opt-in costs 100,000 microAlgo\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(100_000),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.optIn({\n ...sendParams,\n extraFee: microAlgo(1000),\n args: {\n payment,\n asset,\n },\n });\n }\n\n /**\n * Creates a new disbursement.\n * Returns the disbursement ID.\n */\n async createDisbursement({\n sender,\n signer,\n title,\n timeToUnlock,\n expiration,\n note,\n mbrCredits = 0n,\n }: CreateDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // Get MBR for this disbursement\n const mbrData = await this.mbr({ title, note });\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.disbursements + BigInt(mbrCredits)),\n receiver: this.client.appAddress,\n });\n\n const { return: disbursementId } = await this.client.send.createDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n title,\n timeToUnlock,\n expiration,\n note,\n },\n });\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Edits an existing disbursement (only before finalization).\n */\n async editDisbursement({\n sender,\n signer,\n id,\n title,\n timeToUnlock,\n expiration,\n note,\n }: EditDisbursementParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.editDisbursement({\n ...sendParams,\n args: {\n id,\n title,\n timeToUnlock,\n expiration,\n note,\n },\n });\n }\n\n /**\n * Helper to format allocations for the contract.\n */\n private formatAllocations(allocations: UserAllocation[]): [string, bigint | number][] {\n return allocations.map(a => [a.address, a.amount]);\n }\n\n /**\n * Calculates the total amount from allocations.\n */\n private sumAllocations(allocations: UserAllocation[]): bigint {\n return allocations.reduce((sum, a) => sum + BigInt(a.amount), 0n);\n }\n\n /**\n * Funds reusable MBR credits on a disbursement.\n */\n async fundMbrCredits({ sender, signer, id, amount }: FundMbrCreditsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(BigInt(amount)),\n receiver: this.client.appAddress,\n });\n\n await (this.client.send as any).fundMbrCredits({\n ...sendParams,\n args: { id, payment },\n });\n }\n\n /**\n * Withdraws reusable MBR credits from a disbursement.\n */\n async withdrawMbrCredits({ sender, signer, id, amount }: WithdrawMbrCreditsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n await (this.client.send as any).withdrawMbrCredits({\n ...sendParams,\n extraFee: microAlgo(1000),\n args: { id, amount },\n });\n }\n\n /**\n * Creates ALGO allocations using existing disbursement MBR credits.\n * Fund credits separately with fundMbrCredits when allocationMbrCreditShortfall reports a shortfall.\n */\n async createUserAllocations({\n sender,\n signer,\n id,\n allocations,\n }: CreateUserAllocationsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const totalAmount = this.sumAllocations(allocations);\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(totalAmount),\n receiver: this.client.appAddress,\n });\n\n const referencesNeeded = allocations.length + 2;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await (this.client.send as any).createUserAllocations({\n ...sendParams,\n args: {\n payment,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n } else {\n const group = this.client.newGroup();\n\n (group as any).createUserAllocations({\n ...sendParams,\n args: {\n payment,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group as any, opUpsNeeded, sendParams);\n await group.send(sendParams);\n }\n }\n\n /**\n * Creates ASA allocations using existing disbursement MBR credits.\n * Fund credits separately with fundMbrCredits when allocationMbrCreditShortfall reports a shortfall.\n */\n async createAsaUserAllocations({\n sender,\n signer,\n id,\n asset,\n allocations,\n }: CreateAsaUserAllocationsParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const totalAmount = this.sumAllocations(allocations);\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: totalAmount,\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n const referencesNeeded = allocations.length + 3;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await (this.client.send as any).createAsaUserAllocations({\n ...sendParams,\n args: {\n assetXfer,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n } else {\n const group = this.client.newGroup();\n\n (group as any).createAsaUserAllocations({\n ...sendParams,\n args: {\n assetXfer,\n id,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group as any, opUpsNeeded, sendParams);\n await group.send(sendParams);\n }\n }\n\n /**\n * Creates and finalizes a multi-ASA disbursement in a single transaction group.\n *\n * Group shape:\n * 0: MBR payment\n * 1..N: ASA transfers to the rewards app\n * N+1: createAsaDisbursementFromGroup app call\n *\n * This supports up to 14 ASA allocations in one Algorand group.\n */\n async createAsaDisbursementFromGroup({\n sender,\n signer,\n title,\n timeToUnlock,\n expiration,\n note,\n allocations,\n }: CreateAsaDisbursementFromGroupParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n const transactionCount = 1 + allocations.length + 1;\n if (transactionCount > MAX_ALGORAND_GROUP_SIZE) {\n throw new Error(\n `ASA disbursement requires ${transactionCount} transactions; maximum group size is ${MAX_ALGORAND_GROUP_SIZE}`,\n );\n }\n\n const { disbursementId } = await this.getState();\n const mbrData = await this.mbr({ title, note });\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrData.disbursements + (mbrData.userAllocations * BigInt(allocations.length))),\n receiver: this.client.appAddress,\n });\n\n const group = this.client.newGroup();\n (group as any).addTransaction(mbrPayment, sendParams.signer);\n\n for (const allocation of allocations) {\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n receiver: this.client.appAddress,\n assetId: BigInt(allocation.asset),\n amount: BigInt(allocation.amount),\n });\n (group as any).addTransaction(assetXfer, sendParams.signer);\n }\n\n const appCall = await this.client.algorand.createTransaction.appCallMethodCall({\n ...sendParams,\n appId: this.client.appId,\n method: CREATE_ASA_DISBURSEMENT_FROM_GROUP,\n args: [\n 0n,\n 1n,\n title,\n timeToUnlock,\n expiration,\n note,\n allocations.map(({ address, amount }) => [address, amount]),\n ],\n note: `asa-disbursement-${disbursementId}`,\n });\n\n (group as any).addTransaction(appCall, sendParams.signer);\n await group.send(sendParams);\n\n return disbursementId;\n }\n\n /**\n * Finalizes a disbursement, locking it for distribution.\n */\n async finalizeDisbursement({ sender, signer, id }: FinalizeDisbursementParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.finalizeDisbursement({\n ...sendParams,\n args: { id },\n });\n }\n\n /**\n * Creates and finalizes an ALGO disbursement in a single call.\n * Returns the disbursement ID.\n * Automatically adds opUp calls for large allocation batches.\n */\n async createInstantDisbursement({\n sender,\n signer,\n timeToUnlock,\n expiration,\n allocations,\n }: CreateInstantDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // MinDisbursementsMBR (41,700) + UserAllocationMBR (25,300) per allocation\n const MIN_DISBURSEMENTS_MBR = 41_700n;\n const USER_ALLOCATION_MBR = 25_300n;\n\n const mbrAmount = MIN_DISBURSEMENTS_MBR + (USER_ALLOCATION_MBR * BigInt(allocations.length));\n const totalAmount = this.sumAllocations(allocations);\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrAmount + totalAmount),\n receiver: this.client.appAddress,\n });\n\n // Each allocation needs ~1 box reference, plus 1 for disbursement box\n const referencesNeeded = allocations.length + 1;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n let disbursementId: bigint | undefined;\n\n if (opUpsNeeded === 0) {\n const result = await this.client.send.createInstantDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n disbursementId = result.return;\n } else {\n const group = this.client.newGroup();\n\n group.createInstantDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n const result = await group.send(sendParams);\n disbursementId = result.returns?.[0];\n }\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create instant disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Creates and finalizes an ASA disbursement in a single call.\n * Returns the disbursement ID.\n * Automatically adds opUp calls for large allocation batches.\n */\n async createInstantAsaDisbursement({\n sender,\n signer,\n timeToUnlock,\n expiration,\n asset,\n allocations,\n }: CreateInstantAsaDisbursementParams): Promise<bigint> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n // MinDisbursementsMBR (41,700) + UserAllocationMBR (25,300) per allocation\n const MIN_DISBURSEMENTS_MBR = 41_700n;\n const USER_ALLOCATION_MBR = 25_300n;\n\n const mbrAmount = MIN_DISBURSEMENTS_MBR + (USER_ALLOCATION_MBR * BigInt(allocations.length));\n const totalAmount = this.sumAllocations(allocations);\n\n const mbrPayment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(mbrAmount),\n receiver: this.client.appAddress,\n });\n\n const assetXfer = await this.client.algorand.createTransaction.assetTransfer({\n ...sendParams,\n amount: totalAmount,\n assetId: BigInt(asset),\n receiver: this.client.appAddress,\n });\n\n // Each allocation needs ~1 box reference, plus 1 for disbursement box, plus 1 for asset\n const referencesNeeded = allocations.length + 2;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n let disbursementId: bigint | undefined;\n\n if (opUpsNeeded === 0) {\n const result = await this.client.send.createInstantAsaDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n disbursementId = result.return;\n } else {\n const group = this.client.newGroup();\n\n group.createInstantAsaDisbursement({\n ...sendParams,\n args: {\n mbrPayment,\n assetXfer,\n timeToUnlock,\n expiration,\n allocations: this.formatAllocations(allocations),\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n const result = await group.send(sendParams);\n disbursementId = result.returns?.[0];\n }\n\n if (disbursementId === undefined) {\n throw new Error('Failed to create instant ASA disbursement');\n }\n\n return disbursementId;\n }\n\n /**\n * Claims rewards from one or more disbursements.\n * The caller claims their allocated rewards.\n * Automatically adds opUp calls for claiming from many disbursements.\n */\n async claimRewards({ sender, signer, rewards }: ClaimRewardsParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n // Format rewards as [id, asset] tuples\n const formattedRewards: [bigint | number, bigint | number][] = rewards.map(r => [r.id, r.asset]);\n\n // Each claim needs references for: disbursement box, allocation box, possibly asset\n // Plus inner transactions use references\n const referencesNeeded = rewards.length * 3;\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await this.client.send.claimRewards({\n ...sendParams,\n // Extra fee for inner transactions (1 reward transfer per claim; MBR refund is credited)\n extraFee: microAlgo(1000 * rewards.length),\n args: {\n rewards: formattedRewards,\n },\n });\n } else {\n const group = this.client.newGroup();\n\n group.claimRewards({\n ...sendParams,\n extraFee: microAlgo(1000 * rewards.length),\n args: {\n rewards: formattedRewards,\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n await group.send(sendParams);\n }\n }\n\n /**\n * Reclaims unclaimed rewards after a disbursement has expired.\n * Only the disbursement creator can reclaim.\n * Automatically adds opUp calls for reclaiming many allocations.\n */\n async reclaimRewards({ sender, signer, id, reclaims }: ReclaimRewardsParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n // Format reclaims as [address, asset] tuples\n const formattedReclaims: [string, bigint | number][] = reclaims.map(r => [r.address, r.asset]);\n\n // Each reclaim needs references for: allocation box, possibly asset, receiver account\n const referencesNeeded = reclaims.length * 2 + 1; // +1 for disbursement box\n const opUpsNeeded = this.calculateOpUpsNeeded(referencesNeeded);\n\n if (opUpsNeeded === 0) {\n await this.client.send.reclaimRewards({\n ...sendParams,\n // Extra fee for inner transactions (1 reward transfer per reclaim; MBR refund is credited)\n extraFee: microAlgo(1000 * reclaims.length),\n args: {\n id,\n reclaims: formattedReclaims,\n },\n });\n } else {\n const group = this.client.newGroup();\n\n group.reclaimRewards({\n ...sendParams,\n extraFee: microAlgo(1000 * reclaims.length),\n args: {\n id,\n reclaims: formattedReclaims,\n },\n });\n\n this.addOpUps(group, opUpsNeeded, sendParams);\n\n await group.send(sendParams);\n }\n }\n\n /**\n * Updates the Akita DAO reference.\n */\n async updateAkitaDao({ sender, signer, akitaDao }: UpdateAkitaDaoParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.updateAkitaDao({\n ...sendParams,\n args: { akitaDao },\n });\n }\n}\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^10\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/algorand-client'\nimport { ABIReturn, ABIStructType, Arc56Contract, getStructValueFromTupleValue } from '@algorandfoundation/algokit-utils/abi'\nimport { OnApplicationComplete, TransactionSigner, Transaction } from '@algorandfoundation/algokit-utils/transact'\nimport { SimulateResponse } from '@algorandfoundation/algokit-utils/algod-client'\nimport { Address, encodeAddress } from '@algorandfoundation/algokit-utils'\nimport { AppClientMethodCallParams, AppClientCompilationParams, AppClientDeployParams, CallOnComplete, AppClient as _AppClient, AppClientParams, ResolveAppClientByCreatorAndName, ResolveAppClientByNetwork, AppClientBareCallParams, CloneAppClientParams } from '@algorandfoundation/algokit-utils/app-client'\nimport { SendParams,SendTransactionComposerResults } from '@algorandfoundation/algokit-utils/transaction'\nimport { AppFactoryCreateMethodCallParams, AppFactoryAppClientParams, AppFactoryDeployParams, AppFactoryParams, AppFactory as _AppFactory, AppFactoryResolveAppClientByCreatorAndNameParams, CreateSchema } from '@algorandfoundation/algokit-utils/app-factory'\nimport { TransactionComposer, TransactionComposerConfig, SkipSignaturesSimulateOptions, RawSimulateOptions, SimulateOptions, AppMethodCallTransactionArgument } from '@algorandfoundation/algokit-utils/composer'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"Rewards\",\"structs\":{\"DisbursementDetails\":[{\"name\":\"creator\",\"type\":\"address\"},{\"name\":\"finalized\",\"type\":\"bool\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"uint64\"},{\"name\":\"timeToUnlock\",\"type\":\"uint64\"},{\"name\":\"expiration\",\"type\":\"uint64\"},{\"name\":\"allocations\",\"type\":\"uint64\"},{\"name\":\"distributed\",\"type\":\"uint64\"},{\"name\":\"mbrCredits\",\"type\":\"uint64\"},{\"name\":\"usedMbrCredits\",\"type\":\"uint64\"},{\"name\":\"note\",\"type\":\"string\"}],\"RewardsMBRData\":[{\"name\":\"disbursements\",\"type\":\"uint64\"},{\"name\":\"userAllocations\",\"type\":\"uint64\"}],\"UserAllocationsKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"asset\",\"type\":\"uint64\"},{\"name\":\"disbursementId\",\"type\":\"uint64\"}]},\"methods\":[{\"name\":\"create\",\"args\":[{\"type\":\"string\",\"name\":\"version\"},{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"fundMbrCredits\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"pay\",\"name\":\"payment\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"withdrawMbrCredits\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"amount\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"editDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createUserAllocations\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createAsaUserAllocations\",\"args\":[{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createAsaDisbursementFromGroup\",\"args\":[{\"type\":\"uint64\",\"name\":\"mbrPaymentIndex\"},{\"type\":\"uint64\",\"name\":\"assetTransferStartIndex\"},{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"string\",\"name\":\"note\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"finalizeDisbursement\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createInstantDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"createInstantAsaDisbursement\",\"args\":[{\"type\":\"pay\",\"name\":\"mbrPayment\"},{\"type\":\"axfer\",\"name\":\"assetXfer\"},{\"type\":\"uint64\",\"name\":\"timeToUnlock\"},{\"type\":\"uint64\",\"name\":\"expiration\"},{\"type\":\"(address,uint64)[]\",\"name\":\"allocations\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"claimRewards\",\"args\":[{\"type\":\"(uint64,uint64)[]\",\"name\":\"rewards\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"reclaimRewards\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"(address,uint64)[]\",\"name\":\"reclaims\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"allocationMbrCreditShortfall\",\"args\":[{\"type\":\"uint64\",\"name\":\"id\"},{\"type\":\"uint64\",\"name\":\"allocationCount\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"updateAkitaDAO\",\"args\":[{\"type\":\"uint64\",\"name\":\"akitaDAO\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"opUp\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"mbr\",\"args\":[{\"type\":\"string\",\"name\":\"title\"},{\"type\":\"string\",\"name\":\"note\"}],\"returns\":{\"type\":\"(uint64,uint64)\",\"struct\":\"RewardsMBRData\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"optIn\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\",\"desc\":\"The payment transaction\"},{\"type\":\"uint64\",\"name\":\"asset\",\"desc\":\"The asset to be opted into\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"optin tells the contract to opt into an asa\",\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":2,\"bytes\":1},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"disbursementID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"ZGlzYnVyc2VtZW50X2lk\",\"desc\":\"the disbursement id cursor\"},\"version\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMString\",\"key\":\"dmVyc2lvbg==\",\"desc\":\"the current version of the contract\"},\"akitaDAO\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"YWtpdGFfZGFv\",\"desc\":\"the app ID of the Akita DAO\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"disbursements\":{\"keyType\":\"uint64\",\"valueType\":\"DisbursementDetails\",\"desc\":\"the disbursement map of tokens\\n\\nthe key is the uint64 id of the disbursement\\nthe value is the details of the disbursement\",\"prefix\":\"ZA==\"},\"userAllocations\":{\"keyType\":\"UserAllocationsKey\",\"valueType\":\"uint64\",\"desc\":\"the user allocations of disbursements\\n\\nthe key is the address of the qualified account with the uint64 id of the disbursement\\nthe value is the amount they are owed\",\"prefix\":\"dQ==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[915,2990,3271],\"errorMessage\":\"Box must have value\"},{\"pc\":[1205,1512,1952],\"errorMessage\":\"ERR:ALAE\"},{\"pc\":[2985,3266],\"errorMessage\":\"ERR:ALNE\"},{\"pc\":[911,1149,1453,2241,3189],\"errorMessage\":\"ERR:DBAF\"},{\"pc\":[2101,2295],\"errorMessage\":\"ERR:DBEM\"},{\"pc\":[2954],\"errorMessage\":\"ERR:DBFD\"},{\"pc\":[2922,2934],\"errorMessage\":\"ERR:DBLK\"},{\"pc\":[2115,2304],\"errorMessage\":\"ERR:DBMA\"},{\"pc\":[422,513,877,1067,1371,2171,2851,3143,3401],\"errorMessage\":\"ERR:DBNE\"},{\"pc\":[3209],\"errorMessage\":\"ERR:DBNX\"},{\"pc\":[2063,2262],\"errorMessage\":\"ERR:IDUT\"},{\"pc\":[2087,2286],\"errorMessage\":\"ERR:IDXT\"},{\"pc\":[537,553,3657,3716],\"errorMessage\":\"ERR:IMBR\"},{\"pc\":[450,463,684,700,1293,1306,1763,1782,2461,2477,2681,2694],\"errorMessage\":\"ERR:IPAY\"},{\"pc\":[3597],\"errorMessage\":\"ERR:IPMA\"},{\"pc\":[3575],\"errorMessage\":\"ERR:IPMR\"},{\"pc\":[1601,1615,1966,1986,2708,2722],\"errorMessage\":\"ERR:IXFR\"},{\"pc\":[3485],\"errorMessage\":\"ERR:NDAO\"},{\"pc\":[437,528,902,1140,1444,2232,3180],\"errorMessage\":\"ERR:YNCR\"},{\"pc\":[3469],\"errorMessage\":\"application exists\"},{\"pc\":[3456,3624],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[1176,1480,1921,2412,2629,2824,3233],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[427,469,478,518,542,559,574,883,888,979,985,1073,1079,1223,1234,1239,1248,1377,1383,1530,1541,1546,1555,2001,2012,2017,2026,2093,2107,2129,2177,2183,2193,2202,2211,2219,2317,2858,2865,2874,2883,3001,3012,3017,3026,3149,3159,3167,3282,3293,3298,3307,3415,3646,3664,3676,3681,3690,3705,3723,3735,3740,3749],\"errorMessage\":\"index out of bounds\"},{\"pc\":[349,608,649,819,857,1040,1344,1649,1690,1712,2362,2579,2791,3116,3498,3514],\"errorMessage\":\"invalid array length header\"},{\"pc\":[356,615,656,828,863,1656,1697,3505,3521],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<arc4.uint8>\"},{\"pc\":[3128],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::AllocationReclaimDetails>\"},{\"pc\":[2803],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::ClaimDetails>\"},{\"pc\":[1052,1356,1726,2376,2593],\"errorMessage\":\"invalid number of bytes for arc4.dynamic_array<smart_contracts/rewards/types.ts::UserAllocation>\"},{\"pc\":[367,395,488,497,629,640,809,838,848,1029,1333,1631,1641,1670,1681,2156,2345,2354,2562,2571,3105,3376,3385,3448,3553],\"errorMessage\":\"invalid number of bytes for arc4.uint64\"},{\"pc\":[1325,1908,2554],\"errorMessage\":\"transaction type is axfer\"},{\"pc\":[408,602,1021,1738,2337,2543,3545],\"errorMessage\":\"transaction type is pay\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAyNTMwMCA0MTcwMAogICAgYnl0ZWNibG9jayAiZCIgIkVSUjpJUEFZIiAiIiAiRVJSOkRCTkUiICJFUlI6WU5DUiIgInUiIDB4MTUxZjdjNzUgIkVSUjpJWEZSIiAiRVJSOkRCQUYiICJFUlI6SU1CUiIgImRpc2J1cnNlbWVudF9pZCIgImFraXRhX2RhbyIgIkVSUjpBTEFFIiAweDAwMDA1ZCAiRVJSOklEVVQiICJFUlI6SURYVCIgIkVSUjpEQkVNIiAiRVJSOkRCTUEiIDB4ODAwMDVkIDB4MDA1ZjAwMDAwMDAwICJFUlI6REJMSyIgIkVSUjpBTE5FIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gZGlzYnVyc2VtZW50SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFJld2FyZHNHbG9iYWxTdGF0ZUtleURpc2J1cnNlbWVudElEIH0pCiAgICBieXRlYyAxMCAvLyAiZGlzYnVyc2VtZW50X2lkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBSZXdhcmRzIGV4dGVuZHMgY2xhc3NlcyhCYXNlUmV3YXJkcywgQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIzCiAgICBwdXNoYnl0ZXNzIDB4NjY2MTIwNWEgMHhkNjFhNjlmYSAweDFjOWViYmRiIDB4OGY0OTI2MmQgMHg1NjU2YWNmOSAweGY2MmNkYzJiIDB4NmY1YzEwY2YgMHg1NDI0YTU5MSAweDdiN2RjNWZjIDB4YWYxYTE0ZjIgMHgzZWM0MGFhNCAweGJkM2NkMDkwIDB4MTQ5NjlkOTcgMHgzM2U5MmM5NCAweDg1NGRlZGUwIDB4ZDU0YmJhZDkgMHgzOTRlYWViMiAvLyBtZXRob2QgImZ1bmRNYnJDcmVkaXRzKHVpbnQ2NCxwYXkpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdNYnJDcmVkaXRzKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY3JlYXRlRGlzYnVyc2VtZW50KHBheSxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdWludDY0IiwgbWV0aG9kICJlZGl0RGlzYnVyc2VtZW50KHVpbnQ2NCxzdHJpbmcsdWludDY0LHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY3JlYXRlVXNlckFsbG9jYXRpb25zKHBheSx1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9ucyhheGZlcix1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCh1aW50NjQsdWludDY0LHN0cmluZyx1aW50NjQsdWludDY0LHN0cmluZywoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJmaW5hbGl6ZURpc2J1cnNlbWVudCh1aW50NjQpdm9pZCIsIG1ldGhvZCAiY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudChwYXksdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpW10pdWludDY0IiwgbWV0aG9kICJjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50KHBheSxheGZlcix1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NClbXSl1aW50NjQiLCBtZXRob2QgImNsYWltUmV3YXJkcygodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJyZWNsYWltUmV3YXJkcyh1aW50NjQsKGFkZHJlc3MsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgImFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGwodWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJvcFVwKCl2b2lkIiwgbWV0aG9kICJtYnIoc3RyaW5nLHN0cmluZykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGZ1bmRNYnJDcmVkaXRzIHdpdGhkcmF3TWJyQ3JlZGl0cyBjcmVhdGVEaXNidXJzZW1lbnQgZWRpdERpc2J1cnNlbWVudCBjcmVhdGVVc2VyQWxsb2NhdGlvbnMgY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCBmaW5hbGl6ZURpc2J1cnNlbWVudCBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQgY2xhaW1SZXdhcmRzIHJlY2xhaW1SZXdhcmRzIGFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGwgdXBkYXRlQWtpdGFEQU8gbWFpbl9vcFVwX3JvdXRlQDE5IG1iciBvcHRJbgogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBSZXdhcmRzIGV4dGVuZHMgY2xhc3NlcyhCYXNlUmV3YXJkcywgQWtpdGFCYXNlQ29udHJhY3QsIENvbnRyYWN0V2l0aE9wdEluKSB7CiAgICBwdXNoYnl0ZXMgMHhjZDlhZDY3ZSAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDcKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIHB1c2hieXRlcyAidmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTA5CiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUgPSB2ZXJzaW9uCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDExIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gdGhpcy5ha2l0YURBTy52YWx1ZSA9IEFwcGxpY2F0aW9uKGFraXRhREFPKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuZnVuZE1ickNyZWRpdHNbcm91dGluZ10oKSAtPiB2b2lkOgpmdW5kTWJyQ3JlZGl0czoKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTE1CiAgICAvLyBmdW5kTWJyQ3JlZGl0cyhpZDogdWludDY0LCBwYXltZW50OiBndHhuLlBheW1lbnRUeG4pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGZ1bmRNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6REJORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5FCgpmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5jcmVhdG9yID09PSBUeG4uc2VuZGVyLCBFUlJfWU9VX0FSRV9OT1RfVEhFX0NSRUFUT1IpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGJueiBmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBmdW5kTWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANwogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID4gMCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogZnVuZE1ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmZ1bmRNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4NgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzICs9IGFtb3VudAogICAgZHVwbiAyCiAgICBwdXNoaW50IDc1CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyA0CiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDc1CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIGZ1bmRNYnJDcmVkaXRzKGlkOiB1aW50NjQsIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMud2l0aGRyYXdNYnJDcmVkaXRzW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdNYnJDcmVkaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHdpdGhkcmF3TWJyQ3JlZGl0cyhpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHdpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKd2l0aGRyYXdNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmNyZWF0b3IgPT09IFR4bi5zZW5kZXIsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYm56IHdpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKd2l0aGRyYXdNYnJDcmVkaXRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiAwLCBFUlJfSU5WQUxJRF9NQlJfQU1PVU5UKQogICAgZGlnIDEKICAgIGJueiB3aXRoZHJhd01ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCndpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTI4CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGR1cAogICAgcHVzaGludCA3NQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgPj0KICAgIGJueiB3aXRoZHJhd01ickNyZWRpdHNfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCndpdGhkcmF3TWJyQ3JlZGl0c19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTI5CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm1ickNyZWRpdHMgLT0gYW1vdW50CiAgICBkdXBuIDIKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgLQogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDc1CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEzMS0xMzQKICAgIC8vIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBhbW91bnQsCiAgICAvLyB9KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTMxLTEzNAogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vIH0pLnN1Ym1pdCgpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIHdpdGhkcmF3TWJyQ3JlZGl0cyhpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlRGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlRGlzYnVyc2VtZW50OgogICAgYnl0ZWNfMiAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMzctMTQzCiAgICAvLyBjcmVhdGVEaXNidXJzZW1lbnQoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdGltZVRvVW5sb2NrOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgbm90ZTogc3RyaW5nCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE0NAogICAgLy8gY29uc3QgaWQgPSB0aGlzLm5ld0Rpc2J1cnNlbWVudElEKCkKICAgIGNhbGxzdWIgbmV3RGlzYnVyc2VtZW50SUQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ2CiAgICAvLyBjb25zdCBjb3N0cyA9IHRoaXMubWJyKHRpdGxlLCBub3RlKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBtYnJBbW91bnQgPSBjb3N0cy5kaXNidXJzZW1lbnRzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTQ5CiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID49IG1ickFtb3VudCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyA2CiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSA5CiAgICBkaWcgMQogICAgPj0KICAgIGJueiBjcmVhdGVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTUzCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIG1ickNyZWRpdHM6IG1iclBheW1lbnQuYW1vdW50IC0gbWJyQW1vdW50LAogICAgZGlnIDgKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBkaWcgNwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgYnl0ZWMgMTMgLy8gMHgwMDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCA5MwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTUyCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE1Mi0xNjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICAvLyAgIGNyZWF0b3I6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGZpbmFsaXplZDogZmFsc2UsCiAgICAvLyAgIHRpdGxlLAogICAgLy8gICBhbW91bnQ6IDAsCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IDAsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiBtYnJQYXltZW50LmFtb3VudCAtIG1ickFtb3VudCwKICAgIC8vICAgdXNlZE1ickNyZWRpdHM6IDAsCiAgICAvLyAgIG5vdGUsCiAgICAvLyB9CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEzNy0xNDMKICAgIC8vIGNyZWF0ZURpc2J1cnNlbWVudCgKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0aXRsZTogc3RyaW5nLAogICAgLy8gICB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICBub3RlOiBzdHJpbmcKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5lZGl0RGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZWRpdERpc2J1cnNlbWVudDoKICAgIGJ5dGVjXzIgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTY5LTE3NQogICAgLy8gZWRpdERpc2J1cnNlbWVudCgKICAgIC8vICAgaWQ6IHVpbnQ2NCwKICAgIC8vICAgdGl0bGU6IHN0cmluZywKICAgIC8vICAgdGltZVRvVW5sb2NrOiB1aW50NjQsCiAgICAvLyAgIGV4cGlyYXRpb246IHVpbnQ2NCwKICAgIC8vICAgbm90ZTogc3RyaW5nCiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3NgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTc4CiAgICAvLyBjb25zdCB7IGNyZWF0b3IsIGZpbmFsaXplZCB9ID0gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IGNyZWF0b3IsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKZWRpdERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTgwCiAgICAvLyBsb2dnZWRBc3NlcnQoZmluYWxpemVkID09PSBmYWxzZSwgRVJSX0RJU0JVUlNFTUVOVF9BTFJFQURZX0ZJTkFMKQogICAgZGlnIDYKICAgIGJ6IGVkaXREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCmVkaXREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS50aXRsZSA9IHRpdGxlCiAgICBkdXBuIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIHB1c2hpbnQgMzMKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICBleHRyYWN0MwogICAgZGlnIDkKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHB1c2hpbnQgOTEKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICAtCiAgICB1bmNvdmVyIDIKICAgIGRpZyA4CiAgICArCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgOTEKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4MwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS50aW1lVG9VbmxvY2sgPSB0aW1lVG9VbmxvY2sKICAgIGR1cAogICAgcHVzaGludCA0MwogICAgZGlnIDYKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE4NAogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5leHBpcmF0aW9uID0gZXhwaXJhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDUxCiAgICBkaWcgNQogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg1CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm5vdGUgPSBub3RlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBwdXNoaW50IDkxCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjE2OS0xNzUKICAgIC8vIGVkaXREaXNidXJzZW1lbnQoCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZwogICAgLy8gKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5jcmVhdGVVc2VyQWxsb2NhdGlvbnNbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVVc2VyQWxsb2NhdGlvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg4LTE5MgogICAgLy8gY3JlYXRlVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMwogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL3R5cGVzLnRzOjpVc2VyQWxsb2NhdGlvbj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS5leGlzdHMsIEVSUl9ESVNCVVJTRU1FTlRfRE9FU19OT1RfRVhJU1QpCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTUKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCB0aXRsZSwgbm90ZSB9ID0gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGludCAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyCiAgICBpbnRjXzEgLy8gMQogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ1cnkgMTEKICAgIGRpZyAxCiAgICBwdXNoaW50IDkzCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMgogICAgcHVzaGludCA5MwogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgMTIKICAgIGRpZyAxCiAgICBwdXNoaW50IDkxCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAyCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgZXh0cmFjdCAyIDAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gY3JlYXRvciwgRVJSX1lPVV9BUkVfTk9UX1RIRV9DUkVBVE9SKQogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGJueiBjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTk3CiAgICAvLyBsb2dnZWRBc3NlcnQoIWZpbmFsaXplZCwgRVJSX0RJU0JVUlNFTUVOVF9BTFJFQURZX0ZJTkFMKQogICAgZGlnIDgKICAgIGJ6IGNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANwogICAgYnl0ZWMgOCAvLyAiRVJSOkRCQUYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJBRgoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIGxldCBzdW06IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDgKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc193aGlsZV90b3BAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjAwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA3CiAgICBkaWcgMwogICAgPAogICAgYnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX3doaWxlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDgKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDE0CiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBhc3NldDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwMS0yMDUKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogaWQsCiAgICAvLyAgIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiAwLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMudXNlckFsbG9jYXRpb25zKHVzZXJBbGxvY2F0aW9uc0tleSkuZXhpc3RzLCBFUlJfQUxMT0NBVElPTl9BTFJFQURZX0VYSVNUUykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEyCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDU5CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5hbW91bnQgKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgMzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gc3VtICs9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDcKICAgICsKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDcKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDgKICAgIGIgY3JlYXRlVXNlckFsbG9jYXRpb25zX3doaWxlX3RvcEA4CgpjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icih0aXRsZSwgbm90ZSkKICAgIGRpZyA5CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gY29uc3QgbWJyQW1vdW50OiB1aW50NjQgPSBjb3N0cy51c2VyQWxsb2NhdGlvbnMgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyB0aGlzLnVzZU1ickNyZWRpdChpZCwgbWJyQW1vdW50KQogICAgZGlnIDUKICAgIHN3YXAKICAgIGNhbGxzdWIgdXNlTWJyQ3JlZGl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDUKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0CiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gc3VtLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDUKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDcKICAgID09CiAgICBibnogY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKY3JlYXRlVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTg4LTE5MgogICAgLy8gY3JlYXRlVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGlkOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjQtMjI4CiAgICAvLyBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnMoCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICBpZDogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXQogICAgLy8gKTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBwdXNoaW50IDQwCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMjkKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6REJORSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5FCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gY29uc3QgeyBjcmVhdG9yLCBmaW5hbGl6ZWQsIHRpdGxlLCBub3RlIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDEKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMQogICAgZGlnIDEKICAgIHB1c2hpbnQgOTMKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAyCiAgICBwdXNoaW50IDkzCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgYnVyeSAxMgogICAgZGlnIDEKICAgIHB1c2hpbnQgOTEKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICB1bmNvdmVyIDMKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBleHRyYWN0IDIgMAogICAgYnVyeSAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzIKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSBjcmVhdG9yLCBFUlJfWU9VX0FSRV9OT1RfVEhFX0NSRUFUT1IpCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYm56IGNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNCAvLyAiRVJSOllOQ1IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6WU5DUgoKY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGxvZ2dlZEFzc2VydCghZmluYWxpemVkLCBFUlJfRElTQlVSU0VNRU5UX0FMUkVBRFlfRklOQUwpCiAgICBkaWcgOAogICAgYnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA4IC8vICJFUlI6REJBRiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQkFGCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gbGV0IG1hdGNoU3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA4CgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfd2hpbGVfdG9wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgZGlnIDMKICAgIDwKICAgIGJ6IGNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl93aGlsZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyMzkKICAgIC8vIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA4CiAgICBwdXNoaW50IDQwCiAgICAqCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxNAogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gYXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICBkaWcgNgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNy0yNDEKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogaWQsCiAgICAvLyAgIGFkZHJlc3M6IGFsbG9jYXRpb25zW2ldLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjQyCiAgICAvLyBsb2dnZWRBc3NlcnQoIXRoaXMudXNlckFsbG9jYXRpb25zKHVzZXJBbGxvY2F0aW9uc0tleSkuZXhpc3RzLCBFUlJfQUxMT0NBVElPTl9BTFJFQURZX0VYSVNUUykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl9hc3NlcnRAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEyCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTMKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDU5CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5hbW91bnQgKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgMzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gbWF0Y2hTdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgNwogICAgKwogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgNwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgOAogICAgYiBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfd2hpbGVfdG9wQDgKCmNyZWF0ZUFzYVVzZXJBbGxvY2F0aW9uc19hZnRlcl93aGlsZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjUyCiAgICAvLyBjb25zdCBjb3N0cyA9IHRoaXMubWJyKHRpdGxlLCBub3RlKQogICAgZGlnIDkKICAgIGRpZyAxMQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IGNvc3RzLnVzZXJBbGxvY2F0aW9ucyAqIGFsbG9jYXRpb25zLmxlbmd0aAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIHRoaXMudXNlTWJyQ3JlZGl0KGlkLCBtYnJBbW91bnQpCiAgICBkaWcgNQogICAgc3dhcAogICAgY2FsbHN1YiB1c2VNYnJDcmVkaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjU2CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyA1CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0CiAgICBieXRlYyA3IC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpjcmVhdGVBc2FVc2VyQWxsb2NhdGlvbnNfYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNTcKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IG1hdGNoU3VtLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyA1CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZGlnIDcKICAgID09CiAgICBibnogY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNgogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zX2FmdGVyX2Fzc2VydEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjI0LTIyOAogICAgLy8gY3JlYXRlQXNhVXNlckFsbG9jYXRpb25zKAogICAgLy8gICBhc3NldFhmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclR4biwKICAgIC8vICAgaWQ6IHVpbnQ2NCwKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjgKICAgIC8vIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCgKICAgIC8vICAgbWJyUGF5bWVudEluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFzc2V0VHJhbnNmZXJTdGFydEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZywKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciA1CiAgICBkdXAKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL3R5cGVzLnRzOjpVc2VyQWxsb2NhdGlvbj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjY5CiAgICAvLyBjb25zdCBpZCA9IHRoaXMubmV3RGlzYnVyc2VtZW50SUQoKQogICAgY2FsbHN1YiBuZXdEaXNidXJzZW1lbnRJRAogICAgY292ZXIgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBndHhuLlBheW1lbnRUeG4obWJyUGF5bWVudEluZGV4KQogICAgZGlnIDMKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3MgogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icih0aXRsZSwgbm90ZSkKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3MwogICAgLy8gY29uc3QgZGlzYnVyc2VtZW50TWJyQW1vdW50ID0gY29zdHMuZGlzYnVyc2VtZW50cwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBjb25zdCBhbGxvY2F0aW9uTWJyQW1vdW50OiB1aW50NjQgPSBjb3N0cy51c2VyQWxsb2NhdGlvbnMgKiBhbGxvY2F0aW9ucy5sZW5ndGgKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKgogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPj0gZGlzYnVyc2VtZW50TWJyQW1vdW50ICsgYWxsb2NhdGlvbk1ickFtb3VudCwgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAxMAogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGRpZyAyCiAgICBkaWcgMgogICAgKwogICAgPj0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjgwCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyODgKICAgIC8vIG1ickNyZWRpdHM6IHBheW1lbnQuYW1vdW50IC0gZGlzYnVyc2VtZW50TWJyQW1vdW50LAogICAgZGlnIDEyCiAgICBkaWcgMwogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzktMjkxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IGZhbHNlLAogICAgLy8gICB0aXRsZSwKICAgIC8vICAgYW1vdW50OiAwLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiAwLAogICAgLy8gICBkaXN0cmlidXRlZDogMCwKICAgIC8vICAgbWJyQ3JlZGl0czogcGF5bWVudC5hbW91bnQgLSBkaXNidXJzZW1lbnRNYnJBbW91bnQsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiAwLAogICAgLy8gICBub3RlLAogICAgLy8gfQogICAgZGlnIDEwCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyAxMyAvLyAweDAwMDA1ZAogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICBwdXNoaW50IDkzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gYW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjc5LTI5MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiBmYWxzZSwKICAgIC8vICAgdGl0bGUsCiAgICAvLyAgIGFtb3VudDogMCwKICAgIC8vICAgdGltZVRvVW5sb2NrLAogICAgLy8gICBleHBpcmF0aW9uLAogICAgLy8gICBhbGxvY2F0aW9uczogMCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IHBheW1lbnQuYW1vdW50IC0gZGlzYnVyc2VtZW50TWJyQW1vdW50LAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogMCwKICAgIC8vICAgbm90ZSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxMQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgOAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGRpc2J1cnNlbWVudHMgPSBCb3hNYXA8dWludDY0LCBEaXNidXJzZW1lbnREZXRhaWxzPih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeERpc2J1cnNlbWVudHMgfSkKICAgIGJ5dGVjXzAgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyNzktMjkxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IGZhbHNlLAogICAgLy8gICB0aXRsZSwKICAgIC8vICAgYW1vdW50OiAwLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiAwLAogICAgLy8gICBkaXN0cmlidXRlZDogMCwKICAgIC8vICAgbWJyQ3JlZGl0czogcGF5bWVudC5hbW91bnQgLSBkaXNidXJzZW1lbnRNYnJBbW91bnQsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiAwLAogICAgLy8gICBub3RlLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MjkzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWxsb2NhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE0CgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfd2hpbGVfdG9wQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgMTMKICAgIGRpZyA0CiAgICA8CiAgICBieiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfd2hpbGVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjk0CiAgICAvLyBjb25zdCBhc3NldFhmZXIgPSBndHhuLkFzc2V0VHJhbnNmZXJUeG4oYXNzZXRUcmFuc2ZlclN0YXJ0SW5kZXggKyBpKQogICAgZGlnIDkKICAgIGRpZyAxNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGJ1cnkgMTcKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbi5hZGRyZXNzLAogICAgZGlnIDYKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIHB1c2hpbnQgNDAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDIxCiAgICBleHRyYWN0IDAgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mjk5CiAgICAvLyBhc3NldDogYXNzZXRYZmVyLnhmZXJBc3NldC5pZCwKICAgIHN3YXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyOTYtMzAwCiAgICAvLyBjb25zdCB1c2VyQWxsb2NhdGlvbnNLZXk6IFVzZXJBbGxvY2F0aW9uc0tleSA9IHsKICAgIC8vICAgZGlzYnVyc2VtZW50SUQ6IGlkLAogICAgLy8gICBhZGRyZXNzOiBhbGxvY2F0aW9uLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMTgKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmV4aXN0cywgRVJSX0FMTE9DQVRJT05fQUxSRUFEWV9FWElTVFMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpBTEFFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMQUUKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzAzCiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9UUkFOU0ZFUikKICAgIGRpZyAxNAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBsb2dnZWRBc3NlcnQoYXNzZXRYZmVyLmFzc2V0QW1vdW50ID09PSBhbGxvY2F0aW9uLmFtb3VudCwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgMTQKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgMTkKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgMTUKICAgID09CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgNyAvLyAiRVJSOklYRlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVhGUgoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA2CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbi5hbW91bnQKICAgIGRpZyAxMgogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgMTcKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzA3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFsbG9jYXRpb25zICs9IDEKICAgIGRpZyAxNwogICAgZHVwCiAgICBwdXNoaW50IDU5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCA1OQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYW1vdW50ICs9IGFsbG9jYXRpb24uYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICBwdXNoaW50IDM1CiAgICBzd2FwCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoyOTMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZGlnIDEzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxNAogICAgYiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfd2hpbGVfdG9wQDYKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyB0aGlzLnVzZU1ickNyZWRpdChpZCwgYWxsb2NhdGlvbk1ickFtb3VudCkKICAgIGRpZyAyCiAgICBkaWcgMQogICAgY2FsbHN1YiB1c2VNYnJDcmVkaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyB0aW1lVG9VbmxvY2sgPj0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCB8fCB0aW1lVG9VbmxvY2sgPT09IDAsCiAgICBkaWcgNwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPj0KICAgIGJueiBjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYm9vbF90cnVlQDE2CiAgICBkaWcgNwogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDE3CgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMTMtMzE2CiAgICAvLyBsb2dnZWRBc3NlcnQoCiAgICAvLyAgIHRpbWVUb1VubG9jayA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IHRpbWVUb1VubG9jayA9PT0gMCwKICAgIC8vICAgRVJSX0lOVkFMSURfRElTQlVSU0VNRU5UX1VOTE9DS19USU1FCiAgICAvLyApCiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAyMAogICAgYnl0ZWMgMTQgLy8gIkVSUjpJRFVUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklEVVQKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHB1c2hpbnQgNjAKICAgICsKICAgIGRpZyA3CiAgICA8PQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX3RydWVAMjIKICAgIGRpZyA2CiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfZmFsc2VAMjMKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX3RydWVAMjI6CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMxNy0zMjAKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIC8vICAgRVJSX0lOVkFMSURfRElTQlVSU0VNRU5UX0VYUElSQVRJT05fVElNRQogICAgLy8gKQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjYKICAgIGJ5dGVjIDE1IC8vICJFUlI6SURYVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRFhUCgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMjEKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFtb3VudCA+IDAsIEVSUl9ESVNCVVJTRU1FTlRTX0NBTk5PVF9CRV9FTVBUWSkKICAgIGRpZyAxNgogICAgcHVzaGludCAzNQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2FmdGVyX2Fzc2VydEAyOAogICAgYnl0ZWMgMTYgLy8gIkVSUjpEQkVNIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCRU0KCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMyMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYWxsb2NhdGlvbnMgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19NVVNUX0hBVkVfQUxMT0NBVElPTlMpCiAgICBkaWcgMTYKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9hZnRlcl9hc3NlcnRAMzAKICAgIGJ5dGVjIDE3IC8vICJFUlI6REJNQSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk1BCgpjcmVhdGVBc2FEaXNidXJzZW1lbnRGcm9tR3JvdXBfYWZ0ZXJfYXNzZXJ0QDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuZmluYWxpemVkID0gdHJ1ZQogICAgZGlnIDE2CiAgICBkdXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyAxCiAgICBzZXRiaXQKICAgIHB1c2hpbnQgMzIKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjI2MC0yNjgKICAgIC8vIGNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cCgKICAgIC8vICAgbWJyUGF5bWVudEluZGV4OiB1aW50NjQsCiAgICAvLyAgIGFzc2V0VHJhbnNmZXJTdGFydEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHRpdGxlOiBzdHJpbmcsCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIG5vdGU6IHN0cmluZywKICAgIC8vICAgYWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uW10KICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxOAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDIzOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMjQKCmNyZWF0ZUFzYURpc2J1cnNlbWVudEZyb21Hcm91cF9ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXNhRGlzYnVyc2VtZW50RnJvbUdyb3VwX2Jvb2xfbWVyZ2VAMTgKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmZpbmFsaXplRGlzYnVyc2VtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZmluYWxpemVEaXNidXJzZW1lbnQ6CiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBmaW5hbGl6ZURpc2J1cnNlbWVudChpZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpEQk5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTkUKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCB0aW1lVG9VbmxvY2ssIGV4cGlyYXRpb24sIGFtb3VudCwgYWxsb2NhdGlvbnMgfSA9IHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgcHVzaGludCAzMgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDUKICAgIGRpZyAxCiAgICBwdXNoaW50IDQzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgZGlnIDEKICAgIHB1c2hpbnQgNTEKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA2CiAgICBkaWcgMQogICAgcHVzaGludCAzNQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDcKICAgIHN3YXAKICAgIHB1c2hpbnQgNTkKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzMwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IGNyZWF0b3IsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIGxvZ2dlZEFzc2VydCghZmluYWxpemVkLCBFUlJfRElTQlVSU0VNRU5UX0FMUkVBRFlfRklOQUwpCiAgICBkaWcgMgogICAgYnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozMzYKICAgIC8vIHRpbWVUb1VubG9jayA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIHx8IHRpbWVUb1VubG9jayA9PT0gMCwKICAgIGRpZyAxCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICA+PQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUA5CiAgICBkaWcgMQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfZmFsc2VAMTAKCmZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUA5OgogICAgaW50Y18xIC8vIDEKCmZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjMzNS0zMzgKICAgIC8vIGxvZ2dlZEFzc2VydCgKICAgIC8vICAgdGltZVRvVW5sb2NrID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgfHwgdGltZVRvVW5sb2NrID09PSAwLAogICAgLy8gICBFUlJfSU5WQUxJRF9ESVNCVVJTRU1FTlRfVU5MT0NLX1RJTUUKICAgIC8vICkKICAgIGJueiBmaW5hbGl6ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTMKICAgIGJ5dGVjIDE0IC8vICJFUlI6SURVVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRFVUCgpmaW5hbGl6ZURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM0MAogICAgLy8gZXhwaXJhdGlvbiA+PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wICsgNjAgfHwgZXhwaXJhdGlvbiA9PT0gMCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHB1c2hpbnQgNjAKICAgICsKICAgIGRpZyA0CiAgICA8PQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfdHJ1ZUAxNQogICAgZGlnIDMKICAgIGJueiBmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDE2CgpmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX3RydWVAMTU6CiAgICBpbnRjXzEgLy8gMQoKZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9tZXJnZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzM5LTM0MgogICAgLy8gbG9nZ2VkQXNzZXJ0KAogICAgLy8gICBleHBpcmF0aW9uID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgKyA2MCB8fCBleHBpcmF0aW9uID09PSAwLAogICAgLy8gICBFUlJfSU5WQUxJRF9ESVNCVVJTRU1FTlRfRVhQSVJBVElPTl9USU1FCiAgICAvLyApCiAgICBibnogZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDE5CiAgICBieXRlYyAxNSAvLyAiRVJSOklEWFQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SURYVAoKZmluYWxpemVEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19DQU5OT1RfQkVfRU1QVFkpCiAgICBkaWcgNAogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMQogICAgYnl0ZWMgMTYgLy8gIkVSUjpEQkVNIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCRU0KCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyBsb2dnZWRBc3NlcnQoYWxsb2NhdGlvbnMgPiAwLCBFUlJfRElTQlVSU0VNRU5UU19NVVNUX0hBVkVfQUxMT0NBVElPTlMpCiAgICBkaWcgNQogICAgYm56IGZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMwogICAgYnl0ZWMgMTcgLy8gIkVSUjpEQk1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTUEKCmZpbmFsaXplRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzQ2CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmZpbmFsaXplZCA9IHRydWUKICAgIGR1cG4gMgogICAgcHVzaGludCAzMgogICAgaW50Y18xIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDEKICAgIHNldGJpdAogICAgcHVzaGludCAzMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBmaW5hbGl6ZURpc2J1cnNlbWVudChpZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpmaW5hbGl6ZURpc2J1cnNlbWVudF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9tZXJnZUAxNwoKZmluYWxpemVEaXNidXJzZW1lbnRfYm9vbF9mYWxzZUAxMDoKICAgIGludGNfMCAvLyAwCiAgICBiIGZpbmFsaXplRGlzYnVyc2VtZW50X2Jvb2xfbWVyZ2VAMTEKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDktMzU0CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5uZXdEaXNidXJzZW1lbnRJRCgpCiAgICBjYWxsc3ViIG5ld0Rpc2J1cnNlbWVudElECiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gY29uc3QgYWxsb2NhdGlvbnNNYnI6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgICoKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIGFsbG9jYXRpb25zTWJyCiAgICBpbnRjIDUgLy8gNDE3MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBsZXQgc3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCgpjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgNgogICAgPAogICAgYnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2NAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIGFzc2V0OiAwLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzYyLTM2NgogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IDAsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzY4CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2OAogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzY5CiAgICAvLyBzdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgMwogICAgKwogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfd2hpbGVfdG9wQDIKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MzcyCiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgOQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDYKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUluc3RhbnREaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM3MwogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQuYW1vdW50ID09PSBtYnJBbW91bnQgKyBzdW0sIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgOQogICAgZ3R4bnMgQW1vdW50CiAgICBkaWcgMwogICAgZGlnIDMKICAgICsKICAgID09CiAgICBibnogY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAOAogICAgYnl0ZWNfMSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKY3JlYXRlSW5zdGFudERpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mzc2CiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNzUtMzg3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IHRydWUsCiAgICAvLyAgIHRpdGxlOiAnJywKICAgIC8vICAgYW1vdW50OiBzdW0sCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IGFsbG9jYXRpb25zLmxlbmd0aCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IDAsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiBhbGxvY2F0aW9uc01iciwKICAgIC8vICAgbm90ZTogJycsCiAgICAvLyB9CiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgYnl0ZWMgMTggLy8gMHg4MDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMTkgLy8gMHgwMDVmMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6Mzc1LTM4NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiB0cnVlLAogICAgLy8gICB0aXRsZTogJycsCiAgICAvLyAgIGFtb3VudDogc3VtLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiBhbGxvY2F0aW9ucy5sZW5ndGgsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiAwLAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogYWxsb2NhdGlvbnNNYnIsCiAgICAvLyAgIG5vdGU6ICcnLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozNDktMzU0CiAgICAvLyBjcmVhdGVJbnN0YW50RGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgYnl0ZWMgNiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjM5Mi0zOTgKICAgIC8vIGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnQoCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgYXNzZXRYZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sCiAgICAvLyAgIHRpbWVUb1VubG9jazogdWludDY0LAogICAgLy8gICBleHBpcmF0aW9uOiB1aW50NjQsCiAgICAvLyAgIGFsbG9jYXRpb25zOiBVc2VyQWxsb2NhdGlvbltdCiAgICAvLyApOiB1aW50NjQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgcHVzaGludCA0MAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OlVzZXJBbGxvY2F0aW9uPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGNvbnN0IGlkID0gdGhpcy5uZXdEaXNidXJzZW1lbnRJRCgpCiAgICBjYWxsc3ViIG5ld0Rpc2J1cnNlbWVudElECiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwMQogICAgLy8gY29uc3QgYWxsb2NhdGlvbnNNYnI6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbnMubGVuZ3RoCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgICoKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIGNvbnN0IG1ickFtb3VudDogdWludDY0ID0gTWluRGlzYnVyc2VtZW50c01CUiArIGFsbG9jYXRpb25zTWJyCiAgICBpbnRjIDUgLy8gNDE3MDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyBsZXQgc3VtOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhbGxvY2F0aW9ucy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgNgogICAgPAogICAgYnogY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudF9hZnRlcl93aGlsZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwOAogICAgLy8gYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGFzc2V0OiBhc3NldFhmZXIueGZlckFzc2V0LmlkLAogICAgZGlnIDEyCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQxMAogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogYWxsb2NhdGlvbnNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IGFzc2V0WGZlci54ZmVyQXNzZXQuaWQsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDEyCiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlID0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBzd2FwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gdXNlckFsbG9jYXRpb25zID0gQm94TWFwPFVzZXJBbGxvY2F0aW9uc0tleSwgdWludDY0Pih7IGtleVByZWZpeDogUmV3YXJkc0JveFByZWZpeFVzZXJBbGxvY2F0aW9ucyB9KQogICAgYnl0ZWMgNSAvLyAidSIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZSA9IGFsbG9jYXRpb25zW2ldLmFtb3VudAogICAgZGlnIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDEzCiAgICAvLyBzdW0gKz0gYWxsb2NhdGlvbnNbaV0uYW1vdW50CiAgICBkaWcgMwogICAgKwogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQwNQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGFsbG9jYXRpb25zLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfd2hpbGVfdG9wQDIKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDE2CiAgICAvLyBsb2dnZWRBc3NlcnQobWJyUGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMTAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA2CiAgICBieXRlY18xIC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gbWJyQW1vdW50LCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBBbW91bnQKICAgIGRpZyAzCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDgKICAgIGJ5dGVjXzEgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gbG9nZ2VkQXNzZXJ0KGFzc2V0WGZlci5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgOQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogY3JlYXRlSW5zdGFudEFzYURpc2J1cnNlbWVudF9hZnRlcl9hc3NlcnRAMTAKICAgIGJ5dGVjIDcgLy8gIkVSUjpJWEZSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklYRlIKCmNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjAKICAgIC8vIGxvZ2dlZEFzc2VydChhc3NldFhmZXIuYXNzZXRBbW91bnQgPT09IHN1bSwgRVJSX0lOVkFMSURfVFJBTlNGRVIpCiAgICBkaWcgOQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGRpZyAyCiAgICA9PQogICAgYm56IGNyZWF0ZUluc3RhbnRBc2FEaXNidXJzZW1lbnRfYWZ0ZXJfYXNzZXJ0QDEyCiAgICBieXRlYyA3IC8vICJFUlI6SVhGUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJWEZSCgpjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50X2FmdGVyX2Fzc2VydEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjItNDM0CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlID0gewogICAgLy8gICBjcmVhdG9yOiBUeG4uc2VuZGVyLAogICAgLy8gICBmaW5hbGl6ZWQ6IHRydWUsCiAgICAvLyAgIHRpdGxlOiAnJywKICAgIC8vICAgYW1vdW50OiBzdW0sCiAgICAvLyAgIHRpbWVUb1VubG9jaywKICAgIC8vICAgZXhwaXJhdGlvbiwKICAgIC8vICAgYWxsb2NhdGlvbnM6IGFsbG9jYXRpb25zLmxlbmd0aCwKICAgIC8vICAgZGlzdHJpYnV0ZWQ6IDAsCiAgICAvLyAgIG1ickNyZWRpdHM6IDAsCiAgICAvLyAgIHVzZWRNYnJDcmVkaXRzOiBhbGxvY2F0aW9uc01iciwKICAgIC8vICAgbm90ZTogJycsCiAgICAvLyB9CiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgc3dhcAogICAgYnl0ZWMgMTggLy8gMHg4MDAwNWQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMTkgLy8gMHgwMDVmMDAwMDAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUgPSB7CiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDIyLTQzNAogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgY3JlYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgZmluYWxpemVkOiB0cnVlLAogICAgLy8gICB0aXRsZTogJycsCiAgICAvLyAgIGFtb3VudDogc3VtLAogICAgLy8gICB0aW1lVG9VbmxvY2ssCiAgICAvLyAgIGV4cGlyYXRpb24sCiAgICAvLyAgIGFsbG9jYXRpb25zOiBhbGxvY2F0aW9ucy5sZW5ndGgsCiAgICAvLyAgIGRpc3RyaWJ1dGVkOiAwLAogICAgLy8gICBtYnJDcmVkaXRzOiAwLAogICAgLy8gICB1c2VkTWJyQ3JlZGl0czogYWxsb2NhdGlvbnNNYnIsCiAgICAvLyAgIG5vdGU6ICcnLAogICAgLy8gfQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czozOTItMzk4CiAgICAvLyBjcmVhdGVJbnN0YW50QXNhRGlzYnVyc2VtZW50KAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGFzc2V0WGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLAogICAgLy8gICB0aW1lVG9VbmxvY2s6IHVpbnQ2NCwKICAgIC8vICAgZXhwaXJhdGlvbjogdWludDY0LAogICAgLy8gICBhbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25bXQogICAgLy8gKTogdWludDY0IHsKICAgIGJ5dGVjIDYgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmNsYWltUmV3YXJkc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltUmV3YXJkczoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzIgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGNsYWltUmV3YXJkcyhyZXdhcmRzOiBDbGFpbURldGFpbHNbXSk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL3Jld2FyZHMvdHlwZXMudHM6OkNsYWltRGV0YWlscz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmV3YXJkcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKCmNsYWltUmV3YXJkc193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmV3YXJkcy5sZW5ndGg7IGkgKz0gMSkgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogY2xhaW1SZXdhcmRzX2FmdGVyX3doaWxlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0MQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhyZXdhcmRzW2ldLmlkKS5leGlzdHMsIEVSUl9ESVNCVVJTRU1FTlRfRE9FU19OT1RfRVhJU1QpCiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDE2CiAgICAqCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSAxNAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBkaXNidXJzZW1lbnRzID0gQm94TWFwPHVpbnQ2NCwgRGlzYnVyc2VtZW50RGV0YWlscz4oeyBrZXlQcmVmaXg6IFJld2FyZHNCb3hQcmVmaXhEaXNidXJzZW1lbnRzIH0pCiAgICBieXRlY18wIC8vICJkIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDQxCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKHJld2FyZHNbaV0uaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRANQogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGNvbnN0IHsgdGltZVRvVW5sb2NrLCBleHBpcmF0aW9uLCBhbW91bnQsIGRpc3RyaWJ1dGVkLCBub3RlIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMocmV3YXJkc1tpXS5pZCkudmFsdWUKICAgIGRpZyAxMAogICAgZHVwCiAgICBwdXNoaW50IDQzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDUxCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ1cnkgOAogICAgZGlnIDEKICAgIHB1c2hpbnQgMzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSAxMAogICAgZGlnIDEKICAgIHB1c2hpbnQgNjcKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnVyeSA5CiAgICBkaWcgMQogICAgcHVzaGludCA5MQogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRpbWVUb1VubG9jayA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCBFUlJfRElTQlVSU0VNRU5UX0xPQ0tFRCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyAyMCAvLyAiRVJSOkRCTEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJMSwoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDUKICAgIC8vIGxvZ2dlZEFzc2VydChleHBpcmF0aW9uID49IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9ESVNCVVJTRU1FTlRfTE9DS0VEKQogICAgZGlnIDUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID49CiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA5CiAgICBieXRlYyAyMCAvLyAiRVJSOkRCTEsiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJMSwoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGxvZ2dlZEFzc2VydChhbW91bnQgPiBkaXN0cmlidXRlZCwgRVJSX0RJU0JVUlNFTUVOVF9GVUxMWV9ESVNUUklCVVRFRCkKICAgIGRpZyA3CiAgICBkaWcgNwogICAgPgogICAgYm56IGNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOkRCRkQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJGRAoKY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDUwCiAgICAvLyBhZGRyZXNzOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NTEKICAgIC8vIGFzc2V0OiByZXdhcmRzW2ldLmFzc2V0LAogICAgZGlnIDEzCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0OC00NTIKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uc0tleTogVXNlckFsbG9jYXRpb25zS2V5ID0gewogICAgLy8gICBkaXNidXJzZW1lbnRJRDogcmV3YXJkc1tpXS5pZCwKICAgIC8vICAgYWRkcmVzczogVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXQ6IHJld2FyZHNbaV0uYXNzZXQsCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS5leGlzdHMsIEVSUl9BTExPQ0FUSU9OX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAxMwogICAgYnl0ZWMgMjEgLy8gIkVSUjpBTE5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkFMTkUKCmNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ1NAogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb24gPSB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLnZhbHVlCiAgICBkaWcgOQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKHJld2FyZHNbaV0uaWQpLnZhbHVlLmFsbG9jYXRpb25zIC09IDEKICAgIGRpZyAxMwogICAgZHVwCiAgICBwdXNoaW50IDU5CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBkaWcgMQogICAgcHVzaGludCA1OQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZSAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhyZXdhcmRzW2ldLmlkKS52YWx1ZS5kaXN0cmlidXRlZCArPSB1c2VyQWxsb2NhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDY3CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgKwogICAgaXRvYgogICAgcHVzaGludCA2NwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyB0aGlzLnJlZnVuZEFsbG9jYXRpb25NYnIocmV3YXJkc1tpXS5pZCkKICAgIGRpZyA0CiAgICBjYWxsc3ViIHJlZnVuZEFsbG9jYXRpb25NYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBpZiAoIWlzQWxnbykgewogICAgZGlnIDUKICAgIGJ6IGNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIGFzc2V0WGZlci5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGRpZyA2CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ2NC00NjkKICAgIC8vIGNvbnN0IGFzc2V0WGZlciA9IGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgeGZlckFzc2V0OiByZXdhcmRzW2ldLmFzc2V0LAogICAgLy8gICBub3RlLAogICAgLy8gfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3MQogICAgLy8gYXNzZXRYZmVyLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ0MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHJld2FyZHMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBjbGFpbVJld2FyZHNfd2hpbGVfdG9wQDIKCmNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3NAogICAgLy8gcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3OQogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3My00NzcKICAgIC8vIGNvbnN0IHBheW1lbnQgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgbm90ZSwKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ3OQogICAgLy8gcGF5bWVudC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGIgY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMTgKCmNsYWltUmV3YXJkc19hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDM5CiAgICAvLyBjbGFpbVJld2FyZHMocmV3YXJkczogQ2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLnJlY2xhaW1SZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVjbGFpbVJld2FyZHM6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyByZWNsYWltUmV3YXJkcyhpZDogdWludDY0LCByZWNsYWltczogQWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHB1c2hpbnQgNDAKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvcmV3YXJkcy90eXBlcy50czo6QWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzPgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLmV4aXN0cywgRVJSX0RJU0JVUlNFTUVOVF9ET0VTX05PVF9FWElTVCkKICAgIGl0b2IKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpEQk5FIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCTkUKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODYKICAgIC8vIGNvbnN0IHsgY3JlYXRvciwgZmluYWxpemVkLCBleHBpcmF0aW9uIH0gPSB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBwdXNoaW50IDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDEzCiAgICBkdXAKICAgIHB1c2hpbnQgMzIKICAgIGludGNfMSAvLyAxCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnVyeSAxMAogICAgcHVzaGludCA1MQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjQ4OAogICAgLy8gbG9nZ2VkQXNzZXJ0KGNyZWF0b3IgPT09IFR4bi5zZW5kZXIsIEVSUl9ZT1VfQVJFX05PVF9USEVfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDQgLy8gIkVSUjpZTkNSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOllOQ1IKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGxvZ2dlZEFzc2VydChmaW5hbGl6ZWQsIEVSUl9ESVNCVVJTRU1FTlRfQUxSRUFEWV9GSU5BTCkKICAgIGRpZyA3CiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDggLy8gIkVSUjpEQkFGIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkRCQUYKCnJlY2xhaW1SZXdhcmRzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGxvZ2dlZEFzc2VydChleHBpcmF0aW9uIDw9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsIEVSUl9ESVNCVVJTRU1FTlRfTk9UX0VYUElSRUQpCiAgICBkaWcgOAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgPD0KICAgIGJueiByZWNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAOQogICAgcHVzaGJ5dGVzICJFUlI6REJOWCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpEQk5YCgpyZWNsYWltUmV3YXJkc19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKCnJlY2xhaW1SZXdhcmRzX3doaWxlX3RvcEAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA2CiAgICBkaWcgMwogICAgPAogICAgYnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfd2hpbGVAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk1CiAgICAvLyBhZGRyZXNzOiByZWNsYWltc1tpXS5hZGRyZXNzLAogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgNwogICAgcHVzaGludCA0MAogICAgKgogICAgcHVzaGludCA0MAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo0OTYKICAgIC8vIGFzc2V0OiByZWNsYWltc1tpXS5hc3NldCwKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk1LTQ5NgogICAgLy8gYWRkcmVzczogcmVjbGFpbXNbaV0uYWRkcmVzcywKICAgIC8vIGFzc2V0OiByZWNsYWltc1tpXS5hc3NldCwKICAgIHB1c2hpbnQgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBhc3NldDogcmVjbGFpbXNbaV0uYXNzZXQsCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkzLTQ5NwogICAgLy8gY29uc3QgdXNlckFsbG9jYXRpb25zS2V5OiBVc2VyQWxsb2NhdGlvbnNLZXkgPSB7CiAgICAvLyAgIGRpc2J1cnNlbWVudElEOiBpZCwKICAgIC8vICAgYWRkcmVzczogcmVjbGFpbXNbaV0uYWRkcmVzcywKICAgIC8vICAgYXNzZXQ6IHJlY2xhaW1zW2ldLmFzc2V0LAogICAgLy8gfQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyB1c2VyQWxsb2NhdGlvbnMgPSBCb3hNYXA8VXNlckFsbG9jYXRpb25zS2V5LCB1aW50NjQ+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4VXNlckFsbG9jYXRpb25zIH0pCiAgICBieXRlYyA1IC8vICJ1IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDk4CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS5leGlzdHMsIEVSUl9BTExPQ0FUSU9OX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBieXRlYyAyMSAvLyAiRVJSOkFMTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6QUxORQoKcmVjbGFpbVJld2FyZHNfYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIGNvbnN0IHVzZXJBbGxvY2F0aW9uID0gdGhpcy51c2VyQWxsb2NhdGlvbnModXNlckFsbG9jYXRpb25zS2V5KS52YWx1ZQogICAgZGlnIDkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MDIKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUuYWxsb2NhdGlvbnMgLT0gMQogICAgZGlnIDMKICAgIGR1cAogICAgcHVzaGludCA1OQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaXRvYgogICAgZGlnIDEKICAgIHB1c2hpbnQgNTkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLmFtb3VudCAtPSB1c2VyQWxsb2NhdGlvbgogICAgZHVwCiAgICBwdXNoaW50IDM1CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgLQogICAgaXRvYgogICAgcHVzaGludCAzNQogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTA0CiAgICAvLyB0aGlzLnVzZXJBbGxvY2F0aW9ucyh1c2VyQWxsb2NhdGlvbnNLZXkpLmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTA1CiAgICAvLyB0aGlzLnJlZnVuZEFsbG9jYXRpb25NYnIoaWQpCiAgICBkaWcgNQogICAgY2FsbHN1YiByZWZ1bmRBbGxvY2F0aW9uTWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gaWYgKCFpc0FsZ28pIHsKICAgIGRpZyA2CiAgICBieiByZWNsYWltUmV3YXJkc19lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE2CiAgICAvLyB4ZmVyLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyAxMAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUxMC01MTQKICAgIC8vIGNvbnN0IHhmZXIgPSBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICBhc3NldFJlY2VpdmVyOiBjcmVhdG9yLAogICAgLy8gICBhc3NldEFtb3VudDogdXNlckFsbG9jYXRpb24sCiAgICAvLyAgIHhmZXJBc3NldDogcmVjbGFpbXNbaV0uYXNzZXQsCiAgICAvLyB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE2CiAgICAvLyB4ZmVyLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcmVjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcmVjbGFpbXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyA2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA3CiAgICBiIHJlY2xhaW1SZXdhcmRzX3doaWxlX3RvcEAxMAoKcmVjbGFpbVJld2FyZHNfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MTgtNTIzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogY3JlYXRvciwKICAgIC8vICAgICBhbW91bnQ6IHVzZXJBbGxvY2F0aW9uLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTE4LTUyMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGNyZWF0b3IsCiAgICAvLyAgICAgYW1vdW50OiB1c2VyQWxsb2NhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiByZWNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE4CgpyZWNsYWltUmV3YXJkc19hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyByZWNsYWltUmV3YXJkcyhpZDogdWludDY0LCByZWNsYWltczogQWxsb2NhdGlvblJlY2xhaW1EZXRhaWxzW10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjpSZXdhcmRzLmFsbG9jYXRpb25NYnJDcmVkaXRTaG9ydGZhbGxbcm91dGluZ10oKSAtPiB2b2lkOgphbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsOgogICAgYnl0ZWNfMiAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuZGlzYnVyc2VtZW50cyhpZCkuZXhpc3RzLCBFUlJfRElTQlVSU0VNRU5UX0RPRVNfTk9UX0VYSVNUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWNfMyAvLyAiRVJSOkRCTkUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6REJORQoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IFVzZXJBbGxvY2F0aW9uTUJSICogYWxsb2NhdGlvbkNvdW50CiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIGRpZyAyCiAgICAqCiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzUKICAgIC8vIGNvbnN0IGNyZWRpdHM6IHVpbnQ2NCA9IHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUubWJyQ3JlZGl0cwogICAgZGlnIDEKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6NTM2CiAgICAvLyBpZiAoY3JlZGl0cyA+PSBtYnJBbW91bnQpIHsKICAgIDw9CiAgICBieiBhbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzcKICAgIC8vIHJldHVybiAwCiAgICBpbnRjXzAgLy8gMAoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMuYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYWxsb2NhdGlvbk1ickNyZWRpdFNob3J0ZmFsbF9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjU0MAogICAgLy8gcmV0dXJuIG1ickFtb3VudCAtIGNyZWRpdHMKICAgIGRpZyAyCiAgICBkaWcgNAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1MzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBhbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo6UmV3YXJkcy5hbGxvY2F0aW9uTWJyQ3JlZGl0U2hvcnRmYWxsQDYKCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFCYXNlQ29udHJhY3QudXBkYXRlQWtpdGFEQU9bcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBa2l0YURBTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM2CiAgICAvLyB1cGRhdGVBa2l0YURBTyhha2l0YURBTzogQXBwbGljYXRpb24pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMTEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgMTEgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM4CiAgICAvLyB0aGlzLmFraXRhREFPLnZhbHVlID0gYWtpdGFEQU8KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OkJhc2VSZXdhcmRzLm1icltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL3Jld2FyZHMvYmFzZS50czo6QmFzZVJld2FyZHMubWJyCiAgICBieXRlYyA2IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjpDb250cmFjdFdpdGhPcHRJbi5vcHRJbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm9wdEluOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjIzCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXBuIDIKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjUKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVF9SRUNFSVZFUikKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6SVBNUiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUE1SCgpvcHRJbl9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czoyNgogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UsIEVSUl9JTlZBTElEX1BBWU1FTlRfQU1PVU5UKQogICAgZGlnIDEKICAgIGd0eG5zIEFtb3VudAogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjI4LTM0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IGFzc2V0CiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjMwCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9vcHRpbi50czozMQogICAgLy8gYXNzZXRBbW91bnQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjgtMzMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvb3B0aW4udHM6MjgtMzQKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL29wdGluLnRzOjIzCiAgICAvLyBvcHRJbihwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIGFzc2V0OiBBc3NldCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMubmV3RGlzYnVyc2VtZW50SUQoKSAtPiB1aW50NjQ6Cm5ld0Rpc2J1cnNlbWVudElEOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgaWQgPSB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo1OQogICAgLy8gZGlzYnVyc2VtZW50SUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAxLCBrZXk6IFJld2FyZHNHbG9iYWxTdGF0ZUtleURpc2J1cnNlbWVudElEIH0pCiAgICBieXRlYyAxMCAvLyAiZGlzYnVyc2VtZW50X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MAogICAgLy8gY29uc3QgaWQgPSB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRJRC52YWx1ZSArPSAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyBkaXNidXJzZW1lbnRJRCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDEsIGtleTogUmV3YXJkc0dsb2JhbFN0YXRlS2V5RGlzYnVyc2VtZW50SUQgfSkKICAgIGJ5dGVjIDEwIC8vICJkaXNidXJzZW1lbnRfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudElELnZhbHVlICs9IDEKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyByZXR1cm4gaWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMudXNlTWJyQ3JlZGl0KGlkOiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgp1c2VNYnJDcmVkaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBwcml2YXRlIHVzZU1ickNyZWRpdChpZDogdWludDY0LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgYm56IHVzZU1ickNyZWRpdF9hZnRlcl9hc3NlcnRAMgogICAgYnl0ZWMgOSAvLyAiRVJSOklNQlIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SU1CUgoKdXNlTWJyQ3JlZGl0X2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS5tYnJDcmVkaXRzIC09IGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NQogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDc1CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjkyCiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzICs9IGFtb3VudAogICAgZHVwCiAgICBwdXNoaW50IDgzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaXRvYgogICAgcHVzaGludCA4MwogICAgc3dhcAogICAgYm94X3JlcGxhY2UgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OlJld2FyZHMucmVmdW5kQWxsb2NhdGlvbk1icihpZDogdWludDY0KSAtPiB2b2lkOgpyZWZ1bmRBbGxvY2F0aW9uTWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIHByaXZhdGUgcmVmdW5kQWxsb2NhdGlvbk1icihpZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OTYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzID49IGFtb3VudCwgRVJSX0lOVkFMSURfTUJSX0FNT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZGlzYnVyc2VtZW50cyA9IEJveE1hcDx1aW50NjQsIERpc2J1cnNlbWVudERldGFpbHM+KHsga2V5UHJlZml4OiBSZXdhcmRzQm94UHJlZml4RGlzYnVyc2VtZW50cyB9KQogICAgYnl0ZWNfMCAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyA+PSBhbW91bnQsIEVSUl9JTlZBTElEX01CUl9BTU9VTlQpCiAgICBwdXNoaW50IDgzCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLnJlbGVhc2VNYnJDcmVkaXQoaWQsIFVzZXJBbGxvY2F0aW9uTUJSKQogICAgaW50YyA0IC8vIDI1MzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyA+PSBhbW91bnQsIEVSUl9JTlZBTElEX01CUl9BTU9VTlQpCiAgICA+PQogICAgYm56IHJlZnVuZEFsbG9jYXRpb25NYnJfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDkgLy8gIkVSUjpJTUJSIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNQlIKCnJlZnVuZEFsbG9jYXRpb25NYnJfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk3CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLnVzZWRNYnJDcmVkaXRzIC09IGFtb3VudAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA4MwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5yZWxlYXNlTWJyQ3JlZGl0KGlkLCBVc2VyQWxsb2NhdGlvbk1CUikKICAgIGludGMgNCAvLyAyNTMwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czo5NwogICAgLy8gdGhpcy5kaXNidXJzZW1lbnRzKGlkKS52YWx1ZS51c2VkTWJyQ3JlZGl0cyAtPSBhbW91bnQKICAgIC0KICAgIGl0b2IKICAgIGRpZyAxCiAgICBwdXNoaW50IDgzCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9jb250cmFjdC5hbGdvLnRzOjk4CiAgICAvLyB0aGlzLmRpc2J1cnNlbWVudHMoaWQpLnZhbHVlLm1ickNyZWRpdHMgKz0gYW1vdW50CiAgICBkdXAKICAgIHB1c2hpbnQgNzUKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3Jld2FyZHMvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIHRoaXMucmVsZWFzZU1ickNyZWRpdChpZCwgVXNlckFsbG9jYXRpb25NQlIpCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIHRoaXMuZGlzYnVyc2VtZW50cyhpZCkudmFsdWUubWJyQ3JlZGl0cyArPSBhbW91bnQKICAgICsKICAgIGl0b2IKICAgIHB1c2hpbnQgNzUKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlIC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjpCYXNlUmV3YXJkcy5tYnIodGl0bGU6IGJ5dGVzLCBub3RlOiBieXRlcykgLT4gYnl0ZXM6CnNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OkJhc2VSZXdhcmRzLm1icjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6Ny04CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIG1icih0aXRsZTogc3RyaW5nLCBub3RlOiBzdHJpbmcpOiBSZXdhcmRzTUJSRGF0YSB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6MTAKICAgIC8vIGRpc2J1cnNlbWVudHM6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXModGl0bGUpLmxlbmd0aCArIEJ5dGVzKG5vdGUpLmxlbmd0aCkpLAogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDQwMAogICAgKgogICAgaW50YyA1IC8vIDQxNzAwCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjktMTIKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGRpc2J1cnNlbWVudHM6IE1pbkRpc2J1cnNlbWVudHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXModGl0bGUpLmxlbmd0aCArIEJ5dGVzKG5vdGUpLmxlbmd0aCkpLAogICAgLy8gICB1c2VyQWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uTUJSCiAgICAvLyB9CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcmV3YXJkcy9iYXNlLnRzOjExCiAgICAvLyB1c2VyQWxsb2NhdGlvbnM6IFVzZXJBbGxvY2F0aW9uTUJSCiAgICBpbnRjIDQgLy8gMjUzMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9yZXdhcmRzL2Jhc2UudHM6OS0xMgogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgZGlzYnVyc2VtZW50czogTWluRGlzYnVyc2VtZW50c01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIChCeXRlcyh0aXRsZSkubGVuZ3RoICsgQnl0ZXMobm90ZSkubGVuZ3RoKSksCiAgICAvLyAgIHVzZXJBbGxvY2F0aW9uczogVXNlckFsbG9jYXRpb25NQlIKICAgIC8vIH0KICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type DisbursementDetails = {\n creator: string,\n finalized: boolean,\n title: string,\n amount: bigint,\n timeToUnlock: bigint,\n expiration: bigint,\n allocations: bigint,\n distributed: bigint,\n mbrCredits: bigint,\n usedMbrCredits: bigint,\n note: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a DisbursementDetails to the struct representation\n */\nexport function DisbursementDetailsFromTuple(abiTuple: [string, boolean, string, bigint, bigint, bigint, bigint, bigint, bigint, bigint, string]) {\n const abiStructType = ABIStructType.fromStruct('DisbursementDetails', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as DisbursementDetails\n}\n\nexport type RewardsMbrData = {\n disbursements: bigint,\n userAllocations: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a RewardsMBRData to the struct representation\n */\nexport function RewardsMbrDataFromTuple(abiTuple: [bigint, bigint]) {\n const abiStructType = ABIStructType.fromStruct('RewardsMBRData', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as RewardsMbrData\n}\n\nexport type UserAllocationsKey = {\n address: string,\n asset: bigint,\n disbursementId: bigint\n}\n\n\n/**\n * Converts the ABI tuple representation of a UserAllocationsKey to the struct representation\n */\nexport function UserAllocationsKeyFromTuple(abiTuple: [string, bigint, bigint]) {\n const abiStructType = ABIStructType.fromStruct('UserAllocationsKey', APP_SPEC.structs)\n return getStructValueFromTupleValue(abiStructType, abiTuple) as UserAllocationsKey\n}\n\n/**\n * The argument types for the Rewards contract\n */\nexport type RewardsArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create(string,uint64)void': {\n version: string\n akitaDao: bigint | number\n }\n 'fundMbrCredits(uint64,pay)void': {\n id: bigint | number\n payment: AppMethodCallTransactionArgument\n }\n 'withdrawMbrCredits(uint64,uint64)void': {\n id: bigint | number\n amount: bigint | number\n }\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n }\n 'editDisbursement(uint64,string,uint64,uint64,string)void': {\n id: bigint | number\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n }\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': {\n payment: AppMethodCallTransactionArgument\n id: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': {\n assetXfer: AppMethodCallTransactionArgument\n id: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': {\n mbrPaymentIndex: bigint | number\n assetTransferStartIndex: bigint | number\n title: string\n timeToUnlock: bigint | number\n expiration: bigint | number\n note: string\n allocations: [string, bigint | number][]\n }\n 'finalizeDisbursement(uint64)void': {\n id: bigint | number\n }\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n timeToUnlock: bigint | number\n expiration: bigint | number\n allocations: [string, bigint | number][]\n }\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': {\n mbrPayment: AppMethodCallTransactionArgument\n assetXfer: AppMethodCallTransactionArgument\n timeToUnlock: bigint | number\n expiration: bigint | number\n allocations: [string, bigint | number][]\n }\n 'claimRewards((uint64,uint64)[])void': {\n rewards: [bigint | number, bigint | number][]\n }\n 'reclaimRewards(uint64,(address,uint64)[])void': {\n id: bigint | number\n reclaims: [string, bigint | number][]\n }\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': {\n id: bigint | number\n allocationCount: bigint | number\n }\n 'updateAkitaDAO(uint64)void': {\n akitaDao: bigint | number\n }\n 'opUp()void': Record<string, never>\n 'mbr(string,string)(uint64,uint64)': {\n title: string\n note: string\n }\n 'optIn(pay,uint64)void': {\n /**\n * The payment transaction\n */\n payment: AppMethodCallTransactionArgument\n /**\n * The asset to be opted into\n */\n asset: bigint | number\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create(string,uint64)void': [version: string, akitaDao: bigint | number]\n 'fundMbrCredits(uint64,pay)void': [id: bigint | number, payment: AppMethodCallTransactionArgument]\n 'withdrawMbrCredits(uint64,uint64)void': [id: bigint | number, amount: bigint | number]\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': [mbrPayment: AppMethodCallTransactionArgument, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string]\n 'editDisbursement(uint64,string,uint64,uint64,string)void': [id: bigint | number, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string]\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': [payment: AppMethodCallTransactionArgument, id: bigint | number, allocations: [string, bigint | number][]]\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': [assetXfer: AppMethodCallTransactionArgument, id: bigint | number, allocations: [string, bigint | number][]]\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': [mbrPaymentIndex: bigint | number, assetTransferStartIndex: bigint | number, title: string, timeToUnlock: bigint | number, expiration: bigint | number, note: string, allocations: [string, bigint | number][]]\n 'finalizeDisbursement(uint64)void': [id: bigint | number]\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': [mbrPayment: AppMethodCallTransactionArgument, timeToUnlock: bigint | number, expiration: bigint | number, allocations: [string, bigint | number][]]\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': [mbrPayment: AppMethodCallTransactionArgument, assetXfer: AppMethodCallTransactionArgument, timeToUnlock: bigint | number, expiration: bigint | number, allocations: [string, bigint | number][]]\n 'claimRewards((uint64,uint64)[])void': [rewards: [bigint | number, bigint | number][]]\n 'reclaimRewards(uint64,(address,uint64)[])void': [id: bigint | number, reclaims: [string, bigint | number][]]\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': [id: bigint | number, allocationCount: bigint | number]\n 'updateAkitaDAO(uint64)void': [akitaDao: bigint | number]\n 'opUp()void': []\n 'mbr(string,string)(uint64,uint64)': [title: string, note: string]\n 'optIn(pay,uint64)void': [payment: AppMethodCallTransactionArgument, asset: bigint | number]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type RewardsReturns = {\n 'create(string,uint64)void': void\n 'fundMbrCredits(uint64,pay)void': void\n 'withdrawMbrCredits(uint64,uint64)void': void\n 'createDisbursement(pay,string,uint64,uint64,string)uint64': bigint\n 'editDisbursement(uint64,string,uint64,uint64,string)void': void\n 'createUserAllocations(pay,uint64,(address,uint64)[])void': void\n 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void': void\n 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64': bigint\n 'finalizeDisbursement(uint64)void': void\n 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64': bigint\n 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64': bigint\n 'claimRewards((uint64,uint64)[])void': void\n 'reclaimRewards(uint64,(address,uint64)[])void': void\n 'allocationMbrCreditShortfall(uint64,uint64)uint64': bigint\n 'updateAkitaDAO(uint64)void': void\n 'opUp()void': void\n 'mbr(string,string)(uint64,uint64)': RewardsMbrData\n 'optIn(pay,uint64)void': void\n}\n\n/**\n * Defines the types of available calls and state of the Rewards smart contract.\n */\nexport type RewardsTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create(string,uint64)void' | 'create', {\n argsObj: RewardsArgs['obj']['create(string,uint64)void']\n argsTuple: RewardsArgs['tuple']['create(string,uint64)void']\n returns: RewardsReturns['create(string,uint64)void']\n }>\n & Record<'fundMbrCredits(uint64,pay)void' | 'fundMbrCredits', {\n argsObj: RewardsArgs['obj']['fundMbrCredits(uint64,pay)void']\n argsTuple: RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']\n returns: RewardsReturns['fundMbrCredits(uint64,pay)void']\n }>\n & Record<'withdrawMbrCredits(uint64,uint64)void' | 'withdrawMbrCredits', {\n argsObj: RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void']\n argsTuple: RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']\n returns: RewardsReturns['withdrawMbrCredits(uint64,uint64)void']\n }>\n & Record<'createDisbursement(pay,string,uint64,uint64,string)uint64' | 'createDisbursement', {\n argsObj: RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64']\n argsTuple: RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']\n returns: RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64']\n }>\n & Record<'editDisbursement(uint64,string,uint64,uint64,string)void' | 'editDisbursement', {\n argsObj: RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void']\n argsTuple: RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']\n returns: RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void']\n }>\n & Record<'createUserAllocations(pay,uint64,(address,uint64)[])void' | 'createUserAllocations', {\n argsObj: RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']\n returns: RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void']\n }>\n & Record<'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void' | 'createAsaUserAllocations', {\n argsObj: RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n returns: RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']\n }>\n & Record<'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64' | 'createAsaDisbursementFromGroup', {\n argsObj: RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n returns: RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']\n }>\n & Record<'finalizeDisbursement(uint64)void' | 'finalizeDisbursement', {\n argsObj: RewardsArgs['obj']['finalizeDisbursement(uint64)void']\n argsTuple: RewardsArgs['tuple']['finalizeDisbursement(uint64)void']\n returns: RewardsReturns['finalizeDisbursement(uint64)void']\n }>\n & Record<'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64' | 'createInstantDisbursement', {\n argsObj: RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n returns: RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']\n }>\n & Record<'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64' | 'createInstantAsaDisbursement', {\n argsObj: RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n argsTuple: RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n returns: RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']\n }>\n & Record<'claimRewards((uint64,uint64)[])void' | 'claimRewards', {\n argsObj: RewardsArgs['obj']['claimRewards((uint64,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']\n returns: RewardsReturns['claimRewards((uint64,uint64)[])void']\n }>\n & Record<'reclaimRewards(uint64,(address,uint64)[])void' | 'reclaimRewards', {\n argsObj: RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void']\n argsTuple: RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']\n returns: RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void']\n }>\n & Record<'allocationMbrCreditShortfall(uint64,uint64)uint64' | 'allocationMbrCreditShortfall', {\n argsObj: RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64']\n argsTuple: RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']\n returns: RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64']\n }>\n & Record<'updateAkitaDAO(uint64)void' | 'updateAkitaDAO', {\n argsObj: RewardsArgs['obj']['updateAkitaDAO(uint64)void']\n argsTuple: RewardsArgs['tuple']['updateAkitaDAO(uint64)void']\n returns: RewardsReturns['updateAkitaDAO(uint64)void']\n }>\n & Record<'opUp()void' | 'opUp', {\n argsObj: RewardsArgs['obj']['opUp()void']\n argsTuple: RewardsArgs['tuple']['opUp()void']\n returns: RewardsReturns['opUp()void']\n }>\n & Record<'mbr(string,string)(uint64,uint64)' | 'mbr', {\n argsObj: RewardsArgs['obj']['mbr(string,string)(uint64,uint64)']\n argsTuple: RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']\n returns: RewardsReturns['mbr(string,string)(uint64,uint64)']\n }>\n & Record<'optIn(pay,uint64)void' | 'optIn', {\n argsObj: RewardsArgs['obj']['optIn(pay,uint64)void']\n argsTuple: RewardsArgs['tuple']['optIn(pay,uint64)void']\n returns: RewardsReturns['optIn(pay,uint64)void']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n /**\n * the disbursement id cursor\n */\n disbursementId: bigint\n /**\n * the current version of the contract\n */\n version: string\n /**\n * the app ID of the Akita DAO\n */\n akitaDao: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * the disbursement map of tokens\n \n the key is the uint64 id of the disbursement\n the value is the details of the disbursement\n\n */\n disbursements: Map<bigint | number, DisbursementDetails>\n /**\n * the user allocations of disbursements\n \n the key is the address of the qualified account with the uint64 id of the disbursement\n the value is the amount they are owed\n\n */\n userAllocations: Map<UserAllocationsKey, bigint>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type RewardsSignatures = keyof RewardsTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type RewardsNonVoidMethodSignatures = keyof RewardsTypes['methods'] extends infer T ? T extends keyof RewardsTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the Rewards smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends RewardsSignatures> = RewardsTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the Rewards smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends RewardsSignatures> = RewardsTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = RewardsTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = RewardsTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type RewardsCreateCallParams =\n | Expand<CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & {method: 'create'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n | Expand<CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & {method: 'create(string,uint64)void'} & { onComplete?: OnApplicationComplete.NoOp } & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type RewardsDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: RewardsCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the Rewards smart contract\n */\nexport abstract class RewardsParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends RewardsCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create(string,uint64)void':\n return RewardsParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the Rewards smart contract using the create(string,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp }): AppClientMethodCallParams & AppClientCompilationParams & { onComplete?: OnApplicationComplete.NoOp } {\n return {\n ...params,\n method: 'create(string,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.akitaDao],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the fundMbrCredits(uint64,pay)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static fundMbrCredits(params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'fundMbrCredits(uint64,pay)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.payment],\n }\n }\n /**\n * Constructs a no op call for the withdrawMbrCredits(uint64,uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static withdrawMbrCredits(params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'withdrawMbrCredits(uint64,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.amount],\n }\n }\n /**\n * Constructs a no op call for the createDisbursement(pay,string,uint64,uint64,string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createDisbursement(params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createDisbursement(pay,string,uint64,uint64,string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the editDisbursement(uint64,string,uint64,uint64,string)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static editDisbursement(params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'editDisbursement(uint64,string,uint64,uint64,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the createUserAllocations(pay,uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createUserAllocations(params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createUserAllocations(pay,uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.id, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createAsaUserAllocations(axfer,uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createAsaUserAllocations(params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createAsaUserAllocations(axfer,uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.assetXfer, params.args.id, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createAsaDisbursementFromGroup(params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPaymentIndex, params.args.assetTransferStartIndex, params.args.title, params.args.timeToUnlock, params.args.expiration, params.args.note, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the finalizeDisbursement(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static finalizeDisbursement(params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'finalizeDisbursement(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id],\n }\n }\n /**\n * Constructs a no op call for the createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createInstantDisbursement(params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.timeToUnlock, params.args.expiration, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static createInstantAsaDisbursement(params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.assetXfer, params.args.timeToUnlock, params.args.expiration, params.args.allocations],\n }\n }\n /**\n * Constructs a no op call for the claimRewards((uint64,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static claimRewards(params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'claimRewards((uint64,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.rewards],\n }\n }\n /**\n * Constructs a no op call for the reclaimRewards(uint64,(address,uint64)[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static reclaimRewards(params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'reclaimRewards(uint64,(address,uint64)[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.reclaims],\n }\n }\n /**\n * Constructs a no op call for the allocationMbrCreditShortfall(uint64,uint64)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'allocationMbrCreditShortfall(uint64,uint64)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.id, params.args.allocationCount],\n }\n }\n /**\n * Constructs a no op call for the updateAkitaDAO(uint64)void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateAkitaDao(params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateAkitaDAO(uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.akitaDao],\n }\n }\n /**\n * Constructs a no op call for the opUp()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static opUp(params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'opUp()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n }\n /**\n * Constructs a no op call for the mbr(string,string)(uint64,uint64) ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'mbr(string,string)(uint64,uint64)' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.title, params.args.note],\n }\n }\n /**\n * Constructs a no op call for the optIn(pay,uint64)void ABI method\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static optIn(params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'optIn(pay,uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the Rewards smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class RewardsFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `RewardsFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new RewardsClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new RewardsClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the Rewards smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: RewardsDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? RewardsParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (RewardsCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new RewardsClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.params.create(RewardsParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appFactory.createTransaction.create(RewardsParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the Rewards smart contract using an ABI method call using the create(string,uint64)void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<RewardsArgs['obj']['create(string,uint64)void'] | RewardsArgs['tuple']['create(string,uint64)void']> & AppClientCompilationParams & CreateSchema & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appFactory.send.create(RewardsParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | RewardsReturns['create(string,uint64)void']) }, appClient: new RewardsClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the Rewards smart contract\n */\nexport class RewardsClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `RewardsClient`\n *\n * @param appClient An `AppClient` instance which has been created with the Rewards app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `RewardsClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Returns a new `RewardsClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<RewardsClient> {\n return new RewardsClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `RewardsClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<RewardsClient> {\n return new RewardsClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n fundMbrCredits: (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.fundMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n withdrawMbrCredits: (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.withdrawMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createDisbursement: (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n editDisbursement: (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.editDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createUserAllocations: (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createAsaUserAllocations: (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createAsaUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createAsaDisbursementFromGroup: (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n finalizeDisbursement: (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.finalizeDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createInstantDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createInstantDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n createInstantAsaDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n claimRewards: (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.claimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n reclaimRewards: (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.reclaimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n allocationMbrCreditShortfall: (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateAkitaDao: (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n opUp: (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.params.call(RewardsParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n mbr: (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n optIn: (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.params.call(RewardsParamsFactory.optIn(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n fundMbrCredits: (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.fundMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n withdrawMbrCredits: (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.withdrawMbrCredits(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createDisbursement: (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n editDisbursement: (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.editDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createUserAllocations: (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createAsaUserAllocations: (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createAsaUserAllocations(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createAsaDisbursementFromGroup: (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n finalizeDisbursement: (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.finalizeDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createInstantDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createInstantDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n createInstantAsaDisbursement: (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n claimRewards: (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.claimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n reclaimRewards: (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.reclaimRewards(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n allocationMbrCreditShortfall: (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateAkitaDao: (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.updateAkitaDao(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n opUp: (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.opUp(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n mbr: (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.mbr(params))\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n optIn: (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) => {\n return this.appClient.createTransaction.call(RewardsParamsFactory.optIn(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `fundMbrCredits(uint64,pay)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n fundMbrCredits: async (params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.fundMbrCredits(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['fundMbrCredits(uint64,pay)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `withdrawMbrCredits(uint64,uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n withdrawMbrCredits: async (params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.withdrawMbrCredits(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['withdrawMbrCredits(uint64,uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createDisbursement(pay,string,uint64,uint64,string)uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createDisbursement: async (params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `editDisbursement(uint64,string,uint64,uint64,string)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n editDisbursement: async (params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.editDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createUserAllocations(pay,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createUserAllocations: async (params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createUserAllocations(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaUserAllocations(axfer,uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createAsaUserAllocations: async (params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createAsaUserAllocations(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createAsaDisbursementFromGroup: async (params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createAsaDisbursementFromGroup(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `finalizeDisbursement(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n finalizeDisbursement: async (params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.finalizeDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['finalizeDisbursement(uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createInstantDisbursement: async (params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createInstantDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n createInstantAsaDisbursement: async (params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.createInstantAsaDisbursement(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `claimRewards((uint64,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n claimRewards: async (params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.claimRewards(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['claimRewards((uint64,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `reclaimRewards(uint64,(address,uint64)[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n reclaimRewards: async (params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.reclaimRewards(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n allocationMbrCreditShortfall: async (params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `updateAkitaDAO(uint64)void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateAkitaDao: async (params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.updateAkitaDao(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['updateAkitaDAO(uint64)void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `opUp()void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n opUp: async (params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp } = {args: []}) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.opUp(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['opUp()void'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n mbr: async (params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.mbr(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['mbr(string,string)(uint64,uint64)'])}\n },\n\n /**\n * Makes a call to the Rewards smart contract using the `optIn(pay,uint64)void` ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n optIn: async (params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & SendParams & { onComplete?: OnApplicationComplete.NoOp }) => {\n const result = await this.appClient.send.call(RewardsParamsFactory.optIn(params))\n return {...result, return: result.return as unknown as (undefined | RewardsReturns['optIn(pay,uint64)void'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new RewardsClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the Rewards smart contract using the `allocationMbrCreditShortfall(uint64,uint64)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']>) {\n const result = await this.appClient.send.call(RewardsParamsFactory.allocationMbrCreditShortfall(params))\n return result.return as unknown as RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the Rewards smart contract using the `mbr(string,string)(uint64,uint64)` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']>) {\n const result = await this.appClient.send.call(RewardsParamsFactory.mbr(params))\n return result.return as unknown as RewardsReturns['mbr(string,string)(uint64,uint64)']\n }\n\n /**\n * Methods to access state for the current Rewards app\n */\n state = {\n /**\n * Methods to access global state for the current Rewards app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n disbursementId: result.disbursementID,\n version: result.version,\n akitaDao: result.akitaDAO,\n }\n },\n /**\n * Get the current value of the disbursementID key in global state\n */\n disbursementId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"disbursementID\")) as bigint | undefined },\n /**\n * Get the current value of the version key in global state\n */\n version: async (): Promise<string | undefined> => { return (await this.appClient.state.global.getValue(\"version\")) as string | undefined },\n /**\n * Get the current value of the akitaDAO key in global state\n */\n akitaDao: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"akitaDAO\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current Rewards app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the disbursements map in box state\n */\n disbursements: {\n /**\n * Get all current values of the disbursements map in box state\n */\n getMap: async (): Promise<Map<bigint, DisbursementDetails>> => { return (await this.appClient.state.box.getMap(\"disbursements\")) as Map<bigint, DisbursementDetails> },\n /**\n * Get a current value of the disbursements map by key from box state\n */\n value: async (key: bigint | number): Promise<DisbursementDetails | undefined> => { return await this.appClient.state.box.getMapValue(\"disbursements\", key) as DisbursementDetails | undefined },\n },\n /**\n * Get values from the userAllocations map in box state\n */\n userAllocations: {\n /**\n * Get all current values of the userAllocations map in box state\n */\n getMap: async (): Promise<Map<UserAllocationsKey, bigint>> => { return (await this.appClient.state.box.getMap(\"userAllocations\")) as Map<UserAllocationsKey, bigint> },\n /**\n * Get a current value of the userAllocations map by key from box state\n */\n value: async (key: UserAllocationsKey): Promise<bigint | undefined> => { return await this.appClient.state.box.getMapValue(\"userAllocations\", key) as bigint | undefined },\n },\n },\n }\n\n public newGroup(composerConfig?: TransactionComposerConfig): RewardsComposer {\n const client = this\n const composer = this.algorand.newGroup(composerConfig)\n let promiseChain:Promise<unknown> = Promise.resolve()\n return {\n /**\n * Add a fundMbrCredits(uint64,pay)void method call against the Rewards contract\n */\n fundMbrCredits(params: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.fundMbrCredits(params)))\n return this\n },\n /**\n * Add a withdrawMbrCredits(uint64,uint64)void method call against the Rewards contract\n */\n withdrawMbrCredits(params: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdrawMbrCredits(params)))\n return this\n },\n /**\n * Add a createDisbursement(pay,string,uint64,uint64,string)uint64 method call against the Rewards contract\n */\n createDisbursement(params: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createDisbursement(params)))\n return this\n },\n /**\n * Add a editDisbursement(uint64,string,uint64,uint64,string)void method call against the Rewards contract\n */\n editDisbursement(params: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.editDisbursement(params)))\n return this\n },\n /**\n * Add a createUserAllocations(pay,uint64,(address,uint64)[])void method call against the Rewards contract\n */\n createUserAllocations(params: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createUserAllocations(params)))\n return this\n },\n /**\n * Add a createAsaUserAllocations(axfer,uint64,(address,uint64)[])void method call against the Rewards contract\n */\n createAsaUserAllocations(params: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createAsaUserAllocations(params)))\n return this\n },\n /**\n * Add a createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createAsaDisbursementFromGroup(params: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createAsaDisbursementFromGroup(params)))\n return this\n },\n /**\n * Add a finalizeDisbursement(uint64)void method call against the Rewards contract\n */\n finalizeDisbursement(params: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.finalizeDisbursement(params)))\n return this\n },\n /**\n * Add a createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createInstantDisbursement(params: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createInstantDisbursement(params)))\n return this\n },\n /**\n * Add a createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 method call against the Rewards contract\n */\n createInstantAsaDisbursement(params: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.createInstantAsaDisbursement(params)))\n return this\n },\n /**\n * Add a claimRewards((uint64,uint64)[])void method call against the Rewards contract\n */\n claimRewards(params: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.claimRewards(params)))\n return this\n },\n /**\n * Add a reclaimRewards(uint64,(address,uint64)[])void method call against the Rewards contract\n */\n reclaimRewards(params: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.reclaimRewards(params)))\n return this\n },\n /**\n * Add a allocationMbrCreditShortfall(uint64,uint64)uint64 method call against the Rewards contract\n */\n allocationMbrCreditShortfall(params: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.allocationMbrCreditShortfall(params)))\n return this\n },\n /**\n * Add a updateAkitaDAO(uint64)void method call against the Rewards contract\n */\n updateAkitaDao(params: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)))\n return this\n },\n /**\n * Add a opUp()void method call against the Rewards contract\n */\n opUp(params: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)))\n return this\n },\n /**\n * Add a mbr(string,string)(uint64,uint64) method call against the Rewards contract\n */\n mbr(params: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.mbr(params)))\n return this\n },\n /**\n * Add a optIn(pay,uint64)void method call against the Rewards contract\n */\n optIn(params: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']> & { onComplete?: OnApplicationComplete.NoOp }) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)))\n return this\n },\n /**\n * Add a clear state call to the Rewards contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map(val => val.returnValue)\n }\n }\n } as unknown as RewardsComposer\n }\n}\nexport type RewardsComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the fundMbrCredits(uint64,pay)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n fundMbrCredits(params?: CallParams<RewardsArgs['obj']['fundMbrCredits(uint64,pay)void'] | RewardsArgs['tuple']['fundMbrCredits(uint64,pay)void']>): RewardsComposer<[...TReturns, RewardsReturns['fundMbrCredits(uint64,pay)void'] | undefined]>\n\n /**\n * Calls the withdrawMbrCredits(uint64,uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n withdrawMbrCredits(params?: CallParams<RewardsArgs['obj']['withdrawMbrCredits(uint64,uint64)void'] | RewardsArgs['tuple']['withdrawMbrCredits(uint64,uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['withdrawMbrCredits(uint64,uint64)void'] | undefined]>\n\n /**\n * Calls the createDisbursement(pay,string,uint64,uint64,string)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createDisbursement(params?: CallParams<RewardsArgs['obj']['createDisbursement(pay,string,uint64,uint64,string)uint64'] | RewardsArgs['tuple']['createDisbursement(pay,string,uint64,uint64,string)uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createDisbursement(pay,string,uint64,uint64,string)uint64'] | undefined]>\n\n /**\n * Calls the editDisbursement(uint64,string,uint64,uint64,string)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n editDisbursement(params?: CallParams<RewardsArgs['obj']['editDisbursement(uint64,string,uint64,uint64,string)void'] | RewardsArgs['tuple']['editDisbursement(uint64,string,uint64,uint64,string)void']>): RewardsComposer<[...TReturns, RewardsReturns['editDisbursement(uint64,string,uint64,uint64,string)void'] | undefined]>\n\n /**\n * Calls the createUserAllocations(pay,uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createUserAllocations(params?: CallParams<RewardsArgs['obj']['createUserAllocations(pay,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createUserAllocations(pay,uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['createUserAllocations(pay,uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the createAsaUserAllocations(axfer,uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createAsaUserAllocations(params?: CallParams<RewardsArgs['obj']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['createAsaUserAllocations(axfer,uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createAsaDisbursementFromGroup(params?: CallParams<RewardsArgs['obj']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createAsaDisbursementFromGroup(uint64,uint64,string,uint64,uint64,string,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the finalizeDisbursement(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n finalizeDisbursement(params?: CallParams<RewardsArgs['obj']['finalizeDisbursement(uint64)void'] | RewardsArgs['tuple']['finalizeDisbursement(uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['finalizeDisbursement(uint64)void'] | undefined]>\n\n /**\n * Calls the createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createInstantDisbursement(params?: CallParams<RewardsArgs['obj']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createInstantDisbursement(pay,uint64,uint64,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n createInstantAsaDisbursement(params?: CallParams<RewardsArgs['obj']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | RewardsArgs['tuple']['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64']>): RewardsComposer<[...TReturns, RewardsReturns['createInstantAsaDisbursement(pay,axfer,uint64,uint64,(address,uint64)[])uint64'] | undefined]>\n\n /**\n * Calls the claimRewards((uint64,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n claimRewards(params?: CallParams<RewardsArgs['obj']['claimRewards((uint64,uint64)[])void'] | RewardsArgs['tuple']['claimRewards((uint64,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['claimRewards((uint64,uint64)[])void'] | undefined]>\n\n /**\n * Calls the reclaimRewards(uint64,(address,uint64)[])void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n reclaimRewards(params?: CallParams<RewardsArgs['obj']['reclaimRewards(uint64,(address,uint64)[])void'] | RewardsArgs['tuple']['reclaimRewards(uint64,(address,uint64)[])void']>): RewardsComposer<[...TReturns, RewardsReturns['reclaimRewards(uint64,(address,uint64)[])void'] | undefined]>\n\n /**\n * Calls the allocationMbrCreditShortfall(uint64,uint64)uint64 ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n allocationMbrCreditShortfall(params?: CallParams<RewardsArgs['obj']['allocationMbrCreditShortfall(uint64,uint64)uint64'] | RewardsArgs['tuple']['allocationMbrCreditShortfall(uint64,uint64)uint64']>): RewardsComposer<[...TReturns, RewardsReturns['allocationMbrCreditShortfall(uint64,uint64)uint64'] | undefined]>\n\n /**\n * Calls the updateAkitaDAO(uint64)void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateAkitaDao(params?: CallParams<RewardsArgs['obj']['updateAkitaDAO(uint64)void'] | RewardsArgs['tuple']['updateAkitaDAO(uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['updateAkitaDAO(uint64)void'] | undefined]>\n\n /**\n * Calls the opUp()void ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n opUp(params?: CallParams<RewardsArgs['obj']['opUp()void'] | RewardsArgs['tuple']['opUp()void']>): RewardsComposer<[...TReturns, RewardsReturns['opUp()void'] | undefined]>\n\n /**\n * Calls the mbr(string,string)(uint64,uint64) ABI method.\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n mbr(params?: CallParams<RewardsArgs['obj']['mbr(string,string)(uint64,uint64)'] | RewardsArgs['tuple']['mbr(string,string)(uint64,uint64)']>): RewardsComposer<[...TReturns, RewardsReturns['mbr(string,string)(uint64,uint64)'] | undefined]>\n\n /**\n * Calls the optIn(pay,uint64)void ABI method.\n *\n * optin tells the contract to opt into an asa\n *\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n optIn(params?: CallParams<RewardsArgs['obj']['optIn(pay,uint64)void'] | RewardsArgs['tuple']['optIn(pay,uint64)void']>): RewardsComposer<[...TReturns, RewardsReturns['optIn(pay,uint64)void'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the Rewards smart contract.\n *\n * @param params Any additional parameters for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): RewardsComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): RewardsComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<RewardsComposerResults<TReturns> & { simulateResponse: SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<RewardsComposerResults<TReturns>>\n}\nexport type RewardsComposerResults<TReturns extends [...any[]]> = Expand<SendTransactionComposerResults & {\n returns: TReturns\n}>\n\n","/**\n * ARC-65 error codes emitted by the Rewards contract.\n *\n * The contract logs `ERR:{code}` via `loggedAssert` / `loggedErr` before\n * failing, where `code` is one of the short alphanumeric tags in this file.\n * Keep this in sync with `akita-sc/smart_contracts/rewards/errors.ts` —\n * the short codes are the shared wire format between contract and SDK.\n *\n * Use `translateRewardsError(code)` to turn a code back into a\n * human-readable message for display in a UI or log.\n */\n\nimport { makeErrorTranslator } from '../errors'\n\n/**\n * Short code → human-readable message for every error the Rewards contract\n * can emit. Ordered roughly the same way as the contract-side file.\n */\nexport const REWARDS_ERROR_MESSAGES: Record<string, string> = {\n // --- Plugin / wallet ----------------------------------------------------\n PNCW: 'Plugin does not control wallet',\n\n // --- Token allocation boxes --------------------------------------------\n TABE: 'Token allocation box already exists',\n TBNE: 'Token allocation box does not exist',\n\n // --- Disbursement authorization ----------------------------------------\n YNCR: 'You are not the creator of this disbursement',\n\n // --- Asset opt-in -------------------------------------------------------\n ANOI: 'App is not opted into asset',\n\n // --- Disbursement lifecycle --------------------------------------------\n DBNE: 'Disbursement does not exist',\n DBAF: 'Disbursement already final',\n DBLK: 'Disbursement is locked',\n DBFD: 'Disbursement is fully distributed',\n DBNX: 'Disbursement has not expired',\n\n // --- Disbursement validation -------------------------------------------\n IDUT: 'Invalid disbursement unlock time',\n IDXT: 'Invalid disbursement expiration time',\n DBEM: 'Disbursements cannot be empty',\n DBMA: 'Disbursements must have allocations',\n\n // --- Allocations --------------------------------------------------------\n ALAE: 'Allocation already exists',\n ALNE: 'Allocation does not exist',\n\n // --- Totals -------------------------------------------------------------\n ISUM: 'Invalid sum',\n IMBR: 'Invalid MBR amount',\n}\n\n/**\n * Translates a short Rewards error code (or raw ARC-65 log entry) into a\n * human-readable message. Falls back to the common error table when the code\n * isn't domain-specific. Unknown codes pass through as-is.\n */\nexport const translateRewardsError = makeErrorTranslator(REWARDS_ERROR_MESSAGES)\n"]}