{ "name": "Sealed", "structs": { "Commitment": [ { "name": "denomination", "type": "uint64" }, { "name": "postedAtRound", "type": "uint64" }, { "name": "soldAtRound", "type": "uint64" } ], "NullifierState": [ { "name": "spentRound", "type": "uint64" } ], "RootInfo": [ { "name": "denomination", "type": "uint64" }, { "name": "postedRound", "type": "uint64" } ], "UserKeys": [ { "name": "encryptionPubkey", "type": "byte[32]" }, { "name": "scanPubkey", "type": "byte[32]" }, { "name": "pqPubkeyHash", "type": "byte[32]" } ], "UserState": [ { "name": "version", "type": "uint8" }, { "name": "username", "type": "byte[]" }, { "name": "batchCount", "type": "uint8" }, { "name": "batches", "type": "(uint64,uint64)[]" }, { "name": "encryptionPubkey", "type": "byte[32]" }, { "name": "scanPubkey", "type": "byte[32]" }, { "name": "pqPubkeyHash", "type": "byte[32]" }, { "name": "bio", "type": "byte[]" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "address", "name": "treasury" }, { "type": "address", "name": "admin" }, { "type": "uint64", "name": "roundsPerYear" }, { "type": "uint64", "name": "initialPrice" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Creator init: seed globals. Must be called as the create txn.\n`treasuryAddress` may be the zero address at create time and rotated later\nvia `setTreasury` once the LogicSig escrow has been compiled + funded.\n`roundsPerYear` is configurable to allow LocalNet expiry tests; pass\n`9_500_000` for TestNet/MainNet (\u22481 year at ~3.3s rounds).\n`initialPrice` seeds the per-code \u00b5Algo sale price (spec v1: 10_000_000 =\n10 ALGO). Mutable post-create via `setPrice`.", "events": [], "recommendations": {} }, { "name": "registerCommitment", "args": [ { "type": "byte[]", "name": "commitment" }, { "type": "uint64", "name": "denomination" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin posts a per-code commitment. Body of the key is `sha256(preimage)`.\nBox MBR is consumed from the contract account balance \u2014 top up at deploy.\nABI log emits the commitment hash + denomination for off-chain audit.", "events": [ { "name": "CommitmentRegistered", "args": [ { "type": "byte[32]", "name": "commitment" }, { "type": "uint64", "name": "denomination" }, { "type": "uint64", "name": "postedAtRound" } ], "desc": "ARC28 event emitted on `registerCommitment`." } ], "recommendations": {} }, { "name": "seedSalePool", "args": [ { "type": "byte[32][]", "name": "commitments" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin appends commitments to the FIFO sale pool. Each entry must have a\npre-registered `c:` box (via `registerCommitment`) with\n`soldAtRound == 0` (not previously sold). Writes a `p:`\nbox per entry, bumps `poolTail`. MBR for each `p:` box (~19_300 \u00b5A)\ncomes from the app account balance \u2014 top up at deploy via T8.\n\nAVM box-ref budget caps `commitments.length` at `MAX_POOL_BATCH` (4).", "events": [ { "name": "PoolSeeded", "args": [ { "type": "uint64", "name": "count" }, { "type": "uint64", "name": "newTail" } ], "desc": "ARC28 event emitted on `seedSalePool`." } ], "recommendations": {} }, { "name": "unseedSalePool", "args": [ { "type": "uint64", "name": "qty" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin pops `qty` commitments from the tail of the sale pool (FIFO front\npreserved for in-flight buyers). For each popped entry: delete the\n`p:` queue box AND the underlying `c:` commitment box. Both\nMBR refunds flow back to the app account. Asserts `soldAtRound == 0` on\neach `c:` box \u2014 sold codes can only be reclaimed via `reclaimExpired`\nafter their 1-year fuse burns out.\n\nCapped at `MAX_POOL_BATCH` per call (same AVM ref-budget reason as seed).", "events": [ { "name": "PoolUnseeded", "args": [ { "type": "uint64", "name": "count" }, { "type": "uint64", "name": "newTail" } ], "desc": "ARC28 event emitted on `unseedSalePool`." } ], "recommendations": {} }, { "name": "getPoolSize", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Readonly: current depth of the sale pool (`poolTail - poolHead`).", "events": [], "recommendations": {} }, { "name": "reclaimExpired", "args": [ { "type": "byte[32][]", "name": "commitments" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin reclaims `c:` box MBR for codes that were sold but never\nredeemed within the 1-year fuse window. Asserts `soldAtRound > 0` (only\nsold codes \u2014 unsold pool entries are reclaimed via `unseedSalePool`) and\n`Global.round > soldAtRound + roundsPerYear` (fuse must have burned out).\nNo fund refund \u2014 the 10 ALGO sale was final at purchase time; this only\nfrees MBR (~22.5k \u00b5A per entry) back to the app account.\n\nCapped at `MAX_RECLAIM_BATCH` (8) per call.", "events": [ { "name": "ExpiredReclaimed", "args": [ { "type": "uint64", "name": "count" } ], "desc": "ARC28 event emitted on `reclaimExpired` \u2014 admin frees `c:` box MBR." } ], "recommendations": {} }, { "name": "setPrice", "args": [ { "type": "uint64", "name": "newPrice" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin updates the per-code \u00b5Algo sale price. Bounds `[PRICE_FLOOR,\nPRICE_CEILING]` guard against fat-finger zeroing or overflow. In-flight\npurchases signed at the old price will revert `BAD_AMOUNT` once the new\nprice is set \u2014 LP should refetch price + offer retry.", "events": [ { "name": "PriceChanged", "args": [ { "type": "uint64", "name": "oldPrice" }, { "type": "uint64", "name": "newPrice" } ], "desc": "ARC28 event emitted on `setPrice`." } ], "recommendations": {} }, { "name": "purchaseCodes", "args": [ { "type": "uint64", "name": "qty" }, { "type": "byte[32]", "name": "deliveryPubkey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Buyer-facing sale entry-point. 2-txn group, both signed by buyer:\n Txn 0: Pay buyer \u2192 `Global.currentApplicationAddress`,\n amount = `qty \u00d7 priceMicroAlgos`.\n Txn 1: this app-call.\n\nPops `qty` commitments from the FIFO sale-pool head, stamps each\n`c:` with `soldAtRound = Global.round` (lighting the 1-year fuse\nenforced by `redeem`), and deletes the `p:` queue boxes (MBR refunds\nto the app account). Buyer pays own fees \u2014 no escrow. No credit spend\n(buyer typically has no `w:` box yet; codes are bearer and redeemed by\nwhichever wallet later calls `redeem`).\n\nEmits ARC28 `CommitmentsSold{buyer, deliveryPubkey, commitments[],\npurchasedAtRound}` \u2014 this is the wire for the off-chain preimage-server,\nwhich encrypts the matching preimages to `deliveryPubkey` and serves\nthem via OHTTP-relayed delivery endpoint.", "events": [ { "name": "CommitmentsSold", "args": [ { "type": "address", "name": "buyer" }, { "type": "byte[32]", "name": "deliveryPubkey" }, { "type": "byte[32][]", "name": "commitments" }, { "type": "uint64", "name": "purchasedAtRound" } ], "desc": "ARC28 event emitted on `purchaseCodes` \u2014 the wire to the off-chain\npreimage-server. Server watches this stream, decrypts the matching\npreimages to `deliveryPubkey`, and posts ciphertext for buyer retrieval." } ], "recommendations": {} }, { "name": "postRoot", "args": [ { "type": "byte[32]", "name": "root" }, { "type": "uint64", "name": "denomination" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin posts a Merkle root + denomination for SNARK-anchored redemption\n(SPEC-snark-redeem-B \u00a74.1). Creates box `r:` storing\n`{denomination, postedRound}`. No verifier logic yet \u2014 `redeemWithProof`\nlands in T5. Duplicate roots revert; zero-denomination reverts (mirrors\nthe circuit's non-zero denomination constraint).", "events": [ { "name": "RootPosted", "args": [ { "type": "byte[32]", "name": "root" }, { "type": "uint64", "name": "denomination" }, { "type": "uint64", "name": "postedRound" } ], "desc": "ARC28 event emitted on `postRoot` (SPEC-snark-redeem-B \u00a74)." } ], "recommendations": {} }, { "name": "redeemWithProof", "args": [ { "type": "byte[32]", "name": "rootRef" }, { "type": "byte[32]", "name": "nullifier" }, { "type": "byte[]", "name": "proof" }, { "type": "byte[]", "name": "publicInputs" }, { "type": "byte[]", "name": "username" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "SNARK-anchored redeem (SPEC-snark-redeem-B \u00a74.1).\n\nPublic input layout, 4 \u00d7 32B = 128B:\n [0..32) root\n [32..64) nullifier\n [64..96) recipient ( = uint256(Txn.sender.bytes) mod Fr_MOD )\n [96..128) denomination (big-endian Fr element, equals root box's denom)\n\nError codes (\u00a74.3):\n BAD_ROOT \u2014 rootRef not in r: registry\n DOUBLE_SPEND \u2014 nb: exists\n BAD_RECIPIENT \u2014 recipient public input \u2260 derived(Txn.sender)\n BAD_PROOF \u2014 verifier rejected\n\nVerifier budget pooled via `ensureSnarkBudget()` (\u2248 80k units / 115 OpUps).\nCaller must supply enough staticFee \u2014 recommended 200_000 \u00b5Algo (see\ninternal/benchmarks/verifier-cost.md).\n\nRecipient binding (B-lite, Tornado-style): the contract reduces\n`Txn.sender.bytes` (32-byte ed25519 pubkey) mod the BN254 Fr prime and\nasserts equality with the proof's recipient public input. Pairing soundness\nmeans a front-runner replaying the proof with their own sender derives a\ndifferent recipient \u2192 BAD_RECIPIENT.", "events": [ { "name": "RedeemedWithProof", "args": [ { "type": "byte[32]", "name": "root" }, { "type": "byte[32]", "name": "nullifier" }, { "type": "uint64", "name": "denomination" }, { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "username" } ], "desc": "ARC28 event emitted on `redeemWithProof` (SPEC-snark-redeem-B \u00a74)." } ], "recommendations": {} }, { "name": "redeem", "args": [ { "type": "byte[]", "name": "preimage" }, { "type": "byte[]", "name": "username" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Redeem a commitment from any wallet. Verifies the preimage hashes to a\nlive commitment box, deletes the box (atomic mark-spent \u2014 MBR refunds to\nthe contract account = treasury), grants credits to the caller's\nUserState box, optionally seeds the caller's account MBR via inner-txn.\n\nUsername slot is wired in slice S7 (T7.1). For now, any non-empty\n`username` argument reverts with 'USERNAME_NOT_IMPL' so callers can detect\nthe partial implementation.", "events": [ { "name": "Redeemed", "args": [ { "type": "byte[32]", "name": "commitment" }, { "type": "uint64", "name": "denomination" }, { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "username" } ], "desc": "ARC28 event emitted on `redeem`." } ], "recommendations": {} }, { "name": "sendMessage", "args": [ { "type": "byte[32]", "name": "recipient_tag" }, { "type": "byte[]", "name": "ciphertext" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Spend one credit + emit ciphertext.\n\nMust be Txn 1 of a 2-txn group where Txn 0 is a treasury self-pay covering\nthe group fee. All fee accounting is treasury-side \u2014 user wallet pays 0.\n\nExpired batches are pruned (no MBR refund), then the oldest live batch is\ndecremented by 1 (or removed if the decrement empties it).", "events": [], "recommendations": {} }, { "name": "claimUsername", "args": [ { "type": "byte[]", "name": "username" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Claim or rename a username for the caller. Caller must already have a\ncredit box (i.e. previously redeemed). If the username slot is empty,\nthis is a first claim; if non-empty, it is a rename that atomically\ndeletes the old reverse-index box and creates the new one (net MBR = 0).\nv1: no cooldown.", "events": [ { "name": "UsernameClaimed", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "oldName" }, { "type": "byte[]", "name": "newName" } ], "desc": "ARC28 event emitted on first claim or rename of a username." }, { "name": "CreditSpent", "args": [ { "type": "address", "name": "wallet" }, { "type": "uint64", "name": "remaining" } ], "desc": "ARC28 event emitted whenever an identity-mutating op spends 1 credit\n(`publishKeys`, `claimUsername`, `releaseUsername`, `sendMessage`).\n`remaining` is the post-spend live credit total for the wallet, computed\nfrom the kept batches in the same `spendOneCredit` walk \u2014 zero extra\nbox reads. Indexer uses this as a cheap running balance signal." } ], "recommendations": {} }, { "name": "releaseUsername", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Clear the caller's username slot. Deletes the reverse-index box (MBR\nrefunds to contract account). Reverts if caller has no name set.", "events": [ { "name": "UsernameReleased", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "name" } ], "desc": "ARC28 event emitted on release of a username." }, { "name": "CreditSpent", "args": [ { "type": "address", "name": "wallet" }, { "type": "uint64", "name": "remaining" } ], "desc": "ARC28 event emitted whenever an identity-mutating op spends 1 credit\n(`publishKeys`, `claimUsername`, `releaseUsername`, `sendMessage`).\n`remaining` is the post-spend live credit total for the wallet, computed\nfrom the kept batches in the same `spendOneCredit` walk \u2014 zero extra\nbox reads. Indexer uses this as a cheap running balance signal." } ], "recommendations": {} }, { "name": "setBio", "args": [ { "type": "byte[]", "name": "bio" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set or clear the caller's public profile bio. Free-form UTF-8, length\ncapped at BIO_MAX bytes; empty input clears the field. Content policy\n(control chars etc.) is client-side \u2014 the chain validates length only.\nBio is PUBLIC on-chain plaintext, same exposure as username.\n\nUniversal escrow group: must be Txn 1 of `[escrowSelfPay, appCall]`.\nSpends 1 credit like the other identity-mutating ops; emits `BioChanged`\n+ `CreditSpent`.", "events": [ { "name": "BioChanged", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "bio" } ], "desc": "ARC28 event emitted on `setBio`. Empty `bio` = cleared." }, { "name": "CreditSpent", "args": [ { "type": "address", "name": "wallet" }, { "type": "uint64", "name": "remaining" } ], "desc": "ARC28 event emitted whenever an identity-mutating op spends 1 credit\n(`publishKeys`, `claimUsername`, `releaseUsername`, `sendMessage`).\n`remaining` is the post-spend live credit total for the wallet, computed\nfrom the kept batches in the same `spendOneCredit` walk \u2014 zero extra\nbox reads. Indexer uses this as a cheap running balance signal." } ], "recommendations": {} }, { "name": "resolveUsername", "args": [ { "type": "byte[]", "name": "username" } ], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Readonly: resolve a username to its owning wallet. Reverts if unset.", "events": [], "recommendations": {} }, { "name": "pruneExpired", "args": [ { "type": "address", "name": "wallet" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Drop all expired batches from `wallet`'s credit box. Anyone callable; v1\nhas no keeper bounty, treasury cron runs it. Reverts `NO_CREDITS` if the\ntarget has no credit box.", "events": [], "recommendations": {} }, { "name": "getCredits", "args": [ { "type": "address", "name": "wallet" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Readonly: sum non-expired batch amounts for `wallet`. Returns 0 if no\ncredit box exists (no revert \u2014 read path stays cheap).", "events": [], "recommendations": {} }, { "name": "withdrawTreasury", "args": [ { "type": "uint64", "name": "amount" }, { "type": "address", "name": "receiver" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin-only: drain contract account balance to `receiver`. Used to move\nTestNet treasury funds out, or to top up a redeployed escrow after an\nAlgorand min-fee bump. Inner-txn fee is 0; caller fee-pools.", "events": [], "recommendations": {} }, { "name": "setTreasury", "args": [ { "type": "address", "name": "newEscrow" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Creator-only rotate of `treasuryAddress`. Used when LogicSig escrow is\nredeployed after a min-fee bump.", "events": [], "recommendations": {} }, { "name": "publishKeys", "args": [ { "type": "byte[32]", "name": "encryptionPubkey" }, { "type": "byte[32]", "name": "scanPubkey" }, { "type": "byte[]", "name": "pqPubkey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Publish all cryptographic keys, anchor `pqPubkeyHash` on-chain, emit full\npq pubkey in `KeysPublished` event log (indexer caches it; clients verify\nhash against on-chain anchor before trusting indexer-served key).\n\nUniversal escrow group: must be Txn 1 of `[escrowSelfPay, appCall]`.\nCaller must have prior credits (redeemed first); spends 1 credit.", "events": [ { "name": "KeysPublished", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[32]", "name": "encryptionPubkey" }, { "type": "byte[32]", "name": "scanPubkey" }, { "type": "byte[]", "name": "pqPubkey" }, { "type": "byte[32]", "name": "pqPubkeyHash" } ], "desc": "ARC28 event emitted on `publishKeys`.\n\nCarries the full pq pubkey (up to 2048 bytes) in the event log so indexer\ncan cache it. On-chain box stores only `pqPubkeyHash` (32 bytes). Clients\nverify indexer-served pq pubkey hashes against this anchor before use." }, { "name": "CreditSpent", "args": [ { "type": "address", "name": "wallet" }, { "type": "uint64", "name": "remaining" } ], "desc": "ARC28 event emitted whenever an identity-mutating op spends 1 credit\n(`publishKeys`, `claimUsername`, `releaseUsername`, `sendMessage`).\n`remaining` is the post-spend live credit total for the wallet, computed\nfrom the kept batches in the same `spendOneCredit` walk \u2014 zero extra\nbox reads. Indexer uses this as a cheap running balance signal." } ], "recommendations": {} }, { "name": "redeemAndPublish", "args": [ { "type": "byte[]", "name": "preimage" }, { "type": "byte[32]", "name": "encryptionPubkey" }, { "type": "byte[32]", "name": "scanPubkey" }, { "type": "byte[]", "name": "pqPubkey" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sponsored onboarding: redeem a code AND publish keys in one atomic call,\nwithout spending a credit on the publish leg. Caller ends up with exactly\n`denomination` credits (500 for sale-pool codes) plus all three key\nfields set \u2014 single signature, no \"you have 499 credits\" surprise.\n\nSame escrow-group shape as `redeem` (Txn 0 = treasury self-pay covering\nfee pool, Txn 1 = this app-call). Recommended escrow fee pool = 5\u00d7minFee\nto cover commitment delete + UserState write + KeysPublished log (up to\n2048B pqPub) + sha256 + optional MBR-seed inner-txn for 0-ALGO wallets.\n\nExisting `redeem` + `publishKeys` ABIs are untouched \u2014 used by tests,\nadmin promo, and key-rotation (re-key) flows where credits already exist.\n\nAlways claims no username (empty); use `claimUsername` separately.", "events": [ { "name": "Redeemed", "args": [ { "type": "byte[32]", "name": "commitment" }, { "type": "uint64", "name": "denomination" }, { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "username" } ], "desc": "ARC28 event emitted on `redeem`." }, { "name": "KeysPublished", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[32]", "name": "encryptionPubkey" }, { "type": "byte[32]", "name": "scanPubkey" }, { "type": "byte[]", "name": "pqPubkey" }, { "type": "byte[32]", "name": "pqPubkeyHash" } ], "desc": "ARC28 event emitted on `publishKeys`.\n\nCarries the full pq pubkey (up to 2048 bytes) in the event log so indexer\ncan cache it. On-chain box stores only `pqPubkeyHash` (32 bytes). Clients\nverify indexer-served pq pubkey hashes against this anchor before use." } ], "recommendations": {} }, { "name": "getUserProfile", "args": [ { "type": "address", "name": "wallet" } ], "returns": { "type": "(uint8,byte[],uint8,(uint64,uint64)[],byte[32],byte[32],byte[32],byte[])", "struct": "UserState" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Readonly: return full UserState struct for `wallet`. Reverts if no box.\nOff-chain callers prefer reading the box directly via algod; this method\nexists for ABI completeness + on-chain composability (other contracts).", "events": [], "recommendations": {} }, { "name": "getUserKeys", "args": [ { "type": "address", "name": "wallet" } ], "returns": { "type": "(byte[32],byte[32],byte[32])", "struct": "UserKeys" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Readonly: return only the key triple for `wallet`. Cheaper return shape\nthan full profile when caller only needs pubkeys for an envelope. Reverts\nif no box.", "events": [], "recommendations": {} }, { "name": "migrate_v2", "args": [ { "type": "uint64", "name": "initialPrice" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "One-shot post-`update()` migration for an existing v1 app upgraded to v2\nmonetization wire layout. `update` does NOT re-run `createApplication`,\nso the three new globals (`priceMicroAlgos`, `poolHead`, `poolTail`) are\nleft unset. Reading them via the v2 approval program before they're\nwritten can revert. Admin calls `migrate_v2(initialPrice)` immediately\nafter `update()` to seed them.\n\nSets `priceMicroAlgos = initialPrice`, `poolHead = 0`, `poolTail = 0`.\nNo idempotency guard \u2014 admin's responsibility to call once. A duplicate\ncall with the same `initialPrice` is a no-op write; with a different\nprice it acts like `setPrice` (still admin-gated, still bounds-checked).\n\nBounds-check matches `setPrice` to guard against fat-finger.", "events": [], "recommendations": {} }, { "name": "forceDeleteCommitment", "args": [ { "type": "byte[32][]", "name": "commitments" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin force-deletes `c:` commitment boxes by key, WITHOUT reading\nthe box value. Safe for v1-layout (16B value) boxes that the v2 ARC4\ndeserializer would reject \u2014 `box_del` only takes the key. Used to drain\nstale pre-`migrate_v2` commitments so MBR refunds to the app account\nand the pool/redeem paths stop tripping over old entries.\n\nCapped at 8 per call (one box ref per entry, AVM cap).", "events": [], "recommendations": {} }, { "name": "_verifyProofForTest", "args": [ { "type": "byte[]", "name": "proof" }, { "type": "byte[]", "name": "publicInputs" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Test-only ABI exposing the bare Groth16 verifier. Lets CI drive\n`verifyGroth16` against committed golden vectors without the surrounding\n`redeemWithProof` flow (which lands in T5). Returns `true`/`false` so a\nfailing proof does NOT revert here \u2014 the caller asserts on the return\nvalue.\n\nSafe to ship: leaks no state, takes no side effects, and only validates\nproofs against the embedded vk. Production callers (`redeemWithProof`)\nshould depend on the underlying `verifyGroth16` import directly, not on\nthis wrapper.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 2 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "treasuryAddress": { "keyType": "AVMString", "valueType": "address", "key": "dA==" }, "adminAddress": { "keyType": "AVMString", "valueType": "address", "key": "YQ==" }, "roundsPerYear": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cg==" }, "maxBatches": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bQ==" }, "priceMicroAlgos": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHI=", "desc": "Per-code price in \u00b5Algos. Set via `createApplication`/`setPrice`." }, "poolHead": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGg=", "desc": "FIFO sale-pool head index. Incremented by `purchaseCodes`." }, "poolTail": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHQ=", "desc": "FIFO sale-pool tail index. Incremented by `seedSalePool`, decremented by `unseedSalePool`." } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "commitments": { "keyType": "AVMBytes", "valueType": "Commitment", "prefix": "Yzo=" }, "roots": { "keyType": "AVMBytes", "valueType": "RootInfo", "prefix": "cjo=" }, "nullifiers": { "keyType": "AVMBytes", "valueType": "NullifierState", "prefix": "bmI6" }, "users": { "keyType": "AVMBytes", "valueType": "UserState", "prefix": "dzo=" }, "names": { "keyType": "AVMBytes", "valueType": "address", "prefix": "bjo=" }, "salePool": { "keyType": "AVMBytes", "valueType": "byte[32]", "prefix": "cDo=" } } } }, "bareActions": { "create": [], "call": [ "UpdateApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1846, 2001, 2426 ], "errorMessage": "ALREADY_SOLD" }, { "pc": [ 2294 ], "errorMessage": "BAD_AMOUNT" }, { "pc": [ 6390 ], "errorMessage": "BAD_CHAR" }, { "pc": [ 2301 ], "errorMessage": "BAD_CLOSE" }, { "pc": [ 3343, 5118 ], "errorMessage": "BAD_CODE" }, { "pc": [ 2345 ], "errorMessage": "BAD_DELIVERY_PUBKEY" }, { "pc": [ 2535, 2858 ], "errorMessage": "BAD_DENOM" }, { "pc": [ 6124 ], "errorMessage": "BAD_FEE" }, { "pc": [ 6116 ], "errorMessage": "BAD_FEE_PAYER" }, { "pc": [ 953 ], "errorMessage": "BAD_G1_LEN" }, { "pc": [ 2263, 6100 ], "errorMessage": "BAD_GROUP_INDEX" }, { "pc": [ 1718 ], "errorMessage": "BAD_HASH" }, { "pc": [ 6304, 6309 ], "errorMessage": "BAD_LEN" }, { "pc": [ 2807 ], "errorMessage": "BAD_NULLIFIER" }, { "pc": [ 2276 ], "errorMessage": "BAD_PAYER" }, { "pc": [ 3331, 5096 ], "errorMessage": "BAD_PREIMAGE" }, { "pc": [ 2191, 2196, 5605, 5610 ], "errorMessage": "BAD_PRICE" }, { "pc": [ 2870 ], "errorMessage": "BAD_PROOF" }, { "pc": [ 423, 2670 ], "errorMessage": "BAD_PROOF_LEN" }, { "pc": [ 506, 2677 ], "errorMessage": "BAD_PUB_LEN" }, { "pc": [ 2283 ], "errorMessage": "BAD_RECEIVER" }, { "pc": [ 2851 ], "errorMessage": "BAD_RECIPIENT" }, { "pc": [ 2308 ], "errorMessage": "BAD_REKEY" }, { "pc": [ 2687, 2801 ], "errorMessage": "BAD_ROOT" }, { "pc": [ 1981, 2404, 3907, 4118 ], "errorMessage": "BAD_STATE" }, { "pc": [ 6156 ], "errorMessage": "BAD_VERSION" }, { "pc": [ 1802, 1933, 2091, 2253, 5659 ], "errorMessage": "BATCH_TOO_LARGE" }, { "pc": [ 4266 ], "errorMessage": "BIO_TOO_LONG" }, { "pc": [ 3369, 5144 ], "errorMessage": "Box must have value" }, { "pc": [ 3364, 5139 ], "errorMessage": "CODE_EXPIRED" }, { "pc": [ 1839, 1993, 2129, 2417 ], "errorMessage": "COMMITMENT_MISSING" }, { "pc": [ 2711 ], "errorMessage": "DOUBLE_SPEND" }, { "pc": [ 1798, 1928, 2087, 2248, 5655 ], "errorMessage": "EMPTY_BATCH" }, { "pc": [ 1506 ], "errorMessage": "G1_LIST_LEN" }, { "pc": [ 1513 ], "errorMessage": "G2_LIST_LEN" }, { "pc": [ 6317 ], "errorMessage": "LEADING_UNDERSCORE" }, { "pc": [ 1726, 1796, 1924, 2085, 2184, 2532, 4804, 5599, 5653 ], "errorMessage": "NOT_ADMIN" }, { "pc": [ 349, 4834 ], "errorMessage": "NOT_CREATOR" }, { "pc": [ 2144 ], "errorMessage": "NOT_EXPIRED" }, { "pc": [ 4427, 5527, 5553 ], "errorMessage": "NOT_FOUND" }, { "pc": [ 2258, 6095 ], "errorMessage": "NOT_GROUP" }, { "pc": [ 3914, 4125 ], "errorMessage": "NOT_OWNER" }, { "pc": [ 2137 ], "errorMessage": "NOT_SOLD" }, { "pc": [ 4456, 5776, 5955, 6138 ], "errorMessage": "NO_CREDITS" }, { "pc": [ 4104 ], "errorMessage": "NO_USERNAME" }, { "pc": [ 1578, 1609 ], "errorMessage": "OVERFLOW_32" }, { "pc": [ 125 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 343 ], "errorMessage": "OnCompletion must be UpdateApplication && can only call when not creating" }, { "pc": [ 2367 ], "errorMessage": "POOL_EMPTY" }, { "pc": [ 1862 ], "errorMessage": "POOL_SLOT_TAKEN" }, { "pc": [ 1953 ], "errorMessage": "POOL_UNDERFLOW" }, { "pc": [ 4887, 5106 ], "errorMessage": "PQ_KEY_TOO_LONG" }, { "pc": [ 4882, 5101 ], "errorMessage": "PQ_KEY_TOO_SHORT" }, { "pc": [ 1737, 2546, 2896, 3402, 3871 ], "errorMessage": "TAKEN" }, { "pc": [ 2949, 3455, 5208 ], "errorMessage": "TOO_MANY_BATCHES" }, { "pc": [ 6327 ], "errorMessage": "TRAILING_UNDERSCORE" }, { "pc": [ 3043, 3549 ], "errorMessage": "USERNAME_SET" }, { "pc": [ 1724, 1794, 1807, 1922, 1938, 1949, 2043, 2048, 2083, 2096, 2182, 2201, 2288, 2356, 2361, 2530, 2917, 2947, 3359, 3423, 3453, 4802, 5134, 5177, 5204, 5597, 5651, 6114 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1829, 2120, 4499, 4743, 5678, 5828 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 1693, 1775, 2064, 2607, 2623, 2642, 3041, 3289, 3308, 3547, 3788, 3817, 3890, 4103, 4240, 4407, 4862, 5034, 5073, 5632, 5711, 5727 ], "errorMessage": "invalid array length header" }, { "pc": [ 1788, 2077, 5645 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array>" }, { "pc": [ 1700, 2614, 2630, 2652, 3296, 3318, 3795, 3827, 4247, 4414, 4869, 5041, 5080, 5718, 5734 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1626, 1634, 2244, 2515, 2590, 2601, 3782, 4445, 4672, 4796, 4828, 4848, 4856, 5054, 5064, 5519, 5545 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 1643, 1652, 1712, 1916, 2176, 2234, 2524, 4788, 5591 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1868, 2447 ], "errorMessage": "invalid size" }, { "pc": [ 2453, 2969, 3217, 3475, 3716, 4517, 5229, 5463, 5878, 5923 ], "errorMessage": "max array length exceeded" }, { "pc": [ 3056, 3562, 4568, 5305, 5979 ], "errorMessage": "overflow" }, { "pc": [ 2269, 6106 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDMyIDIgMTI4IDEwMDAwMCAyNTYgMjQwMCAxMDAwMDAwIDEwMDAwMDAwMDAwMDAgODAwMDAKICAgIGJ5dGVjYmxvY2sgInc6IiAweDAwMDAgImEiIDB4MDMwMDY4ICJwdCIgImM6IiAiciIgInBoIiAweDE1MWY3Yzc1ICJuOiIgInByIiAibSIgInQiICJwOiIgMHgwMDAxIDB4MDY4MTAxIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwNGEgInI6IiAweDAwNmEgMHgwMzAwNjgwMSAweDQ3NGQ3ZDdmIDB4MDAyMiAweDAwODIgMHhhMWRmMWQ4OAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBleHBvcnQgY2xhc3MgU2VhbGVkIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fdXBkYXRlQDM1CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMzEKICAgIHB1c2hieXRlc3MgMHg5Mzc5ZjA5OSAweGMzNmIzYTk5IDB4ZTE4Nzc3NWMgMHgzY2RkZWY5OSAweGQxZTExNTA0IDB4YThkMjA1YTIgMHhlZTIyNzljZiAweDMxNDFmNDEwIDB4YmUyYWQ5ZWYgMHg4NTYwYmY0MiAweDA1MjBlZWJiIDB4MjczNDM5OTQgMHhlYzAzYWY2NCAweGY0MjhmNDdhIDB4NjlkNzZlODQgMHgxMWY4NmE5ZSAweGUxNDM5YzBjIDB4ODRjNTRiMzEgMHhlZDczZTZjZSAweGUyOGMwNDM0IDB4Y2Q2MGVhNjggMHhhNTBhYTVmMSAweDMxNGEwZDBhIDB4NmIxMDljZDMgMHhiZDEyZWFlNyAweGUwN2I2NzBkIC8vIG1ldGhvZCAicmVnaXN0ZXJDb21taXRtZW50KGJ5dGVbXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAic2VlZFNhbGVQb29sKGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAidW5zZWVkU2FsZVBvb2wodWludDY0KXZvaWQiLCBtZXRob2QgImdldFBvb2xTaXplKCl1aW50NjQiLCBtZXRob2QgInJlY2xhaW1FeHBpcmVkKGJ5dGVbMzJdW10pdm9pZCIsIG1ldGhvZCAic2V0UHJpY2UodWludDY0KXZvaWQiLCBtZXRob2QgInB1cmNoYXNlQ29kZXModWludDY0LGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgInBvc3RSb290KGJ5dGVbMzJdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZWRlZW1XaXRoUHJvb2YoYnl0ZVszMl0sYnl0ZVszMl0sYnl0ZVtdLGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAicmVkZWVtKGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAic2VuZE1lc3NhZ2UoYnl0ZVszMl0sYnl0ZVtdKXZvaWQiLCBtZXRob2QgImNsYWltVXNlcm5hbWUoYnl0ZVtdKXZvaWQiLCBtZXRob2QgInJlbGVhc2VVc2VybmFtZSgpdm9pZCIsIG1ldGhvZCAic2V0QmlvKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJyZXNvbHZlVXNlcm5hbWUoYnl0ZVtdKWFkZHJlc3MiLCBtZXRob2QgInBydW5lRXhwaXJlZChhZGRyZXNzKXZvaWQiLCBtZXRob2QgImdldENyZWRpdHMoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgIndpdGhkcmF3VHJlYXN1cnkodWludDY0LGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAic2V0VHJlYXN1cnkoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJwdWJsaXNoS2V5cyhieXRlWzMyXSxieXRlWzMyXSxieXRlW10pdm9pZCIsIG1ldGhvZCAicmVkZWVtQW5kUHVibGlzaChieXRlW10sYnl0ZVszMl0sYnl0ZVszMl0sYnl0ZVtdKXZvaWQiLCBtZXRob2QgImdldFVzZXJQcm9maWxlKGFkZHJlc3MpKHVpbnQ4LGJ5dGVbXSx1aW50OCwodWludDY0LHVpbnQ2NClbXSxieXRlWzMyXSxieXRlWzMyXSxieXRlWzMyXSxieXRlW10pIiwgbWV0aG9kICJnZXRVc2VyS2V5cyhhZGRyZXNzKShieXRlWzMyXSxieXRlWzMyXSxieXRlWzMyXSkiLCBtZXRob2QgIm1pZ3JhdGVfdjIodWludDY0KXZvaWQiLCBtZXRob2QgImZvcmNlRGVsZXRlQ29tbWl0bWVudChieXRlWzMyXVtdKXZvaWQiLCBtZXRob2QgIl92ZXJpZnlQcm9vZkZvclRlc3QoYnl0ZVtdLGJ5dGVbXSlib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggcmVnaXN0ZXJDb21taXRtZW50IHNlZWRTYWxlUG9vbCB1bnNlZWRTYWxlUG9vbCBnZXRQb29sU2l6ZSByZWNsYWltRXhwaXJlZCBzZXRQcmljZSBwdXJjaGFzZUNvZGVzIHBvc3RSb290IHJlZGVlbVdpdGhQcm9vZiByZWRlZW0gc2VuZE1lc3NhZ2UgY2xhaW1Vc2VybmFtZSByZWxlYXNlVXNlcm5hbWUgc2V0QmlvIHJlc29sdmVVc2VybmFtZSBwcnVuZUV4cGlyZWQgZ2V0Q3JlZGl0cyB3aXRoZHJhd1RyZWFzdXJ5IHNldFRyZWFzdXJ5IHB1Ymxpc2hLZXlzIHJlZGVlbUFuZFB1Ymxpc2ggZ2V0VXNlclByb2ZpbGUgZ2V0VXNlcktleXMgbWlncmF0ZV92MiBmb3JjZURlbGV0ZUNvbW1pdG1lbnQgX3ZlcmlmeVByb29mRm9yVGVzdAogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDMxOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBleHBvcnQgY2xhc3MgU2VhbGVkIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4OTEzODBkOTcgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlQXBwbGljYXRpb24KICAgIGVycgoKbWFpbl91cGRhdGVAMzU6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjI0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIFVwZGF0ZUFwcGxpY2F0aW9uICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2MjYKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MuYnl0ZXMsICJOT1RfQ1JFQVRPUiIpOwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9DUkVBVE9SCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjI0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBfcHV5YV9saWIudXRpbC5lbnN1cmVfYnVkZ2V0KHJlcXVpcmVkX2J1ZGdldDogdWludDY0LCBmZWVfc291cmNlOiB1aW50NjQpIC0+IHZvaWQ6CmVuc3VyZV9idWRnZXQ6CiAgICBwcm90byAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwoKZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMToKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBlbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDYKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAxNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDE1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3aXRjaCBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMyBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANAoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICBpdHhuX3N1Ym1pdAogICAgYiBlbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzBAMzoKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANQoKZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA2OgogICAgcmV0c3ViCgoKLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6OnZlcmlmeUdyb3RoMTYocHJvb2Y6IGJ5dGVzLCBwdWJsaWNJbnB1dHM6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeUdyb3RoMTY6CiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxNDUKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlHcm90aDE2KHByb29mOiBieXRlcywgcHVibGljSW5wdXRzOiBieXRlcyk6IGJvb2xlYW4gewogICAgcHJvdG8gMiAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE0NgogICAgLy8gYXNzZXJ0KHByb29mLmxlbmd0aCA9PT0gUFJPT0ZfQllURVMsICJCQURfUFJPT0ZfTEVOIik7CiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZHVwCiAgICBpbnRjIDYgLy8gMjU2CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9QUk9PRl9MRU4KICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYVJhdyA9IHByb29mLnNsaWNlKDAsIDY0KTsKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCA2NCAvLyA2NAogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgY292ZXIgMwogICAgY292ZXIgMwogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTQ5CiAgICAvLyBjb25zdCBiID0gcHJvb2Yuc2xpY2UoNjQsIDE5Mik7CiAgICBwdXNoaW50IDE5MiAvLyAxOTIKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAxOTIgLy8gMTkyCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgY292ZXIgMwogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTUwCiAgICAvLyBjb25zdCBjID0gcHJvb2Yuc2xpY2UoMTkyLCAyNTYpOwogICAgaW50YyA2IC8vIDI1NgogICAgZGlnIDIKICAgID49CiAgICBpbnRjIDYgLy8gMjU2CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHN3YXAKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjEwMwogICAgLy8gcHVibGljSW5wdXRzLmxlbmd0aCA9PT0gKFZLX05QVUJMSUMgYXMgdWludDY0KSAqIChTQ0FMQVJfQllURVMgYXMgdWludDY0KSwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBkdXAKICAgIGludGMgNCAvLyAxMjgKICAgID09CiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMDItMTA1CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHB1YmxpY0lucHV0cy5sZW5ndGggPT09IChWS19OUFVCTElDIGFzIHVpbnQ2NCkgKiAoU0NBTEFSX0JZVEVTIGFzIHVpbnQ2NCksCiAgICAvLyAgICJCQURfUFVCX0xFTiIsCiAgICAvLyApOwogICAgYXNzZXJ0IC8vIEJBRF9QVUJfTEVOCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMTEKICAgIC8vIGNvbnN0IHMwID0gcHVibGljSW5wdXRzLnNsaWNlKDAsIDMyKTsKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMiAvLyAzMgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IHMxID0gcHVibGljSW5wdXRzLnNsaWNlKDMyLCA2NCk7CiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBkaWcgMwogICAgPj0KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMTMKICAgIC8vIGNvbnN0IHMyID0gcHVibGljSW5wdXRzLnNsaWNlKDY0LCA5Nik7CiAgICBwdXNoaW50IDk2IC8vIDk2CiAgICBkaWcgNAogICAgPj0KICAgIHB1c2hpbnQgOTYgLy8gOTYKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMTQKICAgIC8vIGNvbnN0IHMzID0gcHVibGljSW5wdXRzLnNsaWNlKDk2LCAxMjgpOwogICAgaW50YyA0IC8vIDEyOAogICAgZGlnIDUKICAgID49CiAgICBpbnRjIDQgLy8gMTI4CiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMTYKICAgIC8vIGNvbnN0IHQwID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQk4yNTRnMSwgVktfSUNfMSwgczApOwogICAgcHVzaGJ5dGVzIDB4MmZhMjhhODdiYTcxYjgzNDhmY2YxYzdiN2Y5Y2E2ZmU1NzI5ZjRiNTlhMWU5MzZiZGVmZjZiNTRhZDZjOTc2MDIxZTgxMWQwNzVhMjkwMWQzMjg0ZjI4YTExNjc2NTc2YTUyMWI4YmM4YjM4OGZkYTk2Njk5ODlhN2RiMTliY2MKICAgIHVuY292ZXIgNAogICAgZWNfc2NhbGFyX211bCBCTjI1NGcxCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMDgKICAgIC8vIGxldCBhY2MgPSBWS19JQ18wOwogICAgcHVzaGJ5dGVzIDB4MGM5NDNlZjIyYTFmZjc0YjNhYTNkNzg2NzBkMDEzOWRiNzFjMDBmYzU2MGE4ZTViNzdhNzVjMTNhZmY2MjY1NzIwZDAwNDNiZTE1MTg1NTI2OTZlZmY4ODFmMWVjMGVkYzEyNWQyMTQ2YzM1YjQyMmUwNjE2M2VkOTVhMzViMmMKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjExNwogICAgLy8gYWNjID0gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQk4yNTRnMSwgYWNjLCB0MCk7CiAgICBzd2FwCiAgICBlY19hZGQgQk4yNTRnMQogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTE5CiAgICAvLyBjb25zdCB0MSA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJOMjU0ZzEsIFZLX0lDXzIsIHMxKTsKICAgIHB1c2hieXRlcyAweDIxOWJkZmE3MzI0ZmU1ODY0MzkwZDQ5MzZhOWYyNWNhOTBkZDJiMTQ2MjZlMzdhNDM1NTNhYWEyNWRlYjU0OGYyOTk0ZGIwOGQwNzUwZTBmOTQ2MGM1NzViM2QwOTlhYzI5MmM4OTViOWY0OGJmN2FjMjUxNmQzNTVjYzc5NzU4CiAgICB1bmNvdmVyIDQKICAgIGVjX3NjYWxhcl9tdWwgQk4yNTRnMQogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTIwCiAgICAvLyBhY2MgPSBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTjI1NGcxLCBhY2MsIHQxKTsKICAgIGVjX2FkZCBCTjI1NGcxCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMjIKICAgIC8vIGNvbnN0IHQyID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQk4yNTRnMSwgVktfSUNfMywgczIpOwogICAgcHVzaGJ5dGVzIDB4MDZkZjQ2MWQ2M2MxYTRmYWY4NWY1OTllYzRlMGQ1OGI1Mjc1MzcyZTg0NzZjZmEwMjQ3ODQ3MmU3MDQzZmE3ZjJmZDkyMDcwMWQyYzI1MWZhM2RhY2ZlZTMzOWEyMjMxNzJkNjUxZDNlMTdkYjFmMGQyYzUxNzEwMzhjY2JlNmMKICAgIHVuY292ZXIgMwogICAgZWNfc2NhbGFyX211bCBCTjI1NGcxCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxMjMKICAgIC8vIGFjYyA9IG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJOMjU0ZzEsIGFjYywgdDIpOwogICAgZWNfYWRkIEJOMjU0ZzEKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjEyNQogICAgLy8gY29uc3QgdDMgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTjI1NGcxLCBWS19JQ180LCBzMyk7CiAgICBwdXNoYnl0ZXMgMHgxZTc0NjhlNGZkZmJmM2YyNjRiYTFhZmFhYTFiYTM5NGJlY2ZhNWY2ZTA5MDNkMzdmNDBmYThlYWM2ZmM5MzFiMDFmMzA4M2VlMjllNTcyYjVjNzA2N2IwMWFkNGRkZWQ2NzU1NDYzNDViMzQyYjBlNGNhOGZlMjE2OTNmZWVhYwogICAgdW5jb3ZlciAyCiAgICBlY19zY2FsYXJfbXVsIEJOMjU0ZzEKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjEyNgogICAgLy8gYWNjID0gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQk4yNTRnMSwgYWNjLCB0Myk7CiAgICBlY19hZGQgQk4yNTRnMQogICAgc3dhcAogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6NzkKICAgIC8vIGFzc2VydChwLmxlbmd0aCA9PT0gRzFfQllURVMsICJCQURfRzFfTEVOIik7CiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9HMV9MRU4KICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCB4ID0gcC5zbGljZSgwLCAzMik7CiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDEKICAgID49CiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDMyCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBjb3ZlciAzCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo4MQogICAgLy8gY29uc3QgeSA9IHAuc2xpY2UoMzIsIDY0KTsKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCA2NCAvLyA2NAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo4MgogICAgLy8gaWYgKHkuZXF1YWxzKFpFUk9fMzIpKSByZXR1cm4gcDsKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBieiB2ZXJpZnlHcm90aDE2X2FmdGVyX2lmX2Vsc2VANQogICAgZnJhbWVfZGlnIDEKCnZlcmlmeUdyb3RoMTZfYWZ0ZXJfaW5saW5lZF9zcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo6bmVnRzFAOToKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE1OQogICAgLy8gY29uc3QgZzFMaXN0ID0gbmVnQS5jb25jYXQoVktfQUxQSEFfMSkuY29uY2F0KHZrWCkuY29uY2F0KGMpOwogICAgcHVzaGJ5dGVzIDB4MmQ0ZDlhYTdlMzAyZDlkZjQxNzQ5ZDU1MDc5NDlkMDVkYmVhMzNmYmIxNmM2NDNiMjJmNTk5YTJiZTZkZjJlMjE0YmVkZDUwM2MzN2NlYjA2MWQ4ZWM2MDIwOWZlMzQ1Y2U4OTgzMGExOTIzMDMwMWYwNzZjYWZmMDA0ZDE5MjYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTYwCiAgICAvLyBjb25zdCBnMkxpc3QgPSBiLmNvbmNhdChWS19CRVRBXzIpLmNvbmNhdChWS19HQU1NQV8yKS5jb25jYXQoVktfREVMVEFfMik7CiAgICBmcmFtZV9kaWcgMgogICAgcHVzaGJ5dGVzIDB4MGUxODc4NDdhZDRjNzk4Mzc0ZDBkNjczMmJmNTAxODQ3ZGQ2OGJjMGUwNzEyNDFlMDIxM2JjN2ZjMTNkYjdhYjA5NjcwMzJmY2JmNzc2ZDFhZmM5ODVmODg4NzdmMTgyZDM4NDgwYTY1M2YyZGVjYWE5Nzk0Y2JjM2JmMzA2MGMxNzM5YzFiMWE0NTdhOGM3MzEzMTIzZDI0ZDJmOTE5MmY4OTZiN2M2M2VlYTA1YTlkNTdmMDY1NDdhZDBjZWM4MzA0Y2ZiZDFlMDhhNzA0YTk5ZjVlODQ3ZDkzZjhjM2NhYWZkZGVjNDZiN2EwZDM3OWRhNjlhNGQxMTIzNDZhNzE4MDBkZWVmMTIxZjFlNzY0MjZhMDA2NjVlNWM0NDc5Njc0MzIyZDRmNzVlZGFkZDQ2ZGViZDVjZDk5MmY2ZWQxOThlOTM5MzkyMGQ0ODNhNzI2MGJmYjczMWZiNWQyNWYxYWE0OTMzMzVhOWU3MTI5N2U0ODViN2FlZjMxMmMyMTJjODVlYTVkYjhjNmRlYjRhYWI3MTgwOGRjYjQwOGZlM2QxZTc2OTBjNDNkMzdiNGNlNmNjMDE2NmZhN2RhYTA5MDY4OWQwNTg1ZmYwNzVlYzllOTlhZDY5MGMzMzk1YmM0YjMxMzM3MGIzOGVmMzU1YWNkYWRjZDEyMjk3NWIyZWVlNTFlOTAwODc0NmJmMjk4MzJlZWZmZmVhZTg0N2Q5ZjhjMzRhZThmYWIxYjljODlmMDhkMDk2NmQ5YWVmMTBmYmFhYjg4Y2JjODIxNDgxNjg4ZDRhMDg0ZmIyN2VkNjZkN2IzNDY4MTg4NTVmYWNkMDY3ODBkZjExY2IxMzFlYmE2ZDMyYmVlMWUxYmNlMjRlMWExMTg2NmIzM2QyMjE1MzIyNDU0ZDgxNzBkMTU1ZDk1NThjOWYxZGFlZDAxODJkMjNjYjY1MGUwMjBmMzQ5OGI1N2YwNWMyZDg5ZDNmMTI0OWRiMjQxYjc0MDliMDQ0MGNiNDFmOThlNDIyCiAgICBjb25jYXQKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE2MgogICAgLy8gYXNzZXJ0KGcxTGlzdC5sZW5ndGggPT09IDQgKiAoRzFfQllURVMgYXMgdWludDY0KSwgIkcxX0xJU1RfTEVOIik7CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjIDYgLy8gMjU2CiAgICA9PQogICAgYXNzZXJ0IC8vIEcxX0xJU1RfTEVOCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czoxNjMKICAgIC8vIGFzc2VydChnMkxpc3QubGVuZ3RoID09PSA0ICogKEcyX0JZVEVTIGFzIHVpbnQ2NCksICJHMl9MSVNUX0xFTiIpOwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNTEyIC8vIDUxMgogICAgPT0KICAgIGFzc2VydCAvLyBHMl9MSVNUX0xFTgogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6MTY1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5wYWlyaW5nQ2hlY2sob3AuRWMuQk4yNTRnMSwgZzFMaXN0LCBnMkxpc3QpOwogICAgZWNfcGFpcmluZ19jaGVjayBCTjI1NGcxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdmVyaWZ5R3JvdGgxNl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo4NAogICAgLy8gY29uc3QgbmVnWTogYmlndWludCA9IEJpZ1VpbnQoRlFfTU9EIC0gQmlnVWludCh5KSk7CiAgICBwdXNoYnl0ZXMgMHgzMDY0NGU3MmUxMzFhMDI5Yjg1MDQ1YjY4MTgxNTg1ZDk3ODE2YTkxNjg3MWNhOGQzYzIwOGMxNmQ4N2NmZDQ3CiAgICBmcmFtZV9kaWcgNgogICAgYi0KICAgIGR1cAogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6OTAKICAgIC8vIGlmIChiLmxlbmd0aCA9PT0gMzIpIHJldHVybiBiOwogICAgbGVuCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYnogdmVyaWZ5R3JvdGgxNl9hZnRlcl9pZl9lbHNlQDcKCnZlcmlmeUdyb3RoMTZfYWZ0ZXJfaW5saW5lZF9zcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo6cGFkTGVmdDMyQDg6CiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo4NgogICAgLy8gcmV0dXJuIHguY29uY2F0KHBhZExlZnQzMihuZWdZQnl0ZXMpKTsKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE1OAogICAgLy8gY29uc3QgbmVnQSA9IG5lZ0cxKGFSYXcpOwogICAgYiB2ZXJpZnlHcm90aDE2X2FmdGVyX2lubGluZWRfc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6Om5lZ0cxQDkKCnZlcmlmeUdyb3RoMTZfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6OTEKICAgIC8vIGFzc2VydChiLmxlbmd0aCA8IDMyLCAiT1ZFUkZMT1dfMzIiKTsKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGludGNfMiAvLyAzMgogICAgPAogICAgYXNzZXJ0IC8vIE9WRVJGTE9XXzMyCiAgICAvLyBzcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo5MgogICAgLy8gcmV0dXJuIG9wLmJ6ZXJvKDMyIC0gYi5sZW5ndGgpLmNvbmNhdChiKTsKICAgIGludGNfMiAvLyAzMgogICAgc3dhcAogICAgLQogICAgYnplcm8KICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL3NuYXJrX3ZlcmlmaWVyLmFsZ28udHM6ODYKICAgIC8vIHJldHVybiB4LmNvbmNhdChwYWRMZWZ0MzIobmVnWUJ5dGVzKSk7CiAgICBiIHZlcmlmeUdyb3RoMTZfYWZ0ZXJfaW5saW5lZF9zcmMvc25hcmtfdmVyaWZpZXIuYWxnby50czo6cGFkTGVmdDMyQDgKCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6cGFkTGVmdDMyKGI6IGJ5dGVzKSAtPiBieXRlczoKcGFkTGVmdDMyOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyBmdW5jdGlvbiBwYWRMZWZ0MzIoYjogYnl0ZXMpOiBieXRlcyB7CiAgICBwcm90byAxIDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM0NgogICAgLy8gaWYgKGIubGVuZ3RoID09PSAzMikgcmV0dXJuIGI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBieiBwYWRMZWZ0MzJfYWZ0ZXJfaWZfZWxzZUAyCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHJldHN1YgoKcGFkTGVmdDMyX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM0NwogICAgLy8gYXNzZXJ0KGIubGVuZ3RoIDwgMzIsICJPVkVSRkxPV18zMiIpOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICA8CiAgICBhc3NlcnQgLy8gT1ZFUkZMT1dfMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gcmV0dXJuIG9wLmJ6ZXJvKDMyIC0gYi5sZW5ndGgpLmNvbmNhdChiKTsKICAgIGludGNfMiAvLyAzMgogICAgc3dhcAogICAgLQogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLmNyZWF0ZUFwcGxpY2F0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0MDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAicmVxdWlyZSIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHRyZWFzdXJ5QWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJ0IiB9KTsKICAgIGJ5dGVjIDEyIC8vICJ0IgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyB0aGlzLnRyZWFzdXJ5QWRkcmVzcy52YWx1ZSA9IHRyZWFzdXJ5OwogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBhZG1pbkFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAiYSIgfSk7CiAgICBieXRlY18yIC8vICJhIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDEwCiAgICAvLyB0aGlzLmFkbWluQWRkcmVzcy52YWx1ZSA9IGFkbWluOwogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDExCiAgICAvLyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUgPSByb3VuZHNQZXJZZWFyLmFzVWludDY0KCk7CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTkKICAgIC8vIHJvdW5kc1BlclllYXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAiciIgfSk7CiAgICBieXRlYyA2IC8vICJyIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDExCiAgICAvLyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUgPSByb3VuZHNQZXJZZWFyLmFzVWludDY0KCk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBtYXhCYXRjaGVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogIm0iIH0pOwogICAgYnl0ZWMgMTEgLy8gIm0iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIHRoaXMubWF4QmF0Y2hlcy52YWx1ZSA9IE1BWF9CQVRDSEVTOwogICAgcHVzaGludCAxMiAvLyAxMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gdGhpcy5wcmljZU1pY3JvQWxnb3MudmFsdWUgPSBpbml0aWFsUHJpY2UuYXNVaW50NjQoKTsKICAgIGJ0b2kKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2MwogICAgLy8gcHJpY2VNaWNyb0FsZ29zID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInByIiB9KTsKICAgIGJ5dGVjIDEwIC8vICJwciIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gdGhpcy5wcmljZU1pY3JvQWxnb3MudmFsdWUgPSBpbml0aWFsUHJpY2UuYXNVaW50NjQoKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHBvb2xIZWFkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInBoIiB9KTsKICAgIGJ5dGVjIDcgLy8gInBoIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDE0CiAgICAvLyB0aGlzLnBvb2xIZWFkLnZhbHVlID0gMDsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gdGhpcy5wb29sVGFpbC52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgb25DcmVhdGU6ICJyZXF1aXJlIiB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQucmVnaXN0ZXJDb21taXRtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVnaXN0ZXJDb21taXRtZW50OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQyNQogICAgLy8gYXNzZXJ0KGNvbW1pdG1lbnQubGVuZ3RoID09PSBIQVNIX0xFTiwgIkJBRF9IQVNIIik7CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX0hBU0gKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQyNgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBhZG1pbkFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAiYSIgfSk7CiAgICBieXRlY18yIC8vICJhIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDI2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9BRE1JTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb21taXRtZW50cyA9IEJveE1hcDxieXRlcywgQ29tbWl0bWVudD4oeyBrZXlQcmVmaXg6ICJjOiIgfSk7CiAgICBieXRlYyA1IC8vICJjOiIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQyOQogICAgLy8gYXNzZXJ0KCFib3guZXhpc3RzLCAiVEFLRU4iKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gVEFLRU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQzMQogICAgLy8gY29uc3QgcG9zdGVkQXRSb3VuZCA9IG5ldyBhcmM0LlVpbnQ2NChHbG9iYWwucm91bmQpOwogICAgZ2xvYmFsIFJvdW5kCiAgICBpdG9iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0MzItNDM2CiAgICAvLyBib3gudmFsdWUgPSBuZXcgQ29tbWl0bWVudCh7CiAgICAvLyAgIGRlbm9taW5hdGlvbiwKICAgIC8vICAgcG9zdGVkQXRSb3VuZCwKICAgIC8vICAgc29sZEF0Um91bmQ6IG5ldyBhcmM0LlVpbnQ2NCgwKSwKICAgIC8vIH0pOwogICAgZGlnIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gc29sZEF0Um91bmQ6IG5ldyBhcmM0LlVpbnQ2NCgwKSwKICAgIGJ5dGVjIDE2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDMyLTQzNgogICAgLy8gYm94LnZhbHVlID0gbmV3IENvbW1pdG1lbnQoewogICAgLy8gICBkZW5vbWluYXRpb24sCiAgICAvLyAgIHBvc3RlZEF0Um91bmQsCiAgICAvLyAgIHNvbGRBdFJvdW5kOiBuZXcgYXJjNC5VaW50NjQoMCksCiAgICAvLyB9KTsKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0MzktNDQzCiAgICAvLyBuZXcgQ29tbWl0bWVudFJlZ2lzdGVyZWQoewogICAgLy8gICBjb21taXRtZW50OiBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4oY29tbWl0bWVudCksCiAgICAvLyAgIGRlbm9taW5hdGlvbiwKICAgIC8vICAgcG9zdGVkQXRSb3VuZCwKICAgIC8vIH0pLAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQzOC00NDQKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBDb21taXRtZW50UmVnaXN0ZXJlZCh7CiAgICAvLyAgICAgY29tbWl0bWVudDogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KGNvbW1pdG1lbnQpLAogICAgLy8gICAgIGRlbm9taW5hdGlvbiwKICAgIC8vICAgICBwb3N0ZWRBdFJvdW5kLAogICAgLy8gICB9KSwKICAgIC8vICk7CiAgICBwdXNoYnl0ZXMgMHhjZWE0Yzc5OSAvLyBtZXRob2QgIkNvbW1pdG1lbnRSZWdpc3RlcmVkKGJ5dGVbMzJdLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnNlZWRTYWxlUG9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNlZWRTYWxlUG9vbDoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPj4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ1OAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBhZG1pbkFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAiYSIgfSk7CiAgICBieXRlY18yIC8vICJhIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9BRE1JTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyBhc3NlcnQoY291bnQgPiAwLCAiRU1QVFlfQkFUQ0giKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIEVNUFRZX0JBVENICiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGFzc2VydChjb3VudCA8PSBNQVhfUE9PTF9CQVRDSCwgIkJBVENIX1RPT19MQVJHRSIpOwogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gQkFUQ0hfVE9PX0xBUkdFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGxldCB0YWlsOiB1aW50NjQgPSB0aGlzLnBvb2xUYWlsLnZhbHVlOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2NwogICAgLy8gcG9vbFRhaWwgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicHQiIH0pOwogICAgYnl0ZWMgNCAvLyAicHQiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjMKICAgIC8vIGxldCB0YWlsOiB1aW50NjQgPSB0aGlzLnBvb2xUYWlsLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ2NAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGludGNfMCAvLyAwCgpzZWVkU2FsZVBvb2xfd2hpbGVfdG9wQDI6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiBzZWVkU2FsZVBvb2xfYWZ0ZXJfd2hpbGVANAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBjb25zdCBoYXNoID0gY29tbWl0bWVudHNbaV0uYnl0ZXM7CiAgICBkaWcgMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gY29tbWl0bWVudHMgPSBCb3hNYXA8Ynl0ZXMsIENvbW1pdG1lbnQ+KHsga2V5UHJlZml4OiAiYzoiIH0pOwogICAgYnl0ZWMgNSAvLyAiYzoiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjgKICAgIC8vIGFzc2VydChjQm94LmV4aXN0cywgIkNPTU1JVE1FTlRfTUlTU0lORyIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDT01NSVRNRU5UX01JU1NJTkcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gYXNzZXJ0KGNCb3gudmFsdWUuc29sZEF0Um91bmQuYXNVaW50NjQoKSA9PT0gMCwgIkFMUkVBRFlfU09MRCIpOwogICAgYm94X2dldAogICAgcG9wCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgIQogICAgYXNzZXJ0IC8vIEFMUkVBRFlfU09MRAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDcyCiAgICAvLyBjb25zdCBpZHhLZXkgPSBvcC5pdG9iKHRhaWwgKyBpKTsKICAgIGRpZyAzCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBzYWxlUG9vbCA9IEJveE1hcDxieXRlcywgYXJjNC5TdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAicDoiIH0pOwogICAgYnl0ZWMgMTMgLy8gInA6IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NzQKICAgIC8vIGFzc2VydCghcEJveC5leGlzdHMsICJQT09MX1NMT1RfVEFLRU4iKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gUE9PTF9TTE9UX1RBS0VOCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIHBCb3gudmFsdWUgPSBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4oaGFzaCk7CiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHNlZWRTYWxlUG9vbF93aGlsZV90b3BAMgoKc2VlZFNhbGVQb29sX2FmdGVyX3doaWxlQDQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NzcKICAgIC8vIGNvbnN0IG5ld1RhaWw6IHVpbnQ2NCA9IHRhaWwgKyBjb3VudDsKICAgIGRpZyAxCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIHBvb2xUYWlsID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInB0IiB9KTsKICAgIGJ5dGVjIDQgLy8gInB0IgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyB0aGlzLnBvb2xUYWlsLnZhbHVlID0gbmV3VGFpbDsKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBjb3VudDogbmV3IGFyYzQuVWludDY0KGNvdW50KSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gbmV3VGFpbDogbmV3IGFyYzQuVWludDY0KG5ld1RhaWwpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDgxLTQ4NAogICAgLy8gbmV3IFBvb2xTZWVkZWQoewogICAgLy8gICBjb3VudDogbmV3IGFyYzQuVWludDY0KGNvdW50KSwKICAgIC8vICAgbmV3VGFpbDogbmV3IGFyYzQuVWludDY0KG5ld1RhaWwpLAogICAgLy8gfSksCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjQ4MC00ODUKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBQb29sU2VlZGVkKHsKICAgIC8vICAgICBjb3VudDogbmV3IGFyYzQuVWludDY0KGNvdW50KSwKICAgIC8vICAgICBuZXdUYWlsOiBuZXcgYXJjNC5VaW50NjQobmV3VGFpbCksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweGRiM2U3MDNlIC8vIG1ldGhvZCAiUG9vbFNlZWRlZCh1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo0NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC51bnNlZWRTYWxlUG9vbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVuc2VlZFNhbGVQb29sOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTAwCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGFkbWluQWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJhIiB9KTsKICAgIGJ5dGVjXzIgLy8gImEiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLmFkbWluQWRkcmVzcy52YWx1ZS5ieXRlcywgIk5PVF9BRE1JTiIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTk9UX0FETUlOCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MDEKICAgIC8vIGNvbnN0IGNvdW50OiB1aW50NjQgPSBxdHkuYXNVaW50NjQoKTsKICAgIGJ0b2kKICAgIGR1cG4gMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTAyCiAgICAvLyBhc3NlcnQoY291bnQgPiAwLCAiRU1QVFlfQkFUQ0giKTsKICAgIGFzc2VydCAvLyBFTVBUWV9CQVRDSAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyBhc3NlcnQoY291bnQgPD0gTUFYX1BPT0xfQkFUQ0gsICJCQVRDSF9UT09fTEFSR0UiKTsKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gQkFUQ0hfVE9PX0xBUkdFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MDUKICAgIC8vIGNvbnN0IGhlYWQ6IHVpbnQ2NCA9IHRoaXMucG9vbEhlYWQudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY1CiAgICAvLyBwb29sSGVhZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwaCIgfSk7CiAgICBieXRlYyA3IC8vICJwaCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwNQogICAgLy8gY29uc3QgaGVhZDogdWludDY0ID0gdGhpcy5wb29sSGVhZC52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MDYKICAgIC8vIGNvbnN0IHRhaWw6IHVpbnQ2NCA9IHRoaXMucG9vbFRhaWwudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gY29uc3QgdGFpbDogdWludDY0ID0gdGhpcy5wb29sVGFpbC52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwNwogICAgLy8gYXNzZXJ0KHRhaWwgLSBoZWFkID49IGNvdW50LCAiUE9PTF9VTkRFUkZMT1ciKTsKICAgIHN3YXAKICAgIC0KICAgIDw9CiAgICBhc3NlcnQgLy8gUE9PTF9VTkRFUkZMT1cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp1bnNlZWRTYWxlUG9vbF93aGlsZV90b3BAMjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IHVuc2VlZFNhbGVQb29sX2FmdGVyX3doaWxlQDQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gY29uc3QgcG9wSWR4OiB1aW50NjQgPSB0YWlsIC0gMSAtIGk7CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUxMQogICAgLy8gY29uc3QgaWR4S2V5ID0gb3AuaXRvYihwb3BJZHgpOwogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzkxCiAgICAvLyBzYWxlUG9vbCA9IEJveE1hcDxieXRlcywgYXJjNC5TdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAicDoiIH0pOwogICAgYnl0ZWMgMTMgLy8gInA6IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MTMKICAgIC8vIGFzc2VydChwQm94LmV4aXN0cywgIkJBRF9TVEFURSIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCQURfU1RBVEUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gY29uc3QgaGFzaCA9IHBCb3gudmFsdWUuYnl0ZXM7CiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb21taXRtZW50cyA9IEJveE1hcDxieXRlcywgQ29tbWl0bWVudD4oeyBrZXlQcmVmaXg6ICJjOiIgfSk7CiAgICBieXRlYyA1IC8vICJjOiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTE3CiAgICAvLyBhc3NlcnQoY0JveC5leGlzdHMsICJDT01NSVRNRU5UX01JU1NJTkciKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQ09NTUlUTUVOVF9NSVNTSU5HCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGFzc2VydChjQm94LnZhbHVlLnNvbGRBdFJvdW5kLmFzVWludDY0KCkgPT09IDAsICJBTFJFQURZX1NPTEQiKTsKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgIQogICAgYXNzZXJ0IC8vIEFMUkVBRFlfU09MRAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTIwCiAgICAvLyBjQm94LmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIHBCb3guZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgdW5zZWVkU2FsZVBvb2xfd2hpbGVfdG9wQDIKCnVuc2VlZFNhbGVQb29sX2FmdGVyX3doaWxlQDQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MjMKICAgIC8vIGNvbnN0IG5ld1RhaWw6IHVpbnQ2NCA9IHRhaWwgLSBjb3VudDsKICAgIGRpZyAxCiAgICBkaWcgMwogICAgLQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUyNAogICAgLy8gdGhpcy5wb29sVGFpbC52YWx1ZSA9IG5ld1RhaWw7CiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUyOQogICAgLy8gbmV3VGFpbDogbmV3IGFyYzQuVWludDY0KG5ld1RhaWwpLAogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTI3LTUzMAogICAgLy8gbmV3IFBvb2xVbnNlZWRlZCh7CiAgICAvLyAgIGNvdW50OiBuZXcgYXJjNC5VaW50NjQoY291bnQpLAogICAgLy8gICBuZXdUYWlsOiBuZXcgYXJjNC5VaW50NjQobmV3VGFpbCksCiAgICAvLyB9KSwKICAgIGRpZyA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUyNi01MzEKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBQb29sVW5zZWVkZWQoewogICAgLy8gICAgIGNvdW50OiBuZXcgYXJjNC5VaW50NjQoY291bnQpLAogICAgLy8gICAgIG5ld1RhaWw6IG5ldyBhcmM0LlVpbnQ2NChuZXdUYWlsKSwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4ODE3NTI5ZTQgLy8gbWV0aG9kICJQb29sVW5zZWVkZWQodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NDk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQuZ2V0UG9vbFNpemVbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQb29sU2l6ZToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUzNwogICAgLy8gcmV0dXJuIG5ldyBhcmM0LlVpbnQ2NCh0aGlzLnBvb2xUYWlsLnZhbHVlIC0gdGhpcy5wb29sSGVhZC52YWx1ZSk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUzNwogICAgLy8gcmV0dXJuIG5ldyBhcmM0LlVpbnQ2NCh0aGlzLnBvb2xUYWlsLnZhbHVlIC0gdGhpcy5wb29sSGVhZC52YWx1ZSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gcG9vbEhlYWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicGgiIH0pOwogICAgYnl0ZWMgNyAvLyAicGgiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1MzcKICAgIC8vIHJldHVybiBuZXcgYXJjNC5VaW50NjQodGhpcy5wb29sVGFpbC52YWx1ZSAtIHRoaXMucG9vbEhlYWQudmFsdWUpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjUzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnJlY2xhaW1FeHBpcmVkW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVjbGFpbUV4cGlyZWQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4+CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLmFkbWluQWRkcmVzcy52YWx1ZS5ieXRlcywgIk5PVF9BRE1JTiIpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gYWRtaW5BZGRyZXNzID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogImEiIH0pOwogICAgYnl0ZWNfMiAvLyAiYSIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU1MgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOT1RfQURNSU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU1NAogICAgLy8gYXNzZXJ0KGNvdW50ID4gMCwgIkVNUFRZX0JBVENIIik7CiAgICBkdXAKICAgIGFzc2VydCAvLyBFTVBUWV9CQVRDSAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTU1CiAgICAvLyBhc3NlcnQoY291bnQgPD0gTUFYX1JFQ0xBSU1fQkFUQ0gsICJCQVRDSF9UT09fTEFSR0UiKTsKICAgIHB1c2hpbnQgOCAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIEJBVENIX1RPT19MQVJHRQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTU3CiAgICAvLyBjb25zdCBmdXNlTGVuOiB1aW50NjQgPSB0aGlzLnJvdW5kc1BlclllYXIudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyByb3VuZHNQZXJZZWFyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInIiIH0pOwogICAgYnl0ZWMgNiAvLyAiciIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU1NwogICAgLy8gY29uc3QgZnVzZUxlbjogdWludDY0ID0gdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU1OAogICAgLy8gY29uc3QgY3VycmVudFJvdW5kOiB1aW50NjQgPSBHbG9iYWwucm91bmQ7CiAgICBnbG9iYWwgUm91bmQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGludGNfMCAvLyAwCgpyZWNsYWltRXhwaXJlZF93aGlsZV90b3BAMjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IHJlY2xhaW1FeHBpcmVkX2FmdGVyX3doaWxlQDQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU2MQogICAgLy8gY29uc3QgaGFzaCA9IGNvbW1pdG1lbnRzW2ldLmJ5dGVzOwogICAgZGlnIDQKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIGNvbW1pdG1lbnRzID0gQm94TWFwPGJ5dGVzLCBDb21taXRtZW50Pih7IGtleVByZWZpeDogImM6IiB9KTsKICAgIGJ5dGVjIDUgLy8gImM6IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIGFzc2VydChjQm94LmV4aXN0cywgIkNPTU1JVE1FTlRfTUlTU0lORyIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDT01NSVRNRU5UX01JU1NJTkcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU2NAogICAgLy8gY29uc3Qgc29sZDogdWludDY0ID0gY0JveC52YWx1ZS5zb2xkQXRSb3VuZC5hc1VpbnQ2NCgpOwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1NjUKICAgIC8vIGFzc2VydChzb2xkID4gMCwgIk5PVF9TT0xEIik7CiAgICBkdXAKICAgIGFzc2VydCAvLyBOT1RfU09MRAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTY2CiAgICAvLyBhc3NlcnQoY3VycmVudFJvdW5kID4gc29sZCArIGZ1c2VMZW4sICJOT1RfRVhQSVJFRCIpOwogICAgZGlnIDUKICAgICsKICAgIGRpZyA0CiAgICA8CiAgICBhc3NlcnQgLy8gTk9UX0VYUElSRUQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU2NwogICAgLy8gY0JveC5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTYwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiByZWNsYWltRXhwaXJlZF93aGlsZV90b3BAMgoKcmVjbGFpbUV4cGlyZWRfYWZ0ZXJfd2hpbGVANDoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU3MAogICAgLy8gZW1pdChuZXcgRXhwaXJlZFJlY2xhaW1lZCh7IGNvdW50OiBuZXcgYXJjNC5VaW50NjQoY291bnQpIH0pKTsKICAgIGRpZyAzCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHg3MDFjZjVhYyAvLyBtZXRob2QgIkV4cGlyZWRSZWNsYWltZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5zZXRQcmljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldFByaWNlOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTgxCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGFkbWluQWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJhIiB9KTsKICAgIGJ5dGVjXzIgLy8gImEiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1ODEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLmFkbWluQWRkcmVzcy52YWx1ZS5ieXRlcywgIk5PVF9BRE1JTiIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTk9UX0FETUlOCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1ODIKICAgIC8vIGNvbnN0IG5wOiB1aW50NjQgPSBuZXdQcmljZS5hc1VpbnQ2NCgpOwogICAgZHVwCiAgICBidG9pCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIGFzc2VydChucCA+PSBQUklDRV9GTE9PUiwgIkJBRF9QUklDRSIpOwogICAgZHVwCiAgICBpbnRjIDggLy8gMTAwMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBCQURfUFJJQ0UKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU4NAogICAgLy8gYXNzZXJ0KG5wIDw9IFBSSUNFX0NFSUxJTkcsICJCQURfUFJJQ0UiKTsKICAgIGR1cAogICAgaW50YyA5IC8vIDEwMDAwMDAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gQkFEX1BSSUNFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo1ODUKICAgIC8vIGNvbnN0IG9sZDogdWludDY0ID0gdGhpcy5wcmljZU1pY3JvQWxnb3MudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzYzCiAgICAvLyBwcmljZU1pY3JvQWxnb3MgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicHIiIH0pOwogICAgYnl0ZWMgMTAgLy8gInByIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTg1CiAgICAvLyBjb25zdCBvbGQ6IHVpbnQ2NCA9IHRoaXMucHJpY2VNaWNyb0FsZ29zLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2MwogICAgLy8gcHJpY2VNaWNyb0FsZ29zID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInByIiB9KTsKICAgIGJ5dGVjIDEwIC8vICJwciIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU4NgogICAgLy8gdGhpcy5wcmljZU1pY3JvQWxnb3MudmFsdWUgPSBucDsKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU4OQogICAgLy8gb2xkUHJpY2U6IG5ldyBhcmM0LlVpbnQ2NChvbGQpLAogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NTg4LTU5MQogICAgLy8gbmV3IFByaWNlQ2hhbmdlZCh7CiAgICAvLyAgIG9sZFByaWNlOiBuZXcgYXJjNC5VaW50NjQob2xkKSwKICAgIC8vICAgbmV3UHJpY2U6IG5ld1ByaWNlLAogICAgLy8gfSksCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU4Ny01OTIKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBQcmljZUNoYW5nZWQoewogICAgLy8gICAgIG9sZFByaWNlOiBuZXcgYXJjNC5VaW50NjQob2xkKSwKICAgIC8vICAgICBuZXdQcmljZTogbmV3UHJpY2UsCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDdhMzVlYmQxIC8vIG1ldGhvZCAiUHJpY2VDaGFuZ2VkKHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjU3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnB1cmNoYXNlQ29kZXNbcm91dGluZ10oKSAtPiB2b2lkOgpwdXJjaGFzZUNvZGVzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjE1CiAgICAvLyBjb25zdCBjb3VudDogdWludDY0ID0gcXR5LmFzVWludDY0KCk7CiAgICBidG9pCiAgICBkdXBuIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYxNgogICAgLy8gYXNzZXJ0KGNvdW50ID4gMCwgIkVNUFRZX0JBVENIIik7CiAgICBhc3NlcnQgLy8gRU1QVFlfQkFUQ0gKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYxNwogICAgLy8gYXNzZXJ0KGNvdW50IDw9IE1BWF9QVVJDSEFTRV9RVFksICJCQVRDSF9UT09fTEFSR0UiKTsKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIDw9CiAgICBhc3NlcnQgLy8gQkFUQ0hfVE9PX0xBUkdFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTMKICAgIC8vIGFzc2VydChHbG9iYWwuZ3JvdXBTaXplID09PSBHUk9VUF9TSVpFX0VYUEVDVEVELCAiTk9UX0dST1VQIik7CiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBOT1RfR1JPVVAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY5NAogICAgLy8gYXNzZXJ0KFR4bi5ncm91cEluZGV4ID09PSBQVVJDSEFTRV9BUFBDQUxMX0lOREVYLCAiQkFEX0dST1VQX0lOREVYIik7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX0dST1VQX0lOREVYCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTUKICAgIC8vIGNvbnN0IHBheVR4biA9IGd0eG4uUGF5bWVudFR4bihQVVJDSEFTRV9QQVlfSU5ERVgpOwogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Njk2CiAgICAvLyBhc3NlcnQocGF5VHhuLnNlbmRlci5ieXRlcyA9PT0gVHhuLnNlbmRlci5ieXRlcywgIkJBRF9QQVlFUiIpOwogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9QQVlFUgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Njk1CiAgICAvLyBjb25zdCBwYXlUeG4gPSBndHhuLlBheW1lbnRUeG4oUFVSQ0hBU0VfUEFZX0lOREVYKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTgKICAgIC8vIHBheVR4bi5yZWNlaXZlci5ieXRlcyA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MuYnl0ZXMsCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTctNzAwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHBheVR4bi5yZWNlaXZlci5ieXRlcyA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MuYnl0ZXMsCiAgICAvLyAgICJCQURfUkVDRUlWRVIiLAogICAgLy8gKTsKICAgIGFzc2VydCAvLyBCQURfUkVDRUlWRVIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcwMQogICAgLy8gY29uc3QgZXhwZWN0ZWRBbW91bnQ6IHVpbnQ2NCA9IGNvdW50ICogdGhpcy5wcmljZU1pY3JvQWxnb3MudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzYzCiAgICAvLyBwcmljZU1pY3JvQWxnb3MgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicHIiIH0pOwogICAgYnl0ZWMgMTAgLy8gInByIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NzAxCiAgICAvLyBjb25zdCBleHBlY3RlZEFtb3VudDogdWludDY0ID0gY291bnQgKiB0aGlzLnByaWNlTWljcm9BbGdvcy52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAqCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTUKICAgIC8vIGNvbnN0IHBheVR4biA9IGd0eG4uUGF5bWVudFR4bihQVVJDSEFTRV9QQVlfSU5ERVgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcwMgogICAgLy8gYXNzZXJ0KHBheVR4bi5hbW91bnQgPT09IGV4cGVjdGVkQW1vdW50LCAiQkFEX0FNT1VOVCIpOwogICAgZ3R4bnMgQW1vdW50CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9BTU9VTlQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY5NQogICAgLy8gY29uc3QgcGF5VHhuID0gZ3R4bi5QYXltZW50VHhuKFBVUkNIQVNFX1BBWV9JTkRFWCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NzA0CiAgICAvLyBwYXlUeG4uY2xvc2VSZW1haW5kZXJUby5ieXRlcyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLmJ5dGVzLAogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NzAzLTcwNgogICAgLy8gYXNzZXJ0KAogICAgLy8gICBwYXlUeG4uY2xvc2VSZW1haW5kZXJUby5ieXRlcyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLmJ5dGVzLAogICAgLy8gICAiQkFEX0NMT1NFIiwKICAgIC8vICk7CiAgICBhc3NlcnQgLy8gQkFEX0NMT1NFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2OTUKICAgIC8vIGNvbnN0IHBheVR4biA9IGd0eG4uUGF5bWVudFR4bihQVVJDSEFTRV9QQVlfSU5ERVgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcwNwogICAgLy8gYXNzZXJ0KHBheVR4bi5yZWtleVRvLmJ5dGVzID09PSBHbG9iYWwuemVyb0FkZHJlc3MuYnl0ZXMsICJCQURfUkVLRVkiKTsKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBCQURfUkVLRVkKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYyNQogICAgLy8gZW5zdXJlQnVkZ2V0KDI0MDAsIE9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCk7CiAgICBpbnRjIDcgLy8gMjQwMAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjMwCiAgICAvLyBsZXQgZHBrT3I6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgMzI7IGkrKykgewogICAgZHVwCgpwdXJjaGFzZUNvZGVzX3doaWxlX3RvcEAyOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjMxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgMzI7IGkrKykgewogICAgZHVwCiAgICBpbnRjXzIgLy8gMzIKICAgIDwKICAgIGJ6IHB1cmNoYXNlQ29kZXNfYWZ0ZXJfd2hpbGVANAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjMyCiAgICAvLyBkcGtPciA9IGRwa09yIHwgb3AuZ2V0Qnl0ZShkcGssIGkpOwogICAgZGlnIDMKICAgIGRpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGdldGJ5dGUKICAgIGRpZyAzCiAgICB8CiAgICBidXJ5IDMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYzMQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IDMyOyBpKyspIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgcHVyY2hhc2VDb2Rlc193aGlsZV90b3BAMgoKcHVyY2hhc2VDb2Rlc19hZnRlcl93aGlsZUA0OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjM0CiAgICAvLyBhc3NlcnQoZHBrT3IgIT09IDAsICJCQURfREVMSVZFUllfUFVCS0VZIik7CiAgICBkaWcgMQogICAgYXNzZXJ0IC8vIEJBRF9ERUxJVkVSWV9QVUJLRVkKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYzNgogICAgLy8gY29uc3QgaGVhZDogdWludDY0ID0gdGhpcy5wb29sSGVhZC52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHBvb2xIZWFkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInBoIiB9KTsKICAgIGJ5dGVjIDcgLy8gInBoIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjM2CiAgICAvLyBjb25zdCBoZWFkOiB1aW50NjQgPSB0aGlzLnBvb2xIZWFkLnZhbHVlOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2MzcKICAgIC8vIGNvbnN0IHRhaWw6IHVpbnQ2NCA9IHRoaXMucG9vbFRhaWwudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjYzNwogICAgLy8gY29uc3QgdGFpbDogdWludDY0ID0gdGhpcy5wb29sVGFpbC52YWx1ZTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2MzgKICAgIC8vIGFzc2VydCh0YWlsIC0gaGVhZCA+PSBjb3VudCwgIlBPT0xfRU1QVFkiKTsKICAgIHN3YXAKICAgIC0KICAgIGRpZyAzCiAgICA+PQogICAgYXNzZXJ0IC8vIFBPT0xfRU1QVFkKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY0MAogICAgLy8gY29uc3Qgc29sZExpc3QgPSBuZXcgYXJjNC5EeW5hbWljQXJyYXk8YXJjNC5TdGF0aWNCeXRlczwzMj4+KCk7CiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgYnVyeSA3CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NDEKICAgIC8vIGNvbnN0IHB1cmNoYXNlZEF0Um91bmQgPSBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kKTsKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgYnVyeSA4CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSA1CgpwdXJjaGFzZUNvZGVzX3doaWxlX3RvcEA1OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjQzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgZGlnIDQKICAgIGRpZyAzCiAgICA8CiAgICBieiBwdXJjaGFzZUNvZGVzX2FmdGVyX3doaWxlQDcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY0NAogICAgLy8gY29uc3QgcG9wSWR4OiB1aW50NjQgPSBoZWFkICsgaTsKICAgIGRpZyA1CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NDUKICAgIC8vIGNvbnN0IGlkeEtleSA9IG9wLml0b2IocG9wSWR4KTsKICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM5MQogICAgLy8gc2FsZVBvb2wgPSBCb3hNYXA8Ynl0ZXMsIGFyYzQuU3RhdGljQnl0ZXM8MzI+Pih7IGtleVByZWZpeDogInA6IiB9KTsKICAgIGJ5dGVjIDEzIC8vICJwOiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyBhc3NlcnQocEJveC5leGlzdHMsICJCQURfU1RBVEUiKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQkFEX1NUQVRFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NDgKICAgIC8vIGNvbnN0IGhhc2ggPSBwQm94LnZhbHVlLmJ5dGVzOwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM3MAogICAgLy8gY29tbWl0bWVudHMgPSBCb3hNYXA8Ynl0ZXMsIENvbW1pdG1lbnQ+KHsga2V5UHJlZml4OiAiYzoiIH0pOwogICAgYnl0ZWMgNSAvLyAiYzoiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NTEKICAgIC8vIGFzc2VydChjQm94LmV4aXN0cywgIkNPTU1JVE1FTlRfTUlTU0lORyIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBDT01NSVRNRU5UX01JU1NJTkcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY1MgogICAgLy8gY29uc3QgY1ByZXYgPSBjbG9uZShjQm94LnZhbHVlKTsKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIGFzc2VydChjUHJldi5zb2xkQXRSb3VuZC5hc1VpbnQ2NCgpID09PSAwLCAiQUxSRUFEWV9TT0xEIik7CiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAhCiAgICBhc3NlcnQgLy8gQUxSRUFEWV9TT0xECiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NTgKICAgIC8vIGRlbm9taW5hdGlvbjogY1ByZXYuZGVub21pbmF0aW9uLAogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjU5CiAgICAvLyBwb3N0ZWRBdFJvdW5kOiBjUHJldi5wb3N0ZWRBdFJvdW5kLAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY1Ny02NjEKICAgIC8vIGNCb3gudmFsdWUgPSBuZXcgQ29tbWl0bWVudCh7CiAgICAvLyAgIGRlbm9taW5hdGlvbjogY1ByZXYuZGVub21pbmF0aW9uLAogICAgLy8gICBwb3N0ZWRBdFJvdW5kOiBjUHJldi5wb3N0ZWRBdFJvdW5kLAogICAgLy8gICBzb2xkQXRSb3VuZDogcHVyY2hhc2VkQXRSb3VuZCwKICAgIC8vIH0pOwogICAgY29uY2F0CiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjYyCiAgICAvLyBwQm94LmRlbGV0ZSgpOwogICAgc3dhcAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NjQKICAgIC8vIHNvbGRMaXN0LnB1c2gobmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KGhhc2gpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICBkaWcgOAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjQzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgNQogICAgYiBwdXJjaGFzZUNvZGVzX3doaWxlX3RvcEA1CgpwdXJjaGFzZUNvZGVzX2FmdGVyX3doaWxlQDc6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIHRoaXMucG9vbEhlYWQudmFsdWUgPSBoZWFkICsgY291bnQ7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gcG9vbEhlYWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicGgiIH0pOwogICAgYnl0ZWMgNyAvLyAicGgiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2NjYKICAgIC8vIHRoaXMucG9vbEhlYWQudmFsdWUgPSBoZWFkICsgY291bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NjcwCiAgICAvLyBidXllcjogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY2OS02NzQKICAgIC8vIG5ldyBDb21taXRtZW50c1NvbGQoewogICAgLy8gICBidXllcjogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgZGVsaXZlcnlQdWJrZXksCiAgICAvLyAgIGNvbW1pdG1lbnRzOiBzb2xkTGlzdCwKICAgIC8vICAgcHVyY2hhc2VkQXRSb3VuZCwKICAgIC8vIH0pLAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgYnl0ZWMgMTcgLy8gMHgwMDRhCiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjY2OC02NzUKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBDb21taXRtZW50c1NvbGQoewogICAgLy8gICAgIGJ1eWVyOiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGRlbGl2ZXJ5UHVia2V5LAogICAgLy8gICAgIGNvbW1pdG1lbnRzOiBzb2xkTGlzdCwKICAgIC8vICAgICBwdXJjaGFzZWRBdFJvdW5kLAogICAgLy8gICB9KSwKICAgIC8vICk7CiAgICBwdXNoYnl0ZXMgMHhhZDgwNzhmOSAvLyBtZXRob2QgIkNvbW1pdG1lbnRzU29sZChhZGRyZXNzLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo2MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5wb3N0Um9vdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBvc3RSb290OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NzE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLmFkbWluQWRkcmVzcy52YWx1ZS5ieXRlcywgIk5PVF9BRE1JTiIpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gYWRtaW5BZGRyZXNzID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogImEiIH0pOwogICAgYnl0ZWNfMiAvLyAiYSIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcxOQogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOT1RfQURNSU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcyMAogICAgLy8gYXNzZXJ0KGRlbm9taW5hdGlvbi5hc1VpbnQ2NCgpID4gMCwgIkJBRF9ERU5PTSIpOwogICAgZHVwCiAgICBidG9pCiAgICBhc3NlcnQgLy8gQkFEX0RFTk9NCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNzQKICAgIC8vIHJvb3RzID0gQm94TWFwPGJ5dGVzLCBSb290SW5mbz4oeyBrZXlQcmVmaXg6ICJyOiIgfSk7CiAgICBieXRlYyAxOCAvLyAicjoiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3MjMKICAgIC8vIGFzc2VydCghYm94LmV4aXN0cywgIlRBS0VOIik7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIFRBS0VOCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3MjUKICAgIC8vIGNvbnN0IHBvc3RlZFJvdW5kID0gbmV3IGFyYzQuVWludDY0KEdsb2JhbC5yb3VuZCk7CiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcyNi03MjkKICAgIC8vIGJveC52YWx1ZSA9IG5ldyBSb290SW5mbyh7CiAgICAvLyAgIGRlbm9taW5hdGlvbiwKICAgIC8vICAgcG9zdGVkUm91bmQsCiAgICAvLyB9KTsKICAgIGRpZyAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjczMi03MzYKICAgIC8vIG5ldyBSb290UG9zdGVkKHsKICAgIC8vICAgcm9vdCwKICAgIC8vICAgZGVub21pbmF0aW9uLAogICAgLy8gICBwb3N0ZWRSb3VuZCwKICAgIC8vIH0pLAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjczMS03MzcKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBSb290UG9zdGVkKHsKICAgIC8vICAgICByb290LAogICAgLy8gICAgIGRlbm9taW5hdGlvbiwKICAgIC8vICAgICBwb3N0ZWRSb3VuZCwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4NjdlY2ExYjggLy8gbWV0aG9kICJSb290UG9zdGVkKGJ5dGVbMzJdLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjcxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnJlZGVlbVdpdGhQcm9vZltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlZGVlbVdpdGhQcm9vZjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3NjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgY292ZXIgNQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgNwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciA1CiAgICBjb3ZlciA1CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3NzMKICAgIC8vIHRoaXMuYXNzZXJ0RXNjcm93R3JvdXBTaGFwZSgpOwogICAgY2FsbHN1YiBhc3NlcnRFc2Nyb3dHcm91cFNoYXBlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIGFzc2VydChwcm9vZi5sZW5ndGggPT09IDI1NiwgIkJBRF9QUk9PRl9MRU4iKTsKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGMgNiAvLyAyNTYKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX1BST09GX0xFTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Nzc1CiAgICAvLyBhc3NlcnQocHVibGljSW5wdXRzLmxlbmd0aCA9PT0gMTI4LCAiQkFEX1BVQl9MRU4iKTsKICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIGludGMgNCAvLyAxMjgKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX1BVQl9MRU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gcm9vdHMgPSBCb3hNYXA8Ynl0ZXMsIFJvb3RJbmZvPih7IGtleVByZWZpeDogInI6IiB9KTsKICAgIGJ5dGVjIDE4IC8vICJyOiIKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc3OQogICAgLy8gYXNzZXJ0KHJCb3guZXhpc3RzLCAiQkFEX1JPT1QiKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQkFEX1JPT1QKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc4MAogICAgLy8gY29uc3QgZGVub21pbmF0aW9uID0gckJveC52YWx1ZS5kZW5vbWluYXRpb247CiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGV4dHJhY3QgMCA4CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNvdmVyIDcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM3OAogICAgLy8gbnVsbGlmaWVycyA9IEJveE1hcDxieXRlcywgTnVsbGlmaWVyU3RhdGU+KHsga2V5UHJlZml4OiAibmI6IiB9KTsKICAgIHB1c2hieXRlcyAibmI6IgogICAgZGlnIDUKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Nzg0CiAgICAvLyBhc3NlcnQoIW5Cb3guZXhpc3RzLCAiRE9VQkxFX1NQRU5EIik7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIERPVUJMRV9TUEVORAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Nzg3CiAgICAvLyBjb25zdCBwdWJSb290ID0gcHVibGljSW5wdXRzLnNsaWNlKDAsIDMyKTsKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMiAvLyAzMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMzIKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gY29uc3QgcHViTnVsbGlmaWVyID0gcHVibGljSW5wdXRzLnNsaWNlKDMyLCA2NCk7CiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICBkaWcgNAogICAgPj0KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc4OQogICAgLy8gY29uc3QgcHViUmVjaXBpZW50ID0gcHVibGljSW5wdXRzLnNsaWNlKDY0LCA5Nik7CiAgICBwdXNoaW50IDk2IC8vIDk2CiAgICBkaWcgNQogICAgPj0KICAgIHB1c2hpbnQgOTYgLy8gOTYKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDYKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gY29uc3QgcHViRGVub20gPSBwdWJsaWNJbnB1dHMuc2xpY2UoOTYsIDEyOCk7CiAgICBpbnRjIDQgLy8gMTI4CiAgICBkaWcgNgogICAgPj0KICAgIGludGMgNCAvLyAxMjgKICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA2CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Nzk1CiAgICAvLyBhc3NlcnQocHViUm9vdC5lcXVhbHMocm9vdFJlZi5ieXRlcyksICJCQURfUk9PVCIpOwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDkKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX1JPT1QKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gYXNzZXJ0KHB1Yk51bGxpZmllci5lcXVhbHMobnVsbGlmaWVyLmJ5dGVzKSwgIkJBRF9OVUxMSUZJRVIiKTsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA3CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9OVUxMSUZJRVIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjc5OAogICAgLy8gY29uc3Qgc2VuZGVyQXNCaWc6IGJpZ3VpbnQgPSBCaWdVaW50KFR4bi5zZW5kZXIuYnl0ZXMpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Nzk5CiAgICAvLyBjb25zdCBleHBlY3RlZFJlY2lwaWVudEJpZzogYmlndWludCA9IHNlbmRlckFzQmlnICUgRlJfTU9EOwogICAgcHVzaGJ5dGVzIDB4MzA2NDRlNzJlMTMxYTAyOWI4NTA0NWI2ODE4MTU4NWQyODMzZTg0ODc5Yjk3MDkxNDNlMWY1OTNmMDAwMDAwMQogICAgYiUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgwMC04MDIKICAgIC8vIGNvbnN0IGV4cGVjdGVkUmVjaXBpZW50Qnl0ZXM6IGJ5dGVzID0gcGFkTGVmdDMyKAogICAgLy8gICBCeXRlcyhleHBlY3RlZFJlY2lwaWVudEJpZyksCiAgICAvLyApOwogICAgY2FsbHN1YiBwYWRMZWZ0MzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgwMwogICAgLy8gYXNzZXJ0KHB1YlJlY2lwaWVudC5lcXVhbHMoZXhwZWN0ZWRSZWNpcGllbnRCeXRlcyksICJCQURfUkVDSVBJRU5UIik7CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX1JFQ0lQSUVOVAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODA4CiAgICAvLyBjb25zdCBleHBlY3RlZERlbm9tQnl0ZXM6IGJ5dGVzID0gcGFkTGVmdDMyKEJ5dGVzKGRlbm9tQmlnKSk7CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgcGFkTGVmdDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4MDkKICAgIC8vIGFzc2VydChwdWJEZW5vbS5lcXVhbHMoZXhwZWN0ZWREZW5vbUJ5dGVzKSwgIkJBRF9ERU5PTSIpOwogICAgPT0KICAgIGFzc2VydCAvLyBCQURfREVOT00KICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE4NAogICAgLy8gZW5zdXJlQnVkZ2V0KDgwMDAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KTsKICAgIGludGMgMTAgLy8gODAwMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgxMwogICAgLy8gY29uc3Qgb2sgPSB2ZXJpZnlHcm90aDE2KHByb29mLCBwdWJsaWNJbnB1dHMpOwogICAgY292ZXIgMgogICAgY2FsbHN1YiB2ZXJpZnlHcm90aDE2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4MTQKICAgIC8vIGFzc2VydChvaywgIkJBRF9QUk9PRiIpOwogICAgYXNzZXJ0IC8vIEJBRF9QUk9PRgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODIwCiAgICAvLyBzcGVudFJvdW5kOiBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODE5LTgyMQogICAgLy8gbkJveC52YWx1ZSA9IG5ldyBOdWxsaWZpZXJTdGF0ZSh7CiAgICAvLyAgIHNwZW50Um91bmQ6IG5ldyBhcmM0LlVpbnQ2NChHbG9iYWwucm91bmQpLAogICAgLy8gfSk7CiAgICBib3hfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4MjQKICAgIC8vIGlmICh1c2VybmFtZS5sZW5ndGggPiAwKSB7CiAgICBsZW4KICAgIGR1cAogICAgYnogcmVkZWVtV2l0aFByb29mX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODI1CiAgICAvLyB0aGlzLnZhbGlkYXRlTmFtZUZvcm1hdCh1c2VybmFtZSk7CiAgICBkaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIHZhbGlkYXRlTmFtZUZvcm1hdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODI2CiAgICAvLyBjb25zdCBuYW1lS2V5ID0gb3Auc2hhMjU2KHVzZXJuYW1lKTsKICAgIHNoYTI1NgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBuYW1lcyA9IEJveE1hcDxieXRlcywgYXJjNC5BZGRyZXNzPih7IGtleVByZWZpeDogIm46IiB9KTsKICAgIGJ5dGVjIDkgLy8gIm46IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4MjgKICAgIC8vIGFzc2VydCghbmFtZXNCb3guZXhpc3RzLCAiVEFLRU4iKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gVEFLRU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgyOQogICAgLy8gbmFtZXNCb3gudmFsdWUgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgYm94X3B1dAoKcmVkZWVtV2l0aFByb29mX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgzMwogICAgLy8gY29uc3Qgd2FsbGV0S2V5ID0gVHhuLnNlbmRlci5ieXRlczsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB1c2VycyA9IEJveE1hcDxieXRlcywgVXNlclN0YXRlPih7IGtleVByZWZpeDogInc6IiB9KTsKICAgIGJ5dGVjXzAgLy8gInc6IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gZXhwaXJ5Um91bmQ6IG5ldyBhcmM0LlVpbnQ2NChHbG9iYWwucm91bmQgKyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUpLAogICAgZ2xvYmFsIFJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyByb3VuZHNQZXJZZWFyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInIiIH0pOwogICAgYnl0ZWMgNiAvLyAiciIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgzNwogICAgLy8gZXhwaXJ5Um91bmQ6IG5ldyBhcmM0LlVpbnQ2NChHbG9iYWwucm91bmQgKyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICsKICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjgzNS04MzgKICAgIC8vIGNvbnN0IG5ld0JhdGNoID0gbmV3IEJhdGNoKHsKICAgIC8vICAgYW1vdW50OiBkZW5vbWluYXRpb24sCiAgICAvLyAgIGV4cGlyeVJvdW5kOiBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kICsgdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlKSwKICAgIC8vIH0pOwogICAgZGlnIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODQwCiAgICAvLyBpZiAoY3MuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHJlZGVlbVdpdGhQcm9vZl9lbHNlX2JvZHlANwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODQxCiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcih3YWxsZXRLZXkpOwogICAgZGlnIDExCiAgICBjYWxsc3ViIGxvYWRVc2VyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NDIKICAgIC8vIGNvbnN0IHByZXZDb3VudDogdWludDY0ID0gcHJldi5iYXRjaENvdW50LmFzVWludDY0KCk7CiAgICBkdXAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg0MwogICAgLy8gYXNzZXJ0KHByZXZDb3VudCA8IHRoaXMubWF4QmF0Y2hlcy52YWx1ZSwgIlRPT19NQU5ZX0JBVENIRVMiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNjAKICAgIC8vIG1heEJhdGNoZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAibSIgfSk7CiAgICBieXRlYyAxMSAvLyAibSIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg0MwogICAgLy8gYXNzZXJ0KHByZXZDb3VudCA8IHRoaXMubWF4QmF0Y2hlcy52YWx1ZSwgIlRPT19NQU5ZX0JBVENIRVMiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gVE9PX01BTllfQkFUQ0hFUwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODQ0CiAgICAvLyBwcmV2LmJhdGNoZXMucHVzaChuZXdCYXRjaCk7CiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAyIC8vIDEwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBkaWcgMwogICAgaW50Y18wIC8vIDAKICAgIGRpZyA0CiAgICBleHRyYWN0MwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgdW5jb3ZlciA1CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDQKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAxMDIKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODQ1CiAgICAvLyBsZXQgbmV4dE5hbWUgPSBwcmV2LnVzZXJuYW1lOwogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYnVyeSAxMwogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODQ2CiAgICAvLyBpZiAodXNlcm5hbWUubGVuZ3RoID4gMCkgewogICAgZGlnIDEKICAgIGJ6IHJlZGVlbVdpdGhQcm9vZl9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gYXNzZXJ0KHByZXYudXNlcm5hbWUubGVuZ3RoID09PSAwLCAiVVNFUk5BTUVfU0VUIik7CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgIQogICAgYXNzZXJ0IC8vIFVTRVJOQU1FX1NFVAogICAgZGlnIDQKCnJlZGVlbVdpdGhQcm9vZl9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NTMKICAgIC8vIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KHByZXZDb3VudCArIDEpLAogICAgZGlnIDgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NTQKICAgIC8vIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIGRpZyAxMwogICAgZHVwCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgZGlnIDE0CiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODU1CiAgICAvLyBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICBkaWcgMgogICAgZXh0cmFjdCA2IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDM4IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NTcKICAgIC8vIHBxUHVia2V5SGFzaDogcHJldi5wcVB1YmtleUhhc2gsCiAgICBkaWcgNAogICAgZXh0cmFjdCA3MCAzMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODU4CiAgICAvLyBiaW86IHByZXYuYmlvLAogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODUwLTg1OQogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IG5leHROYW1lLAogICAgLy8gICBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChwcmV2Q291bnQgKyAxKSwKICAgIC8vICAgYmF0Y2hlczogcHJldi5iYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgdW5jb3ZlciA2CiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGxlbgogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICArCiAgICBieXRlY18zIC8vIDB4MDMwMDY4CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKCnJlZGVlbVdpdGhQcm9vZl9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NzYKICAgIC8vIGNvbnN0IGJhbGFuY2U6IHVpbnQ2NCA9IG9wLmJhbGFuY2UoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICBiYWxhbmNlCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg3NwogICAgLy8gaWYgKGJhbGFuY2UgPCBBQ0NPVU5UX01CUl9NSU4pIHsKICAgIGludGMgNSAvLyAxMDAwMDAKICAgIDwKICAgIGJ6IHJlZGVlbVdpdGhQcm9vZl9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NzgKICAgIC8vIGNvbnN0IHNlZWRBbW91bnQ6IHVpbnQ2NCA9IEFDQ09VTlRfTUJSX01JTiAtIGJhbGFuY2U7CiAgICBpbnRjIDUgLy8gMTAwMDAwCiAgICBkaWcgOQogICAgLQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODc5LTg4NQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBzZWVkQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODgxCiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NzktODg0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHNlZWRBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg4MwogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NzktODg1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHNlZWRBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKcmVkZWVtV2l0aFByb29mX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4OTMKICAgIC8vIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg4OS04OTUKICAgIC8vIG5ldyBSZWRlZW1lZFdpdGhQcm9vZih7CiAgICAvLyAgIHJvb3Q6IHJvb3RSZWYsCiAgICAvLyAgIG51bGxpZmllciwKICAgIC8vICAgZGVub21pbmF0aW9uLAogICAgLy8gICB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlcm5hbWUpLAogICAgLy8gfSksCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxOSAvLyAweDAwNmEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODg4LTg5NgogICAgLy8gZW1pdCgKICAgIC8vICAgbmV3IFJlZGVlbWVkV2l0aFByb29mKHsKICAgIC8vICAgICByb290OiByb290UmVmLAogICAgLy8gICAgIG51bGxpZmllciwKICAgIC8vICAgICBkZW5vbWluYXRpb24sCiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlcm5hbWUpLAogICAgLy8gICB9KSwKICAgIC8vICk7CiAgICBwdXNoYnl0ZXMgMHg1NTEwY2VkYiAvLyBtZXRob2QgIlJlZGVlbWVkV2l0aFByb29mKGJ5dGVbMzJdLGJ5dGVbMzJdLHVpbnQ2NCxhZGRyZXNzLGJ5dGVbXSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6NzY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVkZWVtV2l0aFByb29mX2Vsc2VfYm9keUA3OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODYxCiAgICAvLyBjb25zdCBiYXRjaGVzID0gbmV3IGFyYzQuRHluYW1pY0FycmF5PEJhdGNoPigpOwogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gYmF0Y2hlcy5wdXNoKG5ld0JhdGNoKTsKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnl0ZWMgMTQgLy8gMHgwMDAxCiAgICByZXBsYWNlMiAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NjgKICAgIC8vIGVuY3J5cHRpb25QdWJrZXk6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihvcC5iemVybygzMikpLAogICAgaW50Y18yIC8vIDMyCiAgICBiemVybwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODYzLTg3MgogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VybmFtZSksCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KDEpLAogICAgLy8gICBiYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4ob3AuYnplcm8oMzIpKSwKICAgIC8vICAgc2NhblB1YmtleTogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyB9KTsKICAgIHB1c2hpbnQgMTA0IC8vIDEwNAogICAgZGlnIDYKICAgICsKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjIDIwIC8vIDB4MDMwMDY4MDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo4NzEKICAgIC8vIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6ODYzLTg3MgogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VybmFtZSksCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KDEpLAogICAgLy8gICBiYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4ob3AuYnplcm8oMzIpKSwKICAgIC8vICAgc2NhblB1YmtleTogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyB9KTsKICAgIGNvbmNhdAogICAgZGlnIDEzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgYiByZWRlZW1XaXRoUHJvb2ZfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5yZWRlZW1bcm91dGluZ10oKSAtPiB2b2lkOgpyZWRlZW06CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAzCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTExCiAgICAvLyB0aGlzLmFzc2VydEVzY3Jvd0dyb3VwU2hhcGUoKTsKICAgIGNhbGxzdWIgYXNzZXJ0RXNjcm93R3JvdXBTaGFwZQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTEyCiAgICAvLyBhc3NlcnQocHJlaW1hZ2UubGVuZ3RoID09PSBQUkVJTUFHRV9MRU4sICJCQURfUFJFSU1BR0UiKTsKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9QUkVJTUFHRQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTE1CiAgICAvLyBjb25zdCBjb21taXRtZW50SGFzaCA9IG9wLnNoYTI1NihwcmVpbWFnZSk7CiAgICBzaGEyNTYKICAgIGR1cAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBjb21taXRtZW50cyA9IEJveE1hcDxieXRlcywgQ29tbWl0bWVudD4oeyBrZXlQcmVmaXg6ICJjOiIgfSk7CiAgICBieXRlYyA1IC8vICJjOiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5MTcKICAgIC8vIGFzc2VydChjQm94LmV4aXN0cywgIkJBRF9DT0RFIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCQURfQ09ERQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTIwCiAgICAvLyBjb25zdCBzb2xkOiB1aW50NjQgPSBjQm94LnZhbHVlLnNvbGRBdFJvdW5kLmFzVWludDY0KCk7CiAgICBib3hfZ2V0CiAgICBwb3AKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gaWYgKHNvbGQgPiAwKSB7CiAgICBieiByZWRlZW1fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5MjIKICAgIC8vIGFzc2VydChHbG9iYWwucm91bmQgPD0gc29sZCArIHRoaXMucm91bmRzUGVyWWVhci52YWx1ZSwgIkNPREVfRVhQSVJFRCIpOwogICAgZ2xvYmFsIFJvdW5kCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyByb3VuZHNQZXJZZWFyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogInIiIH0pOwogICAgYnl0ZWMgNiAvLyAiciIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjkyMgogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBzb2xkICsgdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlLCAiQ09ERV9FWFBJUkVEIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDIKICAgICsKICAgIDw9CiAgICBhc3NlcnQgLy8gQ09ERV9FWFBJUkVECgpyZWRlZW1fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTI0CiAgICAvLyBjb25zdCBkZW5vbWluYXRpb24gPSBjQm94LnZhbHVlLmRlbm9taW5hdGlvbjsKICAgIGRpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBleHRyYWN0IDAgOAogICAgYnVyeSAxNAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTI1CiAgICAvLyBjQm94LmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5MjkKICAgIC8vIGlmICh1c2VybmFtZS5sZW5ndGggPiAwKSB7CiAgICBkaWcgMwogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgOAogICAgYnogcmVkZWVtX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTMwCiAgICAvLyB0aGlzLnZhbGlkYXRlTmFtZUZvcm1hdCh1c2VybmFtZSk7CiAgICBkaWcgMwogICAgZHVwCiAgICBjYWxsc3ViIHZhbGlkYXRlTmFtZUZvcm1hdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTMxCiAgICAvLyBjb25zdCBuYW1lS2V5ID0gb3Auc2hhMjU2KHVzZXJuYW1lKTsKICAgIHNoYTI1NgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBuYW1lcyA9IEJveE1hcDxieXRlcywgYXJjNC5BZGRyZXNzPih7IGtleVByZWZpeDogIm46IiB9KTsKICAgIGJ5dGVjIDkgLy8gIm46IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5MzMKICAgIC8vIGFzc2VydCghbkJveC5leGlzdHMsICJUQUtFTiIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBUQUtFTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBuQm94LnZhbHVlID0gbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIGJveF9wdXQKCnJlZGVlbV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5MzgKICAgIC8vIGNvbnN0IHdhbGxldEtleSA9IFR4bi5zZW5kZXIuYnl0ZXM7CiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gdXNlcnMgPSBCb3hNYXA8Ynl0ZXMsIFVzZXJTdGF0ZT4oeyBrZXlQcmVmaXg6ICJ3OiIgfSk7CiAgICBieXRlY18wIC8vICJ3OiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDIKICAgIC8vIGV4cGlyeVJvdW5kOiBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kICsgdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcm91bmRzUGVyWWVhciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJyIiB9KTsKICAgIGJ5dGVjIDYgLy8gInIiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDIKICAgIC8vIGV4cGlyeVJvdW5kOiBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kICsgdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICArCiAgICBpdG9iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDAtOTQzCiAgICAvLyBjb25zdCBuZXdCYXRjaCA9IG5ldyBCYXRjaCh7CiAgICAvLyAgIGFtb3VudDogZGVub21pbmF0aW9uLAogICAgLy8gICBleHBpcnlSb3VuZDogbmV3IGFyYzQuVWludDY0KEdsb2JhbC5yb3VuZCArIHRoaXMucm91bmRzUGVyWWVhci52YWx1ZSksCiAgICAvLyB9KTsKICAgIGRpZyAxNAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDUKICAgIC8vIGlmIChjcy5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogcmVkZWVtX2Vsc2VfYm9keUA5CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDYKICAgIC8vIGNvbnN0IHByZXYgPSB0aGlzLmxvYWRVc2VyKHdhbGxldEtleSk7CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgbG9hZFVzZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk0NwogICAgLy8gY29uc3QgcHJldkNvdW50OiB1aW50NjQgPSBwcmV2LmJhdGNoQ291bnQuYXNVaW50NjQoKTsKICAgIGR1cAogICAgcHVzaGludCAzIC8vIDMKICAgIGdldGJ5dGUKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTQ4CiAgICAvLyBhc3NlcnQocHJldkNvdW50IDwgdGhpcy5tYXhCYXRjaGVzLnZhbHVlLCAiVE9PX01BTllfQkFUQ0hFUyIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2MAogICAgLy8gbWF4QmF0Y2hlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJtIiB9KTsKICAgIGJ5dGVjIDExIC8vICJtIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTQ4CiAgICAvLyBhc3NlcnQocHJldkNvdW50IDwgdGhpcy5tYXhCYXRjaGVzLnZhbHVlLCAiVE9PX01BTllfQkFUQ0hFUyIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDwKICAgIGFzc2VydCAvLyBUT09fTUFOWV9CQVRDSEVTCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NDkKICAgIC8vIHByZXYuYmF0Y2hlcy5wdXNoKG5ld0JhdGNoKTsKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDQKICAgIGV4dHJhY3QzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICB1bmNvdmVyIDUKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIHVuY292ZXIgNAogICAgLQogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDEwMgogICAgZHVwCiAgICBidXJ5IDEzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NTMKICAgIC8vIGxldCBuZXh0TmFtZSA9IHByZXYudXNlcm5hbWU7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBidXJ5IDEzCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NTQKICAgIC8vIGlmICh1c2VybmFtZS5sZW5ndGggPiAwKSB7CiAgICBkaWcgNwogICAgYnogcmVkZWVtX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTU1CiAgICAvLyBhc3NlcnQocHJldi51c2VybmFtZS5sZW5ndGggPT09IDAsICJVU0VSTkFNRV9TRVQiKTsKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAhCiAgICBhc3NlcnQgLy8gVVNFUk5BTUVfU0VUCiAgICBkaWcgNQoKcmVkZWVtX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk2MQogICAgLy8gYmF0Y2hDb3VudDogbmV3IGFyYzQuVWludDgocHJldkNvdW50ICsgMSksCiAgICBkaWcgOAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk2MgogICAgLy8gYmF0Y2hlczogcHJldi5iYXRjaGVzLAogICAgZGlnIDEzCiAgICBkdXAKICAgIHB1c2hpbnQgMTAyIC8vIDEwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBkaWcgMTQKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NjMKICAgIC8vIGVuY3J5cHRpb25QdWJrZXk6IHByZXYuZW5jcnlwdGlvblB1YmtleSwKICAgIGRpZyAyCiAgICBleHRyYWN0IDYgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk2NAogICAgLy8gc2NhblB1YmtleTogcHJldi5zY2FuUHVia2V5LAogICAgZGlnIDMKICAgIGV4dHJhY3QgMzggMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk2NQogICAgLy8gcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIGRpZyA0CiAgICBleHRyYWN0IDcwIDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NjYKICAgIC8vIGJpbzogcHJldi5iaW8sCiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDYKICAgIHVuY292ZXIgNgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NTgtOTY3CiAgICAvLyBjcy52YWx1ZSA9IG5ldyBVc2VyU3RhdGUoewogICAgLy8gICB2ZXJzaW9uOiBuZXcgYXJjNC5VaW50OChVU0VSX1NUQVRFX1ZFUlNJT04pLAogICAgLy8gICB1c2VybmFtZTogbmV4dE5hbWUsCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KHByZXZDb3VudCArIDEpLAogICAgLy8gICBiYXRjaGVzOiBwcmV2LmJhdGNoZXMsCiAgICAvLyAgIGVuY3J5cHRpb25QdWJrZXk6IHByZXYuZW5jcnlwdGlvblB1YmtleSwKICAgIC8vICAgc2NhblB1YmtleTogcHJldi5zY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleUhhc2g6IHByZXYucHFQdWJrZXlIYXNoLAogICAgLy8gICBiaW86IHByZXYuYmlvLAogICAgLy8gfSk7CiAgICB1bmNvdmVyIDYKICAgIGR1cAogICAgY292ZXIgNgogICAgbGVuCiAgICBwdXNoaW50IDEwNCAvLyAxMDQKICAgICsKICAgIGJ5dGVjXzMgLy8gMHgwMzAwNjgKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDE0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAoKcmVkZWVtX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5ODQKICAgIC8vIGNvbnN0IGJhbGFuY2U6IHVpbnQ2NCA9IG9wLmJhbGFuY2UoVHhuLnNlbmRlcik7CiAgICB0eG4gU2VuZGVyCiAgICBiYWxhbmNlCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk4NQogICAgLy8gaWYgKGJhbGFuY2UgPCBBQ0NPVU5UX01CUl9NSU4pIHsKICAgIGludGMgNSAvLyAxMDAwMDAKICAgIDwKICAgIGJ6IHJlZGVlbV9hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5ODYKICAgIC8vIGNvbnN0IHNlZWRBbW91bnQ6IHVpbnQ2NCA9IEFDQ09VTlRfTUJSX01JTiAtIGJhbGFuY2U7CiAgICBpbnRjIDUgLy8gMTAwMDAwCiAgICBkaWcgOQogICAgLQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTg3LTk5MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBzZWVkQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTg5CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5ODctOTkyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHNlZWRBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk5MQogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5ODctOTkzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IHNlZWRBbW91bnQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKcmVkZWVtX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDAwCiAgICAvLyB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5OTctMTAwMgogICAgLy8gbmV3IFJlZGVlbWVkKHsKICAgIC8vICAgY29tbWl0bWVudDogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KGNvbW1pdG1lbnRIYXNoKSwKICAgIC8vICAgZGVub21pbmF0aW9uLAogICAgLy8gICB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlcm5hbWUpLAogICAgLy8gfSksCiAgICBkaWcgMwogICAgZGlnIDE0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTcgLy8gMHgwMDRhCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk5Ni0xMDAzCiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgUmVkZWVtZWQoewogICAgLy8gICAgIGNvbW1pdG1lbnQ6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihjb21taXRtZW50SGFzaCksCiAgICAvLyAgICAgZGVub21pbmF0aW9uLAogICAgLy8gICAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHVzZXJuYW1lKSwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgYnl0ZWMgMjEgLy8gbWV0aG9kICJSZWRlZW1lZChieXRlWzMyXSx1aW50NjQsYWRkcmVzcyxieXRlW10pIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjkwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJlZGVlbV9lbHNlX2JvZHlAOToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk2OQogICAgLy8gY29uc3QgYmF0Y2hlcyA9IG5ldyBhcmM0LkR5bmFtaWNBcnJheTxCYXRjaD4oKTsKICAgIGJ5dGVjXzEgLy8gMHgwMDAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czo5NzAKICAgIC8vIGJhdGNoZXMucHVzaChuZXdCYXRjaCk7CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMQogICAgcmVwbGFjZTIgMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTc2CiAgICAvLyBlbmNyeXB0aW9uUHVia2V5OiBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4ob3AuYnplcm8oMzIpKSwKICAgIGludGNfMiAvLyAzMgogICAgYnplcm8KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk3MS05ODAKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlcm5hbWUpLAogICAgLy8gICBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OCgxKSwKICAgIC8vICAgYmF0Y2hlcywKICAgIC8vICAgZW5jcnlwdGlvblB1YmtleTogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIHNjYW5QdWJrZXk6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihvcC5iemVybygzMikpLAogICAgLy8gICBwcVB1YmtleUhhc2g6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihvcC5iemVybygzMikpLAogICAgLy8gICBiaW86IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gfSk7CiAgICBwdXNoaW50IDEwNCAvLyAxMDQKICAgIGRpZyA3CiAgICArCiAgICBkdXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlYyAyMCAvLyAweDAzMDA2ODAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OTc5CiAgICAvLyBiaW86IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjk3MS05ODAKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXModXNlcm5hbWUpLAogICAgLy8gICBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OCgxKSwKICAgIC8vICAgYmF0Y2hlcywKICAgIC8vICAgZW5jcnlwdGlvblB1YmtleTogbmV3IGFyYzQuU3RhdGljQnl0ZXM8MzI+KG9wLmJ6ZXJvKDMyKSksCiAgICAvLyAgIHNjYW5QdWJrZXk6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihvcC5iemVybygzMikpLAogICAgLy8gICBwcVB1YmtleUhhc2g6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihvcC5iemVybygzMikpLAogICAgLy8gICBiaW86IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gfSk7CiAgICBjb25jYXQKICAgIGRpZyAxNAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgcmVkZWVtX2FmdGVyX2lmX2Vsc2VAMTAKCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnNlbmRNZXNzYWdlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2VuZE1lc3NhZ2U6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwMTcKICAgIC8vIHRoaXMuYXNzZXJ0RXNjcm93R3JvdXBTaGFwZSgpOwogICAgY2FsbHN1YiBhc3NlcnRFc2Nyb3dHcm91cFNoYXBlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDIwCiAgICAvLyB0aGlzLnNwZW5kT25lQ3JlZGl0KFR4bi5zZW5kZXIuYnl0ZXMpOwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBzcGVuZE9uZUNyZWRpdAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDIyCiAgICAvLyBsb2coY2lwaGVydGV4dCk7CiAgICBsb2cKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5jbGFpbVVzZXJuYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1Vc2VybmFtZToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgZHVwCiAgICBjb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTcwCiAgICAvLyB0aGlzLmFzc2VydEVzY3Jvd0dyb3VwU2hhcGUoKTsKICAgIGNhbGxzdWIgYXNzZXJ0RXNjcm93R3JvdXBTaGFwZQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE3NAogICAgLy8gZW5zdXJlQnVkZ2V0KDI0MDAsIE9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpOwogICAgaW50YyA3IC8vIDI0MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNzUKICAgIC8vIHRoaXMudmFsaWRhdGVOYW1lRm9ybWF0KHVzZXJuYW1lKTsKICAgIGR1cAogICAgY2FsbHN1YiB2YWxpZGF0ZU5hbWVGb3JtYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNzgKICAgIC8vIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuc3BlbmRPbmVDcmVkaXQoVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIHNwZW5kT25lQ3JlZGl0CiAgICBzd2FwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTgwCiAgICAvLyBjb25zdCB3YWxsZXRLZXkgPSBUeG4uc2VuZGVyLmJ5dGVzOwogICAgdHhuIFNlbmRlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB1c2VycyA9IEJveE1hcDxieXRlcywgVXNlclN0YXRlPih7IGtleVByZWZpeDogInc6IiB9KTsKICAgIGJ5dGVjXzAgLy8gInc6IgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgY292ZXIgMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE4MwogICAgLy8gY29uc3QgbmV3S2V5ID0gb3Auc2hhMjU2KHVzZXJuYW1lKTsKICAgIHN3YXAKICAgIHNoYTI1NgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBuYW1lcyA9IEJveE1hcDxieXRlcywgYXJjNC5BZGRyZXNzPih7IGtleVByZWZpeDogIm46IiB9KTsKICAgIGJ5dGVjIDkgLy8gIm46IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExODUKICAgIC8vIGFzc2VydCghbmV3Qm94LmV4aXN0cywgIlRBS0VOIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBUQUtFTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE4OAogICAgLy8gY29uc3QgcHJldiA9IHRoaXMubG9hZFVzZXIod2FsbGV0S2V5KTsKICAgIGNhbGxzdWIgbG9hZFVzZXIKICAgIGR1cG4gMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE5MAogICAgLy8gY29uc3Qgb2xkTmFtZSA9IHByZXYudXNlcm5hbWU7CiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMwogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTkxCiAgICAvLyBpZiAocHJldi51c2VybmFtZS5sZW5ndGggPiAwKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnogY2xhaW1Vc2VybmFtZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExOTIKICAgIC8vIGNvbnN0IG9sZEtleSA9IG9wLnNoYTI1NihwcmV2LnVzZXJuYW1lLm5hdGl2ZSk7CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzaGEyNTYKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM4NQogICAgLy8gbmFtZXMgPSBCb3hNYXA8Ynl0ZXMsIGFyYzQuQWRkcmVzcz4oeyBrZXlQcmVmaXg6ICJuOiIgfSk7CiAgICBieXRlYyA5IC8vICJuOiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE5NAogICAgLy8gYXNzZXJ0KG9sZEJveC5leGlzdHMsICJCQURfU1RBVEUiKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQkFEX1NUQVRFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTk2CiAgICAvLyBhc3NlcnQob2xkQm94LnZhbHVlLmJ5dGVzID09PSBUeG4uc2VuZGVyLmJ5dGVzLCAiTk9UX09XTkVSIik7CiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBOT1RfT1dORVIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExOTcKICAgIC8vIG9sZEJveC5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAoKY2xhaW1Vc2VybmFtZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjAwCiAgICAvLyBuZXdCb3gudmFsdWUgPSBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgZGlnIDMKICAgIHR4biBTZW5kZXIKICAgIGJveF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMDQKICAgIC8vIGJhdGNoQ291bnQ6IHByZXYuYmF0Y2hDb3VudCwKICAgIGRpZyAyCiAgICBkdXAKICAgIGV4dHJhY3QgMyAxCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjA1CiAgICAvLyBiYXRjaGVzOiBwcmV2LmJhdGNoZXMsCiAgICBkaWcgMQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIGRpZyA1CiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIwNgogICAgLy8gZW5jcnlwdGlvblB1YmtleTogcHJldi5lbmNyeXB0aW9uUHVia2V5LAogICAgZGlnIDMKICAgIGV4dHJhY3QgNiAzMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIwNwogICAgLy8gc2NhblB1YmtleTogcHJldi5zY2FuUHVia2V5LAogICAgZGlnIDQKICAgIGV4dHJhY3QgMzggMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMDgKICAgIC8vIHBxUHVia2V5SGFzaDogcHJldi5wcVB1YmtleUhhc2gsCiAgICBkaWcgNQogICAgZXh0cmFjdCA3MCAzMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIwOQogICAgLy8gYmlvOiBwcmV2LmJpbywKICAgIGRpZyA2CiAgICBsZW4KICAgIHVuY292ZXIgNwogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMDEtMTIxMAogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VybmFtZSksCiAgICAvLyAgIGJhdGNoQ291bnQ6IHByZXYuYmF0Y2hDb3VudCwKICAgIC8vICAgYmF0Y2hlczogcHJldi5iYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICBkaWcgMTMKICAgICsKICAgIGJ5dGVjXzMgLy8gMHgwMzAwNjgKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgMTAKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMTQKICAgIC8vIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMTMtMTIxNwogICAgLy8gbmV3IFVzZXJuYW1lQ2xhaW1lZCh7CiAgICAvLyAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgb2xkTmFtZSwKICAgIC8vICAgbmV3TmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHVzZXJuYW1lKSwKICAgIC8vIH0pLAogICAgcHVzaGJ5dGVzIDB4MDAyNAogICAgY29uY2F0CiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjEyLTEyMTgKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBVc2VybmFtZUNsYWltZWQoewogICAgLy8gICAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICBvbGROYW1lLAogICAgLy8gICAgIG5ld05hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcyh1c2VybmFtZSksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDllMzBiYTI1IC8vIG1ldGhvZCAiVXNlcm5hbWVDbGFpbWVkKGFkZHJlc3MsYnl0ZVtdLGJ5dGVbXSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIxOQogICAgLy8gdGhpcy5lbWl0Q3JlZGl0U3BlbnQocmVtYWluaW5nKTsKICAgIGRpZyA1CiAgICBjYWxsc3ViIGVtaXRDcmVkaXRTcGVudAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE2OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnJlbGVhc2VVc2VybmFtZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlbGVhc2VVc2VybmFtZToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMjgKICAgIC8vIHRoaXMuYXNzZXJ0RXNjcm93R3JvdXBTaGFwZSgpOwogICAgY2FsbHN1YiBhc3NlcnRFc2Nyb3dHcm91cFNoYXBlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjMxCiAgICAvLyBlbnN1cmVCdWRnZXQoMjQwMCwgT3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCk7CiAgICBpbnRjIDcgLy8gMjQwMAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIzMgogICAgLy8gY29uc3QgcmVtYWluaW5nID0gdGhpcy5zcGVuZE9uZUNyZWRpdChUeG4uc2VuZGVyLmJ5dGVzKTsKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgc3BlbmRPbmVDcmVkaXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMzQKICAgIC8vIGNvbnN0IHdhbGxldEtleSA9IFR4bi5zZW5kZXIuYnl0ZXM7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgYnl0ZWNfMCAvLyAidzoiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjM4CiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcih3YWxsZXRLZXkpOwogICAgc3dhcAogICAgY2FsbHN1YiBsb2FkVXNlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTIzOQogICAgLy8gYXNzZXJ0KHByZXYudXNlcm5hbWUubGVuZ3RoID4gMCwgIk5PX1VTRVJOQU1FIik7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGFzc2VydCAvLyBOT19VU0VSTkFNRQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI0MQogICAgLy8gY29uc3Qgb2xkS2V5ID0gb3Auc2hhMjU2KHByZXYudXNlcm5hbWUubmF0aXZlKTsKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHNoYTI1NgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBuYW1lcyA9IEJveE1hcDxieXRlcywgYXJjNC5BZGRyZXNzPih7IGtleVByZWZpeDogIm46IiB9KTsKICAgIGJ5dGVjIDkgLy8gIm46IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjQzCiAgICAvLyBhc3NlcnQob2xkQm94LmV4aXN0cywgIkJBRF9TVEFURSIpOwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCQURfU1RBVEUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNDQKICAgIC8vIGFzc2VydChvbGRCb3gudmFsdWUuYnl0ZXMgPT09IFR4bi5zZW5kZXIuYnl0ZXMsICJOT1RfT1dORVIiKTsKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9PV05FUgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI0NQogICAgLy8gb2xkQm94LmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjUyCiAgICAvLyBiYXRjaENvdW50OiBwcmV2LmJhdGNoQ291bnQsCiAgICBkaWcgMgogICAgZXh0cmFjdCAzIDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNTMKICAgIC8vIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIGRpZyAzCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI1NAogICAgLy8gZW5jcnlwdGlvblB1YmtleTogcHJldi5lbmNyeXB0aW9uUHVia2V5LAogICAgZGlnIDQKICAgIGV4dHJhY3QgNiAzMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI1NQogICAgLy8gc2NhblB1YmtleTogcHJldi5zY2FuUHVia2V5LAogICAgZGlnIDUKICAgIGV4dHJhY3QgMzggMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNTYKICAgIC8vIHBxUHVia2V5SGFzaDogcHJldi5wcVB1YmtleUhhc2gsCiAgICBkaWcgNgogICAgZXh0cmFjdCA3MCAzMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI1NwogICAgLy8gYmlvOiBwcmV2LmJpbywKICAgIGRpZyA3CiAgICBsZW4KICAgIHVuY292ZXIgOAogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNDktMTI1OAogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gICBiYXRjaENvdW50OiBwcmV2LmJhdGNoQ291bnQsCiAgICAvLyAgIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIC8vICAgZW5jcnlwdGlvblB1YmtleTogcHJldi5lbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5OiBwcmV2LnNjYW5QdWJrZXksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogcHJldi5wcVB1YmtleUhhc2gsCiAgICAvLyAgIGJpbzogcHJldi5iaW8sCiAgICAvLyB9KTsKICAgIGJ5dGVjXzMgLy8gMHgwMzAwNjgKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICBieXRlYyAxOSAvLyAweDAwNmEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjUxCiAgICAvLyB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI0OS0xMjU4CiAgICAvLyBjcy52YWx1ZSA9IG5ldyBVc2VyU3RhdGUoewogICAgLy8gICB2ZXJzaW9uOiBuZXcgYXJjNC5VaW50OChVU0VSX1NUQVRFX1ZFUlNJT04pLAogICAgLy8gICB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyAgIGJhdGNoQ291bnQ6IHByZXYuYmF0Y2hDb3VudCwKICAgIC8vICAgYmF0Y2hlczogcHJldi5iYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNjIKICAgIC8vIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyNjEtMTI2NAogICAgLy8gbmV3IFVzZXJuYW1lUmVsZWFzZWQoewogICAgLy8gICB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgIG5hbWU6IHJlbGVhc2VkTmFtZSwKICAgIC8vIH0pLAogICAgYnl0ZWMgMjIgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI2MC0xMjY1CiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgVXNlcm5hbWVSZWxlYXNlZCh7CiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIG5hbWU6IHJlbGVhc2VkTmFtZSwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4YWFiNWYzMGUgLy8gbWV0aG9kICJVc2VybmFtZVJlbGVhc2VkKGFkZHJlc3MsYnl0ZVtdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjY2CiAgICAvLyB0aGlzLmVtaXRDcmVkaXRTcGVudChyZW1haW5pbmcpOwogICAgY2FsbHN1YiBlbWl0Q3JlZGl0U3BlbnQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5zZXRCaW9bcm91dGluZ10oKSAtPiB2b2lkOgpzZXRCaW86CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTI4MQogICAgLy8gdGhpcy5hc3NlcnRFc2Nyb3dHcm91cFNoYXBlKCk7CiAgICBjYWxsc3ViIGFzc2VydEVzY3Jvd0dyb3VwU2hhcGUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyODQKICAgIC8vIGVuc3VyZUJ1ZGdldCgyNDAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KTsKICAgIGludGMgNyAvLyAyNDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjg1CiAgICAvLyBhc3NlcnQoYmlvLmxlbmd0aCA8PSBCSU9fTUFYLCAiQklPX1RPT19MT05HIik7CiAgICBsZW4KICAgIHB1c2hpbnQgMTYwIC8vIDE2MAogICAgPD0KICAgIGFzc2VydCAvLyBCSU9fVE9PX0xPTkcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyODgKICAgIC8vIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuc3BlbmRPbmVDcmVkaXQoVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIHNwZW5kT25lQ3JlZGl0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgYnl0ZWNfMCAvLyAidzoiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjkxCiAgICAvLyBjb25zdCBjcyA9IHRoaXMudXNlcnMoVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjkyCiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcihUeG4uc2VuZGVyLmJ5dGVzKTsKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgbG9hZFVzZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyOTUKICAgIC8vIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjk2CiAgICAvLyBiYXRjaENvdW50OiBwcmV2LmJhdGNoQ291bnQsCiAgICBkaWcgMgogICAgZXh0cmFjdCAzIDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyOTcKICAgIC8vIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIGRpZyAzCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyOTgKICAgIC8vIGVuY3J5cHRpb25QdWJrZXk6IHByZXYuZW5jcnlwdGlvblB1YmtleSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDYgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEyOTkKICAgIC8vIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIGRpZyA0CiAgICBleHRyYWN0IDM4IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzAwCiAgICAvLyBwcVB1YmtleUhhc2g6IHByZXYucHFQdWJrZXlIYXNoLAogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDcwIDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjkzLTEzMDIKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgLy8gICBiYXRjaENvdW50OiBwcmV2LmJhdGNoQ291bnQsCiAgICAvLyAgIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIC8vICAgZW5jcnlwdGlvblB1YmtleTogcHJldi5lbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5OiBwcmV2LnNjYW5QdWJrZXksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogcHJldi5wcVB1YmtleUhhc2gsCiAgICAvLyAgIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKGJpbyksCiAgICAvLyB9KTsKICAgIGRpZyA1CiAgICBsZW4KICAgIHB1c2hpbnQgMTA0IC8vIDEwNAogICAgKwogICAgYnl0ZWNfMyAvLyAweDAzMDA2OAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgNQogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMDYKICAgIC8vIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMDUtMTMwOAogICAgLy8gbmV3IEJpb0NoYW5nZWQoewogICAgLy8gICB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICAvLyAgIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKGJpbyksCiAgICAvLyB9KSwKICAgIGJ5dGVjIDIyIC8vIDB4MDAyMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMwNC0xMzA5CiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgQmlvQ2hhbmdlZCh7CiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKGJpbyksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDk3MzEwNjYzIC8vIG1ldGhvZCAiQmlvQ2hhbmdlZChhZGRyZXNzLGJ5dGVbXSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMxMAogICAgLy8gdGhpcy5lbWl0Q3JlZGl0U3BlbnQocmVtYWluaW5nKTsKICAgIGNhbGxzdWIgZW1pdENyZWRpdFNwZW50CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMjc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQucmVzb2x2ZVVzZXJuYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVzb2x2ZVVzZXJuYW1lOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzE2CiAgICAvLyBjb25zdCBrZXkgPSBvcC5zaGEyNTYodXNlcm5hbWUpOwogICAgc2hhMjU2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODUKICAgIC8vIG5hbWVzID0gQm94TWFwPGJ5dGVzLCBhcmM0LkFkZHJlc3M+KHsga2V5UHJlZml4OiAibjoiIH0pOwogICAgYnl0ZWMgOSAvLyAibjoiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMTgKICAgIC8vIGFzc2VydChib3guZXhpc3RzLCAiTk9UX0ZPVU5EIik7CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE5PVF9GT1VORAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMxOQogICAgLy8gcmV0dXJuIGJveC52YWx1ZTsKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnBydW5lRXhwaXJlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnBydW5lRXhwaXJlZDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgYnl0ZWNfMCAvLyAidzoiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNTMKICAgIC8vIGFzc2VydChjcy5leGlzdHMsICJOT19DUkVESVRTIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBOT19DUkVESVRTCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzU1CiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcih3YWxsZXRLZXkpOwogICAgY2FsbHN1YiBsb2FkVXNlcgogICAgZHVwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzU2CiAgICAvLyBjb25zdCBjdXJyZW50Um91bmQ6IHVpbnQ2NCA9IEdsb2JhbC5yb3VuZDsKICAgIGdsb2JhbCBSb3VuZAogICAgc3dhcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM1NwogICAgLy8gY29uc3QgcHJldkNvdW50OiB1aW50NjQgPSBwcmV2LmJhdGNoQ291bnQuYXNVaW50NjQoKTsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBnZXRieXRlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzU5CiAgICAvLyBjb25zdCBrZXB0ID0gbmV3IGFyYzQuRHluYW1pY0FycmF5PEJhdGNoPigpOwogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNjAKICAgIC8vIGxldCBrZXB0Q291bnQ6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM2MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByZXZDb3VudDsgaSsrKSB7CiAgICBkdXAKCnBydW5lRXhwaXJlZF93aGlsZV90b3BAMjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNjEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwcmV2Q291bnQ7IGkrKykgewogICAgZHVwCiAgICBkaWcgNAogICAgPAogICAgYnogcHJ1bmVFeHBpcmVkX2FmdGVyX3doaWxlQDcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNjIKICAgIC8vIGNvbnN0IGIgPSBjbG9uZShwcmV2LmJhdGNoZXNbaV0pOwogICAgZGlnIDUKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICAqCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzYyLTEzNjMKICAgIC8vIGNvbnN0IGIgPSBjbG9uZShwcmV2LmJhdGNoZXNbaV0pOwogICAgLy8gY29uc3QgZXhwaXJ5OiB1aW50NjQgPSBiLmV4cGlyeVJvdW5kLmFzVWludDY0KCk7CiAgICBwdXNoaW50IDggLy8gOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM2MwogICAgLy8gY29uc3QgZXhwaXJ5OiB1aW50NjQgPSBiLmV4cGlyeVJvdW5kLmFzVWludDY0KCk7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM2NAogICAgLy8gaWYgKGV4cGlyeSA8PSBjdXJyZW50Um91bmQpIGNvbnRpbnVlOwogICAgZGlnIDUKICAgIDw9CiAgICBibnogcHJ1bmVFeHBpcmVkX2Jsb2NrQDYKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNjUKICAgIC8vIGtlcHQucHVzaChiKTsKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyA5CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNjYKICAgIC8vIGtlcHRDb3VudCA9IGtlcHRDb3VudCArIDE7CiAgICBkaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgoKcHJ1bmVFeHBpcmVkX2Jsb2NrQDY6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzYxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHJldkNvdW50OyBpKyspIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBwcnVuZUV4cGlyZWRfd2hpbGVfdG9wQDIKCnBydW5lRXhwaXJlZF9hZnRlcl93aGlsZUA3OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM3MQogICAgLy8gdXNlcm5hbWU6IHByZXYudXNlcm5hbWUsCiAgICBkaWcgNQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzcyCiAgICAvLyBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChrZXB0Q291bnQpLAogICAgZGlnIDMKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNzQKICAgIC8vIGVuY3J5cHRpb25QdWJrZXk6IHByZXYuZW5jcnlwdGlvblB1YmtleSwKICAgIGRpZyAyCiAgICBleHRyYWN0IDYgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNzUKICAgIC8vIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDM4IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzc2CiAgICAvLyBwcVB1YmtleUhhc2g6IHByZXYucHFQdWJrZXlIYXNoLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNzAgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzNzcKICAgIC8vIGJpbzogcHJldi5iaW8sCiAgICBkaWcgNQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDYKICAgIGxlbgogICAgdW5jb3ZlciA3CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzY5LTEzNzgKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgLy8gICBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChrZXB0Q291bnQpLAogICAgLy8gICBiYXRjaGVzOiBrZXB0LAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICArCiAgICBieXRlY18zIC8vIDB4MDMwMDY4CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLmdldENyZWRpdHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRDcmVkaXRzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gdXNlcnMgPSBCb3hNYXA8Ynl0ZXMsIFVzZXJTdGF0ZT4oeyBrZXlQcmVmaXg6ICJ3OiIgfSk7CiAgICBieXRlY18wIC8vICJ3OiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM4OQogICAgLy8gaWYgKCFjcy5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldENyZWRpdHNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzkwCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuVWludDY0KDApOwogICAgYnl0ZWMgMTYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCgpnZXRDcmVkaXRzX2FmdGVyX2lubGluZWRfc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5nZXRDcmVkaXRzQDEwOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldENyZWRpdHNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM5MwogICAgLy8gY29uc3Qgc3RhdGUgPSB0aGlzLmxvYWRVc2VyKHdhbGxldEtleSk7CiAgICBkdXAKICAgIGNhbGxzdWIgbG9hZFVzZXIKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzk0CiAgICAvLyBjb25zdCBjdXJyZW50Um91bmQ6IHVpbnQ2NCA9IEdsb2JhbC5yb3VuZDsKICAgIGdsb2JhbCBSb3VuZAogICAgYnVyeSA1CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzk1CiAgICAvLyBjb25zdCBjb3VudDogdWludDY0ID0gc3RhdGUuYmF0Y2hDb3VudC5hc1VpbnQ2NCgpOwogICAgcHVzaGludCAzIC8vIDMKICAgIGdldGJ5dGUKICAgIGJ1cnkgNQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM5NwogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM5OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDMKCmdldENyZWRpdHNfd2hpbGVfdG9wQDQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzk4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgZGlnIDIKICAgIGRpZyA1CiAgICA8CiAgICBieiBnZXRDcmVkaXRzX2FmdGVyX3doaWxlQDkKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzOTktMTQwMAogICAgLy8gY29uc3QgYiA9IGNsb25lKHN0YXRlLmJhdGNoZXNbaV0pOwogICAgLy8gY29uc3QgZXhwaXJ5OiB1aW50NjQgPSBiLmV4cGlyeVJvdW5kLmFzVWludDY0KCk7CiAgICBkaWcgNQogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgICoKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDgKICAgIHB1c2hpbnQgOCAvLyA4CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDAwCiAgICAvLyBjb25zdCBleHBpcnk6IHVpbnQ2NCA9IGIuZXhwaXJ5Um91bmQuYXNVaW50NjQoKTsKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDAxCiAgICAvLyBpZiAoZXhwaXJ5IDw9IGN1cnJlbnRSb3VuZCkgY29udGludWU7CiAgICBkaWcgNAogICAgPD0KICAgIGJueiBnZXRDcmVkaXRzX2Jsb2NrQDgKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0MDIKICAgIC8vIHRvdGFsID0gdG90YWwgKyBiLmFtb3VudC5hc1VpbnQ2NCgpOwogICAgZGlnIDYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDIKICAgICsKICAgIGJ1cnkgMgoKZ2V0Q3JlZGl0c19ibG9ja0A4OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM5OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIGdldENyZWRpdHNfd2hpbGVfdG9wQDQKCmdldENyZWRpdHNfYWZ0ZXJfd2hpbGVAOToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0MDQKICAgIC8vIHJldHVybiBuZXcgYXJjNC5VaW50NjQodG90YWwpOwogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldENyZWRpdHNfYWZ0ZXJfaW5saW5lZF9zcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLmdldENyZWRpdHNAMTAKCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLndpdGhkcmF3VHJlYXN1cnlbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhd1RyZWFzdXJ5OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQxNAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBhZG1pbkFkZHJlc3MgPSBHbG9iYWxTdGF0ZTxhcmM0LkFkZHJlc3M+KHsga2V5OiAiYSIgfSk7CiAgICBieXRlY18yIC8vICJhIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQxNAogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuYWRtaW5BZGRyZXNzLnZhbHVlLmJ5dGVzLCAiTk9UX0FETUlOIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOT1RfQURNSU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0MTUtMTQyMQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IHJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudC5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQxOAogICAgLy8gYW1vdW50OiBhbW91bnQuYXNVaW50NjQoKSwKICAgIHN3YXAKICAgIGJ0b2kKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDE1LTE0MjAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiByZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQuYXNVaW50NjQoKSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQxOQogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDE1LTE0MjEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiByZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnQuYXNVaW50NjQoKSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQuc2V0VHJlYXN1cnlbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRUcmVhc3VyeToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0MzAKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyLmJ5dGVzID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MuYnl0ZXMsICJOT1RfQ1JFQVRPUiIpOwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9DUkVBVE9SCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHRyZWFzdXJ5QWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJ0IiB9KTsKICAgIGJ5dGVjIDEyIC8vICJ0IgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQzMQogICAgLy8gdGhpcy50cmVhc3VyeUFkZHJlc3MudmFsdWUgPSBuZXdFc2Nyb3c7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnB1Ymxpc2hLZXlzW3JvdXRpbmddKCkgLT4gdm9pZDoKcHVibGlzaEtleXM6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NDgKICAgIC8vIHRoaXMuYXNzZXJ0RXNjcm93R3JvdXBTaGFwZSgpOwogICAgY2FsbHN1YiBhc3NlcnRFc2Nyb3dHcm91cFNoYXBlCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDQ5CiAgICAvLyBhc3NlcnQocHFQdWJrZXkubGVuZ3RoID49IDMyLCAiUFFfS0VZX1RPT19TSE9SVCIpOwogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICA+PQogICAgYXNzZXJ0IC8vIFBRX0tFWV9UT09fU0hPUlQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NTAKICAgIC8vIGFzc2VydChwcVB1YmtleS5sZW5ndGggPD0gMjA0OCwgIlBRX0tFWV9UT09fTE9ORyIpOwogICAgcHVzaGludCAyMDQ4IC8vIDIwNDgKICAgIDw9CiAgICBhc3NlcnQgLy8gUFFfS0VZX1RPT19MT05HCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDUxCiAgICAvLyBjb25zdCBwcUhhc2hCeXRlcyA9IG9wLnNoYTI1NihwcVB1YmtleSk7CiAgICBzaGEyNTYKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NTUKICAgIC8vIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuc3BlbmRPbmVDcmVkaXQoVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIHNwZW5kT25lQ3JlZGl0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgYnl0ZWNfMCAvLyAidzoiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDU4CiAgICAvLyBjb25zdCBjcyA9IHRoaXMudXNlcnMoVHhuLnNlbmRlci5ieXRlcyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDU5CiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcihUeG4uc2VuZGVyLmJ5dGVzKTsKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgbG9hZFVzZXIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NjIKICAgIC8vIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDYzCiAgICAvLyBiYXRjaENvdW50OiBwcmV2LmJhdGNoQ291bnQsCiAgICBkaWcgMgogICAgZXh0cmFjdCAzIDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NjQKICAgIC8vIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIGRpZyAzCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQ2OAogICAgLy8gYmlvOiBwcmV2LmJpbywKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NjAtMTQ2OQogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IHByZXYudXNlcm5hbWUsCiAgICAvLyAgIGJhdGNoQ291bnQ6IHByZXYuYmF0Y2hDb3VudCwKICAgIC8vICAgYmF0Y2hlczogcHJldi5iYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleUhhc2g6IHBxSGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgZGlnIDMKICAgIGxlbgogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICArCiAgICBieXRlY18zIC8vIDB4MDMwMDY4CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgKwogICAgc3dhcAogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDczCiAgICAvLyB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDcyLTE0NzgKICAgIC8vIG5ldyBLZXlzUHVibGlzaGVkKHsKICAgIC8vICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHBxUHVia2V5KSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcUhhc2gsCiAgICAvLyB9KSwKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgYnl0ZWMgMjMgLy8gMHgwMDgyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQ3MS0xNDc5CiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgS2V5c1B1Ymxpc2hlZCh7CiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgICAgc2NhblB1YmtleSwKICAgIC8vICAgICBwcVB1YmtleTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHBxUHVia2V5KSwKICAgIC8vICAgICBwcVB1YmtleUhhc2g6IHBxSGFzaCwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJLZXlzUHVibGlzaGVkKGFkZHJlc3MsYnl0ZVszMl0sYnl0ZVszMl0sYnl0ZVtdLGJ5dGVbMzJdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDgwCiAgICAvLyB0aGlzLmVtaXRDcmVkaXRTcGVudChyZW1haW5pbmcpOwogICAgY2FsbHN1YiBlbWl0Q3JlZGl0U3BlbnQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE0NDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5yZWRlZW1BbmRQdWJsaXNoW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVkZWVtQW5kUHVibGlzaDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTQ5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTA2CiAgICAvLyB0aGlzLmFzc2VydEVzY3Jvd0dyb3VwU2hhcGUoKTsKICAgIGNhbGxzdWIgYXNzZXJ0RXNjcm93R3JvdXBTaGFwZQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUwNwogICAgLy8gYXNzZXJ0KHByZWltYWdlLmxlbmd0aCA9PT0gUFJFSU1BR0VfTEVOLCAiQkFEX1BSRUlNQUdFIik7CiAgICBkaWcgMQogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIEJBRF9QUkVJTUFHRQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUwOAogICAgLy8gYXNzZXJ0KHBxUHVia2V5Lmxlbmd0aCA+PSAzMiwgIlBRX0tFWV9UT09fU0hPUlQiKTsKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzIgLy8gMzIKICAgID49CiAgICBhc3NlcnQgLy8gUFFfS0VZX1RPT19TSE9SVAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUwOQogICAgLy8gYXNzZXJ0KHBxUHVia2V5Lmxlbmd0aCA8PSAyMDQ4LCAiUFFfS0VZX1RPT19MT05HIik7CiAgICBwdXNoaW50IDIwNDggLy8gMjA0OAogICAgPD0KICAgIGFzc2VydCAvLyBQUV9LRVlfVE9PX0xPTkcKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MTIKICAgIC8vIGNvbnN0IGNvbW1pdG1lbnRIYXNoID0gb3Auc2hhMjU2KHByZWltYWdlKTsKICAgIHNoYTI1NgogICAgZHVwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIGNvbW1pdG1lbnRzID0gQm94TWFwPGJ5dGVzLCBDb21taXRtZW50Pih7IGtleVByZWZpeDogImM6IiB9KTsKICAgIGJ5dGVjIDUgLy8gImM6IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MTQKICAgIC8vIGFzc2VydChjQm94LmV4aXN0cywgIkJBRF9DT0RFIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCQURfQ09ERQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUxNQogICAgLy8gY29uc3Qgc29sZDogdWludDY0ID0gY0JveC52YWx1ZS5zb2xkQXRSb3VuZC5hc1VpbnQ2NCgpOwogICAgYm94X2dldAogICAgcG9wCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTE2CiAgICAvLyBpZiAoc29sZCA+IDApIHsKICAgIGJ6IHJlZGVlbUFuZFB1Ymxpc2hfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTE3CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHNvbGQgKyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUsICJDT0RFX0VYUElSRUQiKTsKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcm91bmRzUGVyWWVhciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJyIiB9KTsKICAgIGJ5dGVjIDYgLy8gInIiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTE3CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHNvbGQgKyB0aGlzLnJvdW5kc1BlclllYXIudmFsdWUsICJDT0RFX0VYUElSRUQiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgKwogICAgPD0KICAgIGFzc2VydCAvLyBDT0RFX0VYUElSRUQKCnJlZGVlbUFuZFB1Ymxpc2hfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUxOQogICAgLy8gY29uc3QgZGVub21pbmF0aW9uID0gY0JveC52YWx1ZS5kZW5vbWluYXRpb247CiAgICBkaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDgKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUyMAogICAgLy8gY0JveC5kZWxldGUoKTsKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUyMgogICAgLy8gY29uc3QgcHFIYXNoQnl0ZXMgPSBvcC5zaGEyNTYocHFQdWJrZXkpOwogICAgZGlnIDQKICAgIHNoYTI1NgogICAgYnVyeSAxMQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUyNgogICAgLy8gY29uc3Qgd2FsbGV0S2V5ID0gVHhuLnNlbmRlci5ieXRlczsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB1c2VycyA9IEJveE1hcDxieXRlcywgVXNlclN0YXRlPih7IGtleVByZWZpeDogInc6IiB9KTsKICAgIGJ5dGVjXzAgLy8gInc6IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MzAKICAgIC8vIGV4cGlyeVJvdW5kOiBuZXcgYXJjNC5VaW50NjQoR2xvYmFsLnJvdW5kICsgdGhpcy5yb3VuZHNQZXJZZWFyLnZhbHVlKSwKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcm91bmRzUGVyWWVhciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJyIiB9KTsKICAgIGJ5dGVjIDYgLy8gInIiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTMwCiAgICAvLyBleHBpcnlSb3VuZDogbmV3IGFyYzQuVWludDY0KEdsb2JhbC5yb3VuZCArIHRoaXMucm91bmRzUGVyWWVhci52YWx1ZSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgKwogICAgaXRvYgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUyOC0xNTMxCiAgICAvLyBjb25zdCBuZXdCYXRjaCA9IG5ldyBCYXRjaCh7CiAgICAvLyAgIGFtb3VudDogZGVub21pbmF0aW9uLAogICAgLy8gICBleHBpcnlSb3VuZDogbmV3IGFyYzQuVWludDY0KEdsb2JhbC5yb3VuZCArIHRoaXMucm91bmRzUGVyWWVhci52YWx1ZSksCiAgICAvLyB9KTsKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTMzCiAgICAvLyBpZiAoY3MuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHJlZGVlbUFuZFB1Ymxpc2hfZWxzZV9ib2R5QDUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MzQKICAgIC8vIGNvbnN0IHByZXYgPSB0aGlzLmxvYWRVc2VyKHdhbGxldEtleSk7CiAgICBkaWcgOQogICAgY2FsbHN1YiBsb2FkVXNlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUzNQogICAgLy8gY29uc3QgcHJldkNvdW50OiB1aW50NjQgPSBwcmV2LmJhdGNoQ291bnQuYXNVaW50NjQoKTsKICAgIGR1cAogICAgcHVzaGludCAzIC8vIDMKICAgIGdldGJ5dGUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MzYKICAgIC8vIGFzc2VydChwcmV2Q291bnQgPCB0aGlzLm1heEJhdGNoZXMudmFsdWUsICJUT09fTUFOWV9CQVRDSEVTIik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBtYXhCYXRjaGVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogIm0iIH0pOwogICAgYnl0ZWMgMTEgLy8gIm0iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTM2CiAgICAvLyBhc3NlcnQocHJldkNvdW50IDwgdGhpcy5tYXhCYXRjaGVzLnZhbHVlLCAiVE9PX01BTllfQkFUQ0hFUyIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gVE9PX01BTllfQkFUQ0hFUwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTUzNwogICAgLy8gcHJldi5iYXRjaGVzLnB1c2gobmV3QmF0Y2gpOwogICAgZGlnIDEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAyIC8vIDEwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBkaWcgNAogICAgaW50Y18wIC8vIDAKICAgIGRpZyA0CiAgICBleHRyYWN0MwogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICB1bmNvdmVyIDQKICAgIC0KICAgIHVuY292ZXIgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAxMDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NDAKICAgIC8vIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTQxCiAgICAvLyBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChwcmV2Q291bnQgKyAxKSwKICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NDIKICAgIC8vIGJhdGNoZXM6IHByZXYuYmF0Y2hlcywKICAgIGRpZyAzCiAgICBwdXNoaW50IDEwMiAvLyAxMDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciA0CiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU0NgogICAgLy8gYmlvOiBwcmV2LmJpbywKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1MzgtMTU0NwogICAgLy8gY3MudmFsdWUgPSBuZXcgVXNlclN0YXRlKHsKICAgIC8vICAgdmVyc2lvbjogbmV3IGFyYzQuVWludDgoVVNFUl9TVEFURV9WRVJTSU9OKSwKICAgIC8vICAgdXNlcm5hbWU6IHByZXYudXNlcm5hbWUsCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KHByZXZDb3VudCArIDEpLAogICAgLy8gICBiYXRjaGVzOiBwcmV2LmJhdGNoZXMsCiAgICAvLyAgIGVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogcHFIYXNoLAogICAgLy8gICBiaW86IHByZXYuYmlvLAogICAgLy8gfSk7CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDEwNCAvLyAxMDQKICAgICsKICAgIGJ5dGVjXzMgLy8gMHgwMzAwNjgKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICBkaWcgMTEKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIGRpZyAxNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAoKcmVkZWVtQW5kUHVibGlzaF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTY0CiAgICAvLyBjb25zdCBiYWxhbmNlOiB1aW50NjQgPSBvcC5iYWxhbmNlKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgYmFsYW5jZQogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NjUKICAgIC8vIGlmIChiYWxhbmNlIDwgQUNDT1VOVF9NQlJfTUlOKSB7CiAgICBpbnRjIDUgLy8gMTAwMDAwCiAgICA8CiAgICBieiByZWRlZW1BbmRQdWJsaXNoX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU2NgogICAgLy8gY29uc3Qgc2VlZEFtb3VudDogdWludDY0ID0gQUNDT1VOVF9NQlJfTUlOIC0gYmFsYW5jZTsKICAgIGludGMgNSAvLyAxMDAwMDAKICAgIGRpZyA4CiAgICAtCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTY3LTE1NzMKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogc2VlZEFtb3VudCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NjkKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NjctMTU3MgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBzZWVkQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTcxCiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NjctMTU3MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBzZWVkQW1vdW50LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKCnJlZGVlbUFuZFB1Ymxpc2hfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU4MAogICAgLy8gd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgdHhuIFNlbmRlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU3Ny0xNTgyCiAgICAvLyBuZXcgUmVkZWVtZWQoewogICAgLy8gICBjb21taXRtZW50OiBuZXcgYXJjNC5TdGF0aWNCeXRlczwzMj4oY29tbWl0bWVudEhhc2gpLAogICAgLy8gICBkZW5vbWluYXRpb24sCiAgICAvLyAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgdXNlcm5hbWU6IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gfSksCiAgICBkaWcgMwogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA0YTAwMDAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU3Ni0xNTgzCiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgUmVkZWVtZWQoewogICAgLy8gICAgIGNvbW1pdG1lbnQ6IG5ldyBhcmM0LlN0YXRpY0J5dGVzPDMyPihjb21taXRtZW50SGFzaCksCiAgICAvLyAgICAgZGVub21pbmF0aW9uLAogICAgLy8gICAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgICB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIGJ5dGVjIDIxIC8vIG1ldGhvZCAiUmVkZWVtZWQoYnl0ZVszMl0sdWludDY0LGFkZHJlc3MsYnl0ZVtdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTg2CiAgICAvLyB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTg1LTE1OTEKICAgIC8vIG5ldyBLZXlzUHVibGlzaGVkKHsKICAgIC8vICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHBxUHVia2V5KSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcUhhc2gsCiAgICAvLyB9KSwKICAgIGRpZyA3CiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGJ5dGVjIDIzIC8vIDB4MDA4MgogICAgY29uY2F0CiAgICBkaWcgMTAKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU4NC0xNTkyCiAgICAvLyBlbWl0KAogICAgLy8gICBuZXcgS2V5c1B1Ymxpc2hlZCh7CiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIGVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgICAgc2NhblB1YmtleSwKICAgIC8vICAgICBwcVB1YmtleTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKHBxUHVia2V5KSwKICAgIC8vICAgICBwcVB1YmtleUhhc2g6IHBxSGFzaCwKICAgIC8vICAgfSksCiAgICAvLyApOwogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJLZXlzUHVibGlzaGVkKGFkZHJlc3MsYnl0ZVszMl0sYnl0ZVszMl0sYnl0ZVtdLGJ5dGVbMzJdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNDk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVkZWVtQW5kUHVibGlzaF9lbHNlX2JvZHlANToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NDkKICAgIC8vIGNvbnN0IGJhdGNoZXMgPSBuZXcgYXJjNC5EeW5hbWljQXJyYXk8QmF0Y2g+KCk7CiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU1MAogICAgLy8gYmF0Y2hlcy5wdXNoKG5ld0JhdGNoKTsKICAgIHN3YXAKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgYnl0ZWMgMTQgLy8gMHgwMDAxCiAgICByZXBsYWNlMiAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTUxLTE1NjAKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXMoKSwKICAgIC8vICAgYmF0Y2hDb3VudDogbmV3IGFyYzQuVWludDgoMSksCiAgICAvLyAgIGJhdGNoZXMsCiAgICAvLyAgIGVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXksCiAgICAvLyAgIHBxUHVia2V5SGFzaDogcHFIYXNoLAogICAgLy8gICBiaW86IG5ldyBhcmM0LkR5bmFtaWNCeXRlcygpLAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICArCiAgICBwdXNoYnl0ZXMgMHgwMzAwNjgwMTAwNmEKICAgIGRpZyA5CiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBjb25jYXQKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNTUzCiAgICAvLyB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU1MS0xNTYwCiAgICAvLyBjcy52YWx1ZSA9IG5ldyBVc2VyU3RhdGUoewogICAgLy8gICB2ZXJzaW9uOiBuZXcgYXJjNC5VaW50OChVU0VSX1NUQVRFX1ZFUlNJT04pLAogICAgLy8gICB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KDEpLAogICAgLy8gICBiYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleUhhc2g6IHBxSGFzaCwKICAgIC8vICAgYmlvOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXMoKSwKICAgIC8vIH0pOwogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE1NTkKICAgIC8vIGJpbzogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTU1MS0xNTYwCiAgICAvLyBjcy52YWx1ZSA9IG5ldyBVc2VyU3RhdGUoewogICAgLy8gICB2ZXJzaW9uOiBuZXcgYXJjNC5VaW50OChVU0VSX1NUQVRFX1ZFUlNJT04pLAogICAgLy8gICB1c2VybmFtZTogbmV3IGFyYzQuRHluYW1pY0J5dGVzKCksCiAgICAvLyAgIGJhdGNoQ291bnQ6IG5ldyBhcmM0LlVpbnQ4KDEpLAogICAgLy8gICBiYXRjaGVzLAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleUhhc2g6IHBxSGFzaCwKICAgIC8vICAgYmlvOiBuZXcgYXJjNC5EeW5hbWljQnl0ZXMoKSwKICAgIC8vIH0pOwogICAgY29uY2F0CiAgICBkaWcgMTIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICBiIHJlZGVlbUFuZFB1Ymxpc2hfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5nZXRVc2VyUHJvZmlsZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFVzZXJQcm9maWxlOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTYwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzgxCiAgICAvLyB1c2VycyA9IEJveE1hcDxieXRlcywgVXNlclN0YXRlPih7IGtleVByZWZpeDogInc6IiB9KTsKICAgIGJ5dGVjXzAgLy8gInc6IgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTYwMwogICAgLy8gYXNzZXJ0KGNzLmV4aXN0cywgIk5PVF9GT1VORCIpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTk9UX0ZPVU5ECiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjA0CiAgICAvLyByZXR1cm4gdGhpcy5sb2FkVXNlcih3YWxsZXQuYnl0ZXMpOwogICAgY2FsbHN1YiBsb2FkVXNlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTYwMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLmdldFVzZXJLZXlzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VXNlcktleXM6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIHVzZXJzID0gQm94TWFwPGJ5dGVzLCBVc2VyU3RhdGU+KHsga2V5UHJlZml4OiAidzoiIH0pOwogICAgYnl0ZWNfMCAvLyAidzoiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjE1CiAgICAvLyBhc3NlcnQoY3MuZXhpc3RzLCAiTk9UX0ZPVU5EIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBOT1RfRk9VTkQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2MTYKICAgIC8vIGNvbnN0IHN0YXRlID0gdGhpcy5sb2FkVXNlcih3YWxsZXQuYnl0ZXMpOwogICAgY2FsbHN1YiBsb2FkVXNlcgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTYxOAogICAgLy8gZW5jcnlwdGlvblB1YmtleTogc3RhdGUuZW5jcnlwdGlvblB1YmtleSwKICAgIGR1cAogICAgZXh0cmFjdCA2IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjE5CiAgICAvLyBzY2FuUHVia2V5OiBzdGF0ZS5zY2FuUHVia2V5LAogICAgZGlnIDEKICAgIGV4dHJhY3QgMzggMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2MjAKICAgIC8vIHBxUHVia2V5SGFzaDogc3RhdGUucHFQdWJrZXlIYXNoLAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDcwIDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjE3LTE2MjEKICAgIC8vIHJldHVybiBuZXcgVXNlcktleXMoewogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBzdGF0ZS5lbmNyeXB0aW9uUHVia2V5LAogICAgLy8gICBzY2FuUHVia2V5OiBzdGF0ZS5zY2FuUHVia2V5LAogICAgLy8gICBwcVB1YmtleUhhc2g6IHN0YXRlLnBxUHVia2V5SGFzaCwKICAgIC8vIH0pOwogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyA4IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC5taWdyYXRlX3YyW3JvdXRpbmddKCkgLT4gdm9pZDoKbWlncmF0ZV92MjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjQ2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGFkbWluQWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJhIiB9KTsKICAgIGJ5dGVjXzIgLy8gImEiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjQ2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9BRE1JTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY0NwogICAgLy8gY29uc3QgbnA6IHVpbnQ2NCA9IGluaXRpYWxQcmljZS5hc1VpbnQ2NCgpOwogICAgYnRvaQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY0OAogICAgLy8gYXNzZXJ0KG5wID49IFBSSUNFX0ZMT09SLCAiQkFEX1BSSUNFIik7CiAgICBkdXAKICAgIGludGMgOCAvLyAxMDAwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIEJBRF9QUklDRQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY0OQogICAgLy8gYXNzZXJ0KG5wIDw9IFBSSUNFX0NFSUxJTkcsICJCQURfUFJJQ0UiKTsKICAgIGR1cAogICAgaW50YyA5IC8vIDEwMDAwMDAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gQkFEX1BSSUNFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNjMKICAgIC8vIHByaWNlTWljcm9BbGdvcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwciIgfSk7CiAgICBieXRlYyAxMCAvLyAicHIiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjUwCiAgICAvLyB0aGlzLnByaWNlTWljcm9BbGdvcy52YWx1ZSA9IG5wOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM2NQogICAgLy8gcG9vbEhlYWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAicGgiIH0pOwogICAgYnl0ZWMgNyAvLyAicGgiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjUxCiAgICAvLyB0aGlzLnBvb2xIZWFkLnZhbHVlID0gMDsKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzY3CiAgICAvLyBwb29sVGFpbCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICJwdCIgfSk7CiAgICBieXRlYyA0IC8vICJwdCIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2NTIKICAgIC8vIHRoaXMucG9vbFRhaWwudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQuZm9yY2VEZWxldGVDb21taXRtZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZm9yY2VEZWxldGVDb21taXRtZW50OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4+CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjY4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNTgKICAgIC8vIGFkbWluQWRkcmVzcyA9IEdsb2JhbFN0YXRlPGFyYzQuQWRkcmVzcz4oeyBrZXk6ICJhIiB9KTsKICAgIGJ5dGVjXzIgLy8gImEiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjY4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlci5ieXRlcyA9PT0gdGhpcy5hZG1pbkFkZHJlc3MudmFsdWUuYnl0ZXMsICJOT1RfQURNSU4iKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5PVF9BRE1JTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY3MAogICAgLy8gYXNzZXJ0KGNvdW50ID4gMCwgIkVNUFRZX0JBVENIIik7CiAgICBkdXAKICAgIGFzc2VydCAvLyBFTVBUWV9CQVRDSAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY3MQogICAgLy8gYXNzZXJ0KGNvdW50IDw9IE1BWF9SRUNMQUlNX0JBVENILCAiQkFUQ0hfVE9PX0xBUkdFIik7CiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBCQVRDSF9UT09fTEFSR0UKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2NzIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAoKZm9yY2VEZWxldGVDb21taXRtZW50X3doaWxlX3RvcEAyOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY3MgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IGZvcmNlRGVsZXRlQ29tbWl0bWVudF9hZnRlcl93aGlsZUA2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjczCiAgICAvLyBjb25zdCBoYXNoID0gY29tbWl0bWVudHNbaV0uYnl0ZXM7CiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIGNvbW1pdG1lbnRzID0gQm94TWFwPGJ5dGVzLCBDb21taXRtZW50Pih7IGtleVByZWZpeDogImM6IiB9KTsKICAgIGJ5dGVjIDUgLy8gImM6IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY3NQogICAgLy8gaWYgKGNCb3guZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGZvcmNlRGVsZXRlQ29tbWl0bWVudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2NzYKICAgIC8vIGNCb3guZGVsZXRlKCk7CiAgICBkaWcgMwogICAgYm94X2RlbAogICAgcG9wCgpmb3JjZURlbGV0ZUNvbW1pdG1lbnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY3MgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBmb3JjZURlbGV0ZUNvbW1pdG1lbnRfd2hpbGVfdG9wQDIKCmZvcmNlRGVsZXRlQ29tbWl0bWVudF9hZnRlcl93aGlsZUA2OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLl92ZXJpZnlQcm9vZkZvclRlc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpfdmVyaWZ5UHJvb2ZGb3JUZXN0OgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTY5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IGZhbHNlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNyYy9zbmFya192ZXJpZmllci5hbGdvLnRzOjE4NAogICAgLy8gZW5zdXJlQnVkZ2V0KDgwMDAwLCBPcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KTsKICAgIGludGMgMTAgLy8gODAwMDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjE2OTYKICAgIC8vIHJldHVybiB2ZXJpZnlHcm90aDE2KHByb29mLCBwdWJsaWNJbnB1dHMpOwogICAgY2FsbHN1YiB2ZXJpZnlHcm90aDE2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxNjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogZmFsc2UgfSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLnNwZW5kT25lQ3JlZGl0KHdhbGxldEtleTogYnl0ZXMpIC0+IHVpbnQ2NDoKc3BlbmRPbmVDcmVkaXQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDM1CiAgICAvLyBwcml2YXRlIHNwZW5kT25lQ3JlZGl0KHdhbGxldEtleTogYnl0ZXMpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gdXNlcnMgPSBCb3hNYXA8Ynl0ZXMsIFVzZXJTdGF0ZT4oeyBrZXlQcmVmaXg6ICJ3OiIgfSk7CiAgICBieXRlY18wIC8vICJ3OiIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwMzcKICAgIC8vIGFzc2VydChjcy5leGlzdHMsICJOT19DUkVESVRTIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBOT19DUkVESVRTCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDM5CiAgICAvLyBjb25zdCBwcmV2ID0gdGhpcy5sb2FkVXNlcih3YWxsZXRLZXkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGxvYWRVc2VyCiAgICBkdXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNDAKICAgIC8vIGNvbnN0IGN1cnJlbnRSb3VuZDogdWludDY0ID0gR2xvYmFsLnJvdW5kOwogICAgZ2xvYmFsIFJvdW5kCiAgICBzd2FwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDQxCiAgICAvLyBjb25zdCBrZXB0ID0gbmV3IGFyYzQuRHluYW1pY0FycmF5PEJhdGNoPigpOwogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIHN3YXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNDIKICAgIC8vIGxldCBkZWNyZW1lbnRlZCA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNDMKICAgIC8vIGxldCBrZXB0Q291bnQ6IHVpbnQ2NCA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0NAogICAgLy8gbGV0IHJlbWFpbmluZzogdWludDY0ID0gMDsKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDQ1CiAgICAvLyBjb25zdCBwcmV2Q291bnQ6IHVpbnQ2NCA9IHByZXYuYmF0Y2hDb3VudC5hc1VpbnQ2NCgpOwogICAgcHVzaGludCAzIC8vIDMKICAgIGdldGJ5dGUKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNDYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwcmV2Q291bnQ7IGkrKykgewogICAgaW50Y18wIC8vIDAKCnNwZW5kT25lQ3JlZGl0X3doaWxlX3RvcEAxOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByZXZDb3VudDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMTEKICAgIGZyYW1lX2RpZyAxMAogICAgPAogICAgYnogc3BlbmRPbmVDcmVkaXRfYWZ0ZXJfd2hpbGVAMTEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNDcKICAgIC8vIGNvbnN0IGIgPSBjbG9uZShwcmV2LmJhdGNoZXNbaV0pOwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAxMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgKgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0Ny0xMDQ4CiAgICAvLyBjb25zdCBiID0gY2xvbmUocHJldi5iYXRjaGVzW2ldKTsKICAgIC8vIGNvbnN0IGV4cGlyeTogdWludDY0ID0gYi5leHBpcnlSb3VuZC5hc1VpbnQ2NCgpOwogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgZnJhbWVfYnVyeSAwCiAgICBwdXNoaW50IDggLy8gOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0OAogICAgLy8gY29uc3QgZXhwaXJ5OiB1aW50NjQgPSBiLmV4cGlyeVJvdW5kLmFzVWludDY0KCk7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0OQogICAgLy8gaWYgKGV4cGlyeSA8PSBjdXJyZW50Um91bmQpIGNvbnRpbnVlOyAvLyBleHBpcmVkIOKAlCBkcm9wCiAgICBmcmFtZV9kaWcgNQogICAgPD0KICAgIGJueiBzcGVuZE9uZUNyZWRpdF9ibG9ja0AxMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA1MAogICAgLy8gaWYgKCFkZWNyZW1lbnRlZCkgewogICAgZnJhbWVfZGlnIDcKICAgIGJueiBzcGVuZE9uZUNyZWRpdF9lbHNlX2JvZHlAOAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA1MQogICAgLy8gY29uc3QgYW1vdW50OiB1aW50NjQgPSBiLmFtb3VudC5hc1VpbnQ2NCgpOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNTIKICAgIC8vIGlmIChhbW91bnQgPiAxKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogc3BlbmRPbmVDcmVkaXRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDU1CiAgICAvLyBhbW91bnQ6IG5ldyBhcmM0LlVpbnQ2NChhbW91bnQgLSAxKSwKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDU0LTEwNTcKICAgIC8vIG5ldyBCYXRjaCh7CiAgICAvLyAgIGFtb3VudDogbmV3IGFyYzQuVWludDY0KGFtb3VudCAtIDEpLAogICAgLy8gICBleHBpcnlSb3VuZDogYi5leHBpcnlSb3VuZCwKICAgIC8vIH0pLAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA1My0xMDU4CiAgICAvLyBrZXB0LnB1c2goCiAgICAvLyAgIG5ldyBCYXRjaCh7CiAgICAvLyAgICAgYW1vdW50OiBuZXcgYXJjNC5VaW50NjQoYW1vdW50IC0gMSksCiAgICAvLyAgICAgZXhwaXJ5Um91bmQ6IGIuZXhwaXJ5Um91bmQsCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDU5CiAgICAvLyBrZXB0Q291bnQgPSBrZXB0Q291bnQgKyAxOwogICAgZnJhbWVfZGlnIDgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDgKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNjAKICAgIC8vIHJlbWFpbmluZyA9IHJlbWFpbmluZyArIChhbW91bnQgLSAxKTsKICAgIGZyYW1lX2RpZyA5CiAgICArCiAgICBmcmFtZV9idXJ5IDkKCnNwZW5kT25lQ3JlZGl0X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNjMKICAgIC8vIGRlY3JlbWVudGVkID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDcKCnNwZW5kT25lQ3JlZGl0X2Jsb2NrQDEwOgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA0NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByZXZDb3VudDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMTEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDExCiAgICBiIHNwZW5kT25lQ3JlZGl0X3doaWxlX3RvcEAxCgpzcGVuZE9uZUNyZWRpdF9lbHNlX2JvZHlAODoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNjUKICAgIC8vIGtlcHQucHVzaChiKTsKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA2NgogICAgLy8ga2VwdENvdW50ID0ga2VwdENvdW50ICsgMTsKICAgIGZyYW1lX2RpZyA4CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA4CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDY3CiAgICAvLyByZW1haW5pbmcgPSByZW1haW5pbmcgKyBiLmFtb3VudC5hc1VpbnQ2NCgpOwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgOQogICAgKwogICAgZnJhbWVfYnVyeSA5CiAgICBiIHNwZW5kT25lQ3JlZGl0X2Jsb2NrQDEwCgpzcGVuZE9uZUNyZWRpdF9hZnRlcl93aGlsZUAxMToKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNzAKICAgIC8vIGFzc2VydChkZWNyZW1lbnRlZCwgIk5PX0NSRURJVFMiKTsKICAgIGZyYW1lX2RpZyA3CiAgICBhc3NlcnQgLy8gTk9fQ1JFRElUUwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA3NAogICAgLy8gdXNlcm5hbWU6IHByZXYudXNlcm5hbWUsCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDc1CiAgICAvLyBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChrZXB0Q291bnQpLAogICAgZnJhbWVfZGlnIDgKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNzcKICAgIC8vIGVuY3J5cHRpb25QdWJrZXk6IHByZXYuZW5jcnlwdGlvblB1YmtleSwKICAgIGRpZyAyCiAgICBleHRyYWN0IDYgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwNzgKICAgIC8vIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIGRpZyAzCiAgICBleHRyYWN0IDM4IDMyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDc5CiAgICAvLyBwcVB1YmtleUhhc2g6IHByZXYucHFQdWJrZXlIYXNoLAogICAgZGlnIDQKICAgIGV4dHJhY3QgNzAgMzIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEwODAKICAgIC8vIGJpbzogcHJldi5iaW8sCiAgICBkaWcgNQogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDYKICAgIGxlbgogICAgdW5jb3ZlciA3CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDcyLTEwODEKICAgIC8vIGNzLnZhbHVlID0gbmV3IFVzZXJTdGF0ZSh7CiAgICAvLyAgIHZlcnNpb246IG5ldyBhcmM0LlVpbnQ4KFVTRVJfU1RBVEVfVkVSU0lPTiksCiAgICAvLyAgIHVzZXJuYW1lOiBwcmV2LnVzZXJuYW1lLAogICAgLy8gICBiYXRjaENvdW50OiBuZXcgYXJjNC5VaW50OChrZXB0Q291bnQpLAogICAgLy8gICBiYXRjaGVzOiBrZXB0LAogICAgLy8gICBlbmNyeXB0aW9uUHVia2V5OiBwcmV2LmVuY3J5cHRpb25QdWJrZXksCiAgICAvLyAgIHNjYW5QdWJrZXk6IHByZXYuc2NhblB1YmtleSwKICAgIC8vICAgcHFQdWJrZXlIYXNoOiBwcmV2LnBxUHVia2V5SGFzaCwKICAgIC8vICAgYmlvOiBwcmV2LmJpbywKICAgIC8vIH0pOwogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAxMDQgLy8gMTA0CiAgICArCiAgICBieXRlY18zIC8vIDB4MDMwMDY4CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTA4MwogICAgLy8gcmV0dXJuIHJlbWFpbmluZzsKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQuZW1pdENyZWRpdFNwZW50KHJlbWFpbmluZzogdWludDY0KSAtPiB2b2lkOgplbWl0Q3JlZGl0U3BlbnQ6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDkzCiAgICAvLyBwcml2YXRlIGVtaXRDcmVkaXRTcGVudChyZW1haW5pbmc6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDk2CiAgICAvLyB3YWxsZXQ6IG5ldyBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDk3CiAgICAvLyByZW1haW5pbmc6IG5ldyBhcmM0LlVpbnQ2NChyZW1haW5pbmcpLAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDk1LTEwOTgKICAgIC8vIG5ldyBDcmVkaXRTcGVudCh7CiAgICAvLyAgIHdhbGxldDogbmV3IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgcmVtYWluaW5nOiBuZXcgYXJjNC5VaW50NjQocmVtYWluaW5nKSwKICAgIC8vIH0pLAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMDk0LTEwOTkKICAgIC8vIGVtaXQoCiAgICAvLyAgIG5ldyBDcmVkaXRTcGVudCh7CiAgICAvLyAgICAgd2FsbGV0OiBuZXcgYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICAgIHJlbWFpbmluZzogbmV3IGFyYzQuVWludDY0KHJlbWFpbmluZyksCiAgICAvLyAgIH0pLAogICAgLy8gKTsKICAgIHB1c2hieXRlcyAweDc3YTVmN2VkIC8vIG1ldGhvZCAiQ3JlZGl0U3BlbnQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjpTZWFsZWQuYXNzZXJ0RXNjcm93R3JvdXBTaGFwZSgpIC0+IHZvaWQ6CmFzc2VydEVzY3Jvd0dyb3VwU2hhcGU6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTE0CiAgICAvLyBhc3NlcnQoR2xvYmFsLmdyb3VwU2l6ZSA9PT0gR1JPVVBfU0laRV9FWFBFQ1RFRCwgIk5PVF9HUk9VUCIpOwogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gTk9UX0dST1VQCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTE1CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPT09IEFQUF9DQUxMX0lOREVYLCAiQkFEX0dST1VQX0lOREVYIik7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gQkFEX0dST1VQX0lOREVYCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTE2CiAgICAvLyBjb25zdCBmZWVUeG4gPSBndHhuLlBheW1lbnRUeG4oRkVFX1RYTl9JTkRFWCk7CiAgICBpbnRjXzAgLy8gMAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTE4CiAgICAvLyBmZWVUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnRyZWFzdXJ5QWRkcmVzcy52YWx1ZS5ieXRlcywKICAgIGd0eG5zIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gdHJlYXN1cnlBZGRyZXNzID0gR2xvYmFsU3RhdGU8YXJjNC5BZGRyZXNzPih7IGtleTogInQiIH0pOwogICAgYnl0ZWMgMTIgLy8gInQiCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTE4CiAgICAvLyBmZWVUeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnRyZWFzdXJ5QWRkcmVzcy52YWx1ZS5ieXRlcywKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTExNy0xMTIwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGZlZVR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMudHJlYXN1cnlBZGRyZXNzLnZhbHVlLmJ5dGVzLAogICAgLy8gICAiQkFEX0ZFRV9QQVlFUiIsCiAgICAvLyApOwogICAgYXNzZXJ0IC8vIEJBRF9GRUVfUEFZRVIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExMTYKICAgIC8vIGNvbnN0IGZlZVR4biA9IGd0eG4uUGF5bWVudFR4bihGRUVfVFhOX0lOREVYKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTIxCiAgICAvLyBhc3NlcnQoZmVlVHhuLmZlZSA+PSBHUk9VUF9GRUVfTUlOLCAiQkFEX0ZFRSIpOwogICAgZ3R4bnMgRmVlCiAgICBwdXNoaW50IDIwMDAgLy8gMjAwMAogICAgPj0KICAgIGFzc2VydCAvLyBCQURfRkVFCiAgICByZXRzdWIKCgovLyBzcmMvY29udHJhY3QuYWxnby50czo6U2VhbGVkLmxvYWRVc2VyKHdhbGxldEtleTogYnl0ZXMpIC0+IGJ5dGVzOgpsb2FkVXNlcjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExMzYKICAgIC8vIHByaXZhdGUgbG9hZFVzZXIod2FsbGV0S2V5OiBieXRlcyk6IFVzZXJTdGF0ZSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExMzcKICAgIC8vIGNvbnN0IFtyYXcsIGV4aXN0c10gPSBvcC5Cb3guZ2V0KEJ5dGVzKCJ3OiIpLmNvbmNhdCh3YWxsZXRLZXkpKTsKICAgIGJ5dGVjXzAgLy8gInc6IgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTM4CiAgICAvLyBhc3NlcnQoZXhpc3RzLCAiTk9fQ1JFRElUUyIpOwogICAgYXNzZXJ0IC8vIE5PX0NSRURJVFMKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExMzkKICAgIC8vIGNvbnN0IHZlcnNpb246IHVpbnQ2NCA9IG9wLmdldEJ5dGUocmF3LCAwKTsKICAgIGludGNfMCAvLyAwCiAgICBnZXRieXRlCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNDAKICAgIC8vIGlmICh2ZXJzaW9uID09PSBVU0VSX1NUQVRFX1ZFUlNJT04pIHsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogbG9hZFVzZXJfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTQxCiAgICAvLyByZXR1cm4gYXJjNC5jb252ZXJ0Qnl0ZXM8VXNlclN0YXRlPihyYXcsIHsgc3RyYXRlZ3k6ICJ1bnNhZmUtY2FzdCIgfSk7CiAgICBzd2FwCiAgICByZXRzdWIKCmxvYWRVc2VyX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNDMKICAgIC8vIGFzc2VydCh2ZXJzaW9uID09PSAyLCAiQkFEX1ZFUlNJT04iKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBCQURfVkVSU0lPTgogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE0OAogICAgLy8gY29uc3QgdW5hbWVPZmY6IHVpbnQ2NCA9IG9wLmV4dHJhY3RVaW50MTYocmF3LCAxKTsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyBjb25zdCBiYXRjaGVzT2ZmOiB1aW50NjQgPSBvcC5leHRyYWN0VWludDE2KHJhdywgNCk7CiAgICBkaWcgMQogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUxCiAgICAvLyAuY29uY2F0KHUxNmJlKHVuYW1lT2ZmICsgMikpCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdChvcC5pdG9iKHgpLCA2LCAyKTsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUwCiAgICAvLyBjb25zdCB2MyA9IEJ5dGVzLmZyb21IZXgoIjAzIikgLy8gdmVyc2lvbiAzCiAgICBwdXNoYnl0ZXMgMHgwMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1MC0xMTUxCiAgICAvLyBjb25zdCB2MyA9IEJ5dGVzLmZyb21IZXgoIjAzIikgLy8gdmVyc2lvbiAzCiAgICAvLyAgIC5jb25jYXQodTE2YmUodW5hbWVPZmYgKyAyKSkKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1MgogICAgLy8gLmNvbmNhdChyYXcuc2xpY2UoMywgNCkpIC8vIGJhdGNoQ291bnQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMyAvLyAzCiAgICBkaWcgMQogICAgPj0KICAgIHB1c2hpbnQgMyAvLyAzCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBkaWcgMgogICAgPj0KICAgIHB1c2hpbnQgNCAvLyA0CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUwLTExNTIKICAgIC8vIGNvbnN0IHYzID0gQnl0ZXMuZnJvbUhleCgiMDMiKSAvLyB2ZXJzaW9uIDMKICAgIC8vICAgLmNvbmNhdCh1MTZiZSh1bmFtZU9mZiArIDIpKQogICAgLy8gICAuY29uY2F0KHJhdy5zbGljZSgzLCA0KSkgLy8gYmF0Y2hDb3VudAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNTMKICAgIC8vIC5jb25jYXQodTE2YmUoYmF0Y2hlc09mZiArIDIpKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdChvcC5pdG9iKHgpLCA2LCAyKTsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUwLTExNTMKICAgIC8vIGNvbnN0IHYzID0gQnl0ZXMuZnJvbUhleCgiMDMiKSAvLyB2ZXJzaW9uIDMKICAgIC8vICAgLmNvbmNhdCh1MTZiZSh1bmFtZU9mZiArIDIpKQogICAgLy8gICAuY29uY2F0KHJhdy5zbGljZSgzLCA0KSkgLy8gYmF0Y2hDb3VudAogICAgLy8gICAuY29uY2F0KHUxNmJlKGJhdGNoZXNPZmYgKyAyKSkKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1NAogICAgLy8gLmNvbmNhdChyYXcuc2xpY2UoNiwgMTAyKSkgLy8gZW5jICsgc2NhbiArIHBxSGFzaAogICAgcHVzaGludCA2IC8vIDYKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCA2IC8vIDYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMDIgLy8gMTAyCiAgICBkaWcgMwogICAgPj0KICAgIHB1c2hpbnQgMTAyIC8vIDEwMgogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1MC0xMTU0CiAgICAvLyBjb25zdCB2MyA9IEJ5dGVzLmZyb21IZXgoIjAzIikgLy8gdmVyc2lvbiAzCiAgICAvLyAgIC5jb25jYXQodTE2YmUodW5hbWVPZmYgKyAyKSkKICAgIC8vICAgLmNvbmNhdChyYXcuc2xpY2UoMywgNCkpIC8vIGJhdGNoQ291bnQKICAgIC8vICAgLmNvbmNhdCh1MTZiZShiYXRjaGVzT2ZmICsgMikpCiAgICAvLyAgIC5jb25jYXQocmF3LnNsaWNlKDYsIDEwMikpIC8vIGVuYyArIHNjYW4gKyBwcUhhc2gKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTU1CiAgICAvLyAuY29uY2F0KHUxNmJlKHJhdy5sZW5ndGggKyAyKSkgLy8gYmlvT2ZmID0gMTA0ICsgKHJhd0xlbiAtIDEwMikKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdChvcC5pdG9iKHgpLCA2LCAyKTsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUwLTExNTUKICAgIC8vIGNvbnN0IHYzID0gQnl0ZXMuZnJvbUhleCgiMDMiKSAvLyB2ZXJzaW9uIDMKICAgIC8vICAgLmNvbmNhdCh1MTZiZSh1bmFtZU9mZiArIDIpKQogICAgLy8gICAuY29uY2F0KHJhdy5zbGljZSgzLCA0KSkgLy8gYmF0Y2hDb3VudAogICAgLy8gICAuY29uY2F0KHUxNmJlKGJhdGNoZXNPZmYgKyAyKSkKICAgIC8vICAgLmNvbmNhdChyYXcuc2xpY2UoNiwgMTAyKSkgLy8gZW5jICsgc2NhbiArIHBxSGFzaAogICAgLy8gICAuY29uY2F0KHUxNmJlKHJhdy5sZW5ndGggKyAyKSkgLy8gYmlvT2ZmID0gMTA0ICsgKHJhd0xlbiAtIDEwMikKICAgIGNvbmNhdAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1NgogICAgLy8gLmNvbmNhdChyYXcuc2xpY2UoMTAyLCByYXcubGVuZ3RoKSkgLy8gZHluYW1pYyByZWdpb24sIHZlcmJhdGltCiAgICBkaWcgMgogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMTUwLTExNTYKICAgIC8vIGNvbnN0IHYzID0gQnl0ZXMuZnJvbUhleCgiMDMiKSAvLyB2ZXJzaW9uIDMKICAgIC8vICAgLmNvbmNhdCh1MTZiZSh1bmFtZU9mZiArIDIpKQogICAgLy8gICAuY29uY2F0KHJhdy5zbGljZSgzLCA0KSkgLy8gYmF0Y2hDb3VudAogICAgLy8gICAuY29uY2F0KHUxNmJlKGJhdGNoZXNPZmYgKyAyKSkKICAgIC8vICAgLmNvbmNhdChyYXcuc2xpY2UoNiwgMTAyKSkgLy8gZW5jICsgc2NhbiArIHBxSGFzaAogICAgLy8gICAuY29uY2F0KHUxNmJlKHJhdy5sZW5ndGggKyAyKSkgLy8gYmlvT2ZmID0gMTA0ICsgKHJhd0xlbiAtIDEwMikKICAgIC8vICAgLmNvbmNhdChyYXcuc2xpY2UoMTAyLCByYXcubGVuZ3RoKSkgLy8gZHluYW1pYyByZWdpb24sIHZlcmJhdGltCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjM1MwogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3Qob3AuaXRvYih4KSwgNiwgMik7CiAgICBieXRlY18xIC8vIDB4MDAwMAogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTE1MC0xMTU3CiAgICAvLyBjb25zdCB2MyA9IEJ5dGVzLmZyb21IZXgoIjAzIikgLy8gdmVyc2lvbiAzCiAgICAvLyAgIC5jb25jYXQodTE2YmUodW5hbWVPZmYgKyAyKSkKICAgIC8vICAgLmNvbmNhdChyYXcuc2xpY2UoMywgNCkpIC8vIGJhdGNoQ291bnQKICAgIC8vICAgLmNvbmNhdCh1MTZiZShiYXRjaGVzT2ZmICsgMikpCiAgICAvLyAgIC5jb25jYXQocmF3LnNsaWNlKDYsIDEwMikpIC8vIGVuYyArIHNjYW4gKyBwcUhhc2gKICAgIC8vICAgLmNvbmNhdCh1MTZiZShyYXcubGVuZ3RoICsgMikpIC8vIGJpb09mZiA9IDEwNCArIChyYXdMZW4gLSAxMDIpCiAgICAvLyAgIC5jb25jYXQocmF3LnNsaWNlKDEwMiwgcmF3Lmxlbmd0aCkpIC8vIGR5bmFtaWMgcmVnaW9uLCB2ZXJiYXRpbQogICAgLy8gICAuY29uY2F0KHUxNmJlKDApKTsgLy8gZW1wdHkgYmlvCiAgICBjb25jYXQKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjExNTgKICAgIC8vIHJldHVybiBhcmM0LmNvbnZlcnRCeXRlczxVc2VyU3RhdGU+KHYzLCB7IHN0cmF0ZWd5OiAidW5zYWZlLWNhc3QiIH0pOwogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6OlNlYWxlZC52YWxpZGF0ZU5hbWVGb3JtYXQobmFtZTogYnl0ZXMpIC0+IHZvaWQ6CnZhbGlkYXRlTmFtZUZvcm1hdDoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMjMKICAgIC8vIHByaXZhdGUgdmFsaWRhdGVOYW1lRm9ybWF0KG5hbWU6IGJ5dGVzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzI0CiAgICAvLyBjb25zdCBsZW4gPSBuYW1lLmxlbmd0aDsKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBkdXBuIDIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMjUKICAgIC8vIGFzc2VydChsZW4gPj0gTkFNRV9NSU4sICJCQURfTEVOIik7CiAgICBwdXNoaW50IDMgLy8gMwogICAgPj0KICAgIGFzc2VydCAvLyBCQURfTEVOCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzI2CiAgICAvLyBhc3NlcnQobGVuIDw9IE5BTUVfTUFYLCAiQkFEX0xFTiIpOwogICAgZHVwCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICA8PQogICAgYXNzZXJ0IC8vIEJBRF9MRU4KICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMjgKICAgIC8vIGFzc2VydChvcC5nZXRCeXRlKG5hbWUsIDApICE9PSBCWVRFX1VOREVSU0NPUkUsICJMRUFESU5HX1VOREVSU0NPUkUiKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgOTUgLy8gOTUKICAgICE9CiAgICBhc3NlcnQgLy8gTEVBRElOR19VTkRFUlNDT1JFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzMxCiAgICAvLyBvcC5nZXRCeXRlKG5hbWUsIGxlbiAtIDEpICE9PSBCWVRFX1VOREVSU0NPUkUsCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBnZXRieXRlCiAgICBwdXNoaW50IDk1IC8vIDk1CiAgICAhPQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTMzMC0xMzMzCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIG9wLmdldEJ5dGUobmFtZSwgbGVuIC0gMSkgIT09IEJZVEVfVU5ERVJTQ09SRSwKICAgIC8vICAgIlRSQUlMSU5HX1VOREVSU0NPUkUiLAogICAgLy8gKTsKICAgIGFzc2VydCAvLyBUUkFJTElOR19VTkRFUlNDT1JFCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzM1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp2YWxpZGF0ZU5hbWVGb3JtYXRfd2hpbGVfdG9wQDE6CiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzM1CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogdmFsaWRhdGVOYW1lRm9ybWF0X2FmdGVyX3doaWxlQDExCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzM2CiAgICAvLyBjb25zdCBiID0gb3AuZ2V0Qnl0ZShuYW1lLCBpKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzcmMvY29udHJhY3QuYWxnby50czoxMzM3CiAgICAvLyBjb25zdCBpc0FscGhhID0gYiA+PSBCWVRFX0FMUEhBX0xPICYmIGIgPD0gQllURV9BTFBIQV9ISTsKICAgIHB1c2hpbnQgOTcgLy8gOTcKICAgID49CiAgICBieiB2YWxpZGF0ZU5hbWVGb3JtYXRfYm9vbF9mYWxzZUA1CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCAxMjIgLy8gMTIyCiAgICA8PQogICAgYnogdmFsaWRhdGVOYW1lRm9ybWF0X2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKICAgIGZyYW1lX2J1cnkgMQoKdmFsaWRhdGVOYW1lRm9ybWF0X2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMzgKICAgIC8vIGNvbnN0IGlzRGlnaXQgPSBiID49IEJZVEVfRElHSVRfTE8gJiYgYiA8PSBCWVRFX0RJR0lUX0hJOwogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgID49CiAgICBieiB2YWxpZGF0ZU5hbWVGb3JtYXRfYm9vbF9mYWxzZUA5CiAgICBmcmFtZV9kaWcgMAogICAgcHVzaGludCA1NyAvLyA1NwogICAgPD0KICAgIGJ6IHZhbGlkYXRlTmFtZUZvcm1hdF9ib29sX2ZhbHNlQDkKICAgIGludGNfMSAvLyAxCgp2YWxpZGF0ZU5hbWVGb3JtYXRfYm9vbF9tZXJnZUAxMDoKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMzkKICAgIC8vIGNvbnN0IGlzVW5kZXJzY29yZSA9IGIgPT09IEJZVEVfVU5ERVJTQ09SRTsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDk1IC8vIDk1CiAgICA9PQogICAgLy8gc3JjL2NvbnRyYWN0LmFsZ28udHM6MTM0MAogICAgLy8gYXNzZXJ0KGlzQWxwaGEgfHwgaXNEaWdpdCB8fCBpc1VuZGVyc2NvcmUsICJCQURfQ0hBUiIpOwogICAgZnJhbWVfZGlnIDEKICAgIHVuY292ZXIgMgogICAgfHwKICAgIHx8CiAgICBhc3NlcnQgLy8gQkFEX0NIQVIKICAgIC8vIHNyYy9jb250cmFjdC5hbGdvLnRzOjEzMzUKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBsZW47IGkrKykgewogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgdmFsaWRhdGVOYW1lRm9ybWF0X3doaWxlX3RvcEAxCgp2YWxpZGF0ZU5hbWVGb3JtYXRfYm9vbF9mYWxzZUA5OgogICAgaW50Y18wIC8vIDAKICAgIGIgdmFsaWRhdGVOYW1lRm9ybWF0X2Jvb2xfbWVyZ2VAMTAKCnZhbGlkYXRlTmFtZUZvcm1hdF9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICBiIHZhbGlkYXRlTmFtZUZvcm1hdF9ib29sX21lcmdlQDYKCnZhbGlkYXRlTmFtZUZvcm1hdF9hZnRlcl93aGlsZUAxMToKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyALAAEgAoABoI0GgALgEsCEPYCglKWNHYDxBCYZAnc6AgAAAWEDAwBoAnB0AmM6AXICcGgEFR98dQJuOgJwcgFtAXQCcDoCAAEDBoEBCAAAAAAAAAAAAgBKAnI6AgBqBAMAaAEER019fwIAIgIAggSh3x2IMRtBANUxGRREMRhBAL6CGgSTefCZBMNrOpkE4Yd3XAQ83e+ZBNHhFQQEqNIFogTuInnPBDFB9BAEvirZ7wSFYL9CBAUg7rsEJzQ5lATsA69kBPQo9HoEadduhAQR+GqeBOFDnAwEhMVLMQTtc+bOBOKMBDQEzWDqaASlCqXxBDFKDQoEaxCc0wS9EurnBOB7Zw02GgCOGgVYBakGMwa3BsoHOAdtCIwIzwuNDYANow6eD0sP8hAVEPIRbBGVEakSYBRIFGIUjxS5FQoAgASROA2XNhoAjgEFBQAxGYEEEjEYEEQxADIJEkQjQ4oCAIv+gQoIiwAyDA1BACqxgQayEIEFshknD7IeJw+yH4v/jQIACwAEs0L/2zIAsgFC//UisgFC/++JigIBgACL/hVJIQYSRCJLAQ8iSwJPAk2BQEsCD4FASwNPAk2L/k8CSwJSSU4DTgOBwAFLAg+BwAFLA08CTYv+TwJLAlJOAyEGSwIPIQZPA08CTYv+TgJSTIv/FUkhBBJEIksBDyJLAk8CTSRLAg8kSwNPAk2L/08CSwJSgUBLAw+BQEsETwJNi/9PA0sCUoFgSwQPgWBLBU8CTYv/TwNLAlIhBEsFDyEETwZPAk2L/08DTwJSgEAvooqHunG4NI/PHHt/nKb+Vyn0tZoek2ve/2tUrWyXYCHoEdB1opAdMoTyihFnZXalIbi8iziP2pZpmJp9sZvMTwThAIBADJQ+8iof90s6o9eGcNATnbccAPxWCo5bd6dcE6/2Jlcg0AQ74VGFUmlu/4gfHsDtwSXSFGw1tCLgYWPtlaNbLEzgAIBAIZvfpzJP5YZDkNSTap8lypDdKxRibjekNVOqol3rVI8plNsI0HUOD5RgxXWz0JmsKSyJW59Iv3rCUW01XMeXWE8E4QDgAIBABt9GHWPBpPr4X1mexODVi1J1Ny6Eds+gJHhHLnBD+n8v2SBwHSwlH6Paz+4zmiIxctZR0+F9sfDSxRcQOMy+bE8D4QDgAIBAHnRo5P378/Jkuhr6qhujlL7PpfbgkD039A+o6sb8kxsB8wg+4p5XK1xwZ7Aa1N3tZ1VGNFs0Kw5MqP4haT/urE8C4QDgAExJFUmBQBJEIksBDyJLAk8CTSRLAg8kSwNPAk1LA08CSwJSTgOBQEsCD4FATwNPAk1SSYAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASQQHkiwGAQC1NmqfjAtnfQXSdVQeUnQXb6jP7sWxkOyL1maK+bfLiFL7dUDw3zrBh2OxgIJ/jRc6JgwoZIwMB8HbK/wBNGSZQiwRQiwNQiwKAgAMOGHhHrUx5g3TQ1nMr9QGEfdaLwOBxJB4CE7x/wT23qwlnAy/L93bRr8mF+Ih38YLThICmU/Leyql5TLw78wYMFznBsaRXqMcxMSPSTS+RkviWt8Y+6gWp1X8GVHrQzsgwTPvR4IpwSpn16EfZP4w8qv3exGt6DTedpppNESNGpxgA3u8SHx52QmoAZl5cRHlnQyLU917a3UbevVzZkvbtGY6Tk5INSDpyYL+3MftdJfGqSTM1qecSl+SFt67zEsISyF6l24xt60qrcYCNy0CP49HnaQxD03tM5swBZvp9qgkGidBYX/B17J6ZrWkMM5W8SzEzcLOO81Ws2tzRIpdbLu5R6QCHRr8pgy7v/+roR9n4w0ro+rG5yJ8I0JZtmu8Q+6q4jLyCFIFojUoIT7J+1m17NGgYhV+s0GeA3xHLEx66bTK+4eG84k4aEYZrM9IhUyJFTYFw0VXZVYyfHa7QGC0jy2UOAg80mLV/BcLYnT8SSdskG3QJsEQMtB+Y5CJQSwEVIQYSREkVgYAEEkTiAIwAiYAgMGROcuExoCm4UEW2gYFYXZeBapFoccqNPCCMFth8/UeLBqFJFUmMACQSQQAHiwVMUEL96IsASSQMRCRMCa9MUEL/6ooBAYv/FUkkEkEABIv/TImLAEkkDEQkTAmvi/9QTIk2GgFJFSQSRDYaAkkVJBJENhoDSRWBCBJENhoESRWBCBJEJwxPBGcqTwNnTBcnBkxnJwuBDGcXJwpMZycHImcnBCJnI0M2GgFJIlklCEsBFRJEVwIANhoCSRWBCBJESwEVJBJEMQAiKmVEEkQnBUsCUEm9RQEURDIGFksCSwFQJxBQTwJMv04CUExQgATOpMeZTFCwI0M2GgFHAiJZSU4CSSQLJQhPAhUSRDEAIiplRBJESUSBBA5EIicEZUQiSUsDDEEAPksDVwIASwFJTgIkCyRYJwVLAVBJvUUBRL5IgRBbFERLA0sCCBYnDUxQSb1FARRESwEVJBJETL8jCEUBQv+7SwFLA0lOAggnBEsBZ0wWTBZQgATbPnA+TFCwI0M2GgFHAhWBCBJEMQAiKmVEEkQXRwJESYEEDkQiJwdlRCInBGVMSU4CTgRETAkORCJJSwMMQQAzSwEjCUsBSU4CCRYnDUxQSb1FAURJvkgnBUxQSb1FAURJvkiBEFsURLxIvEgjCEUBQv/GSwFLAwknBEsBZxZLBExQgASBdSnkTFCwI0MiJwRlRCInB2VECRYnCExQsCNDNhoBRwIiWUlOAkkkCyUITwIVEkQxACIqZUQSRElEgQgORCInBmVEMgYiSUsEDEEAL0sEVwIASwFJTgIkCyRYJwVMUEm9RQFESb5IgRBbSURLBQhLBAxEvEgjCEUBQv/KSwMWgARwHPWsTFCwI0M2GgFJFYEIEkQxACIqZUQSREkXSSEID0RJIQkORCInCmVEJwpPAmcWTFCABHo169FMULAjQyJJgABJNhoBSRWBCBJENhoCSU4CFSQSRBdHAkRJgQQORDIEJRJEMRYjEkQiOBAjEkQiOAAxABJEIjgHMgoSRCInCmVECyI4CBJEIjgJMgMSRCI4IDIDEkQhByOI+FUiSUkkDEEAFEsDSwFJTgJVSwMZRQMjCEUBQv/mSwFEIicHZUxJTgJFCEQiJwRlREwJSwMPRClFBzIGFkUIIkUFSwRLAwxBAFdLBUsFSU4CCBYnDUxQSb1FAURJvkgnBUsBUEm9RQFESb5ISYEQWxRESVcACExXCAhQSwxQv0y8SEkVJBJESwhJTwJQTCJZIwgWVwYCXABFCCMIRQVC/6FLBUsDCCcHTGcxAEsEUCcRUEsIUEsHUIAErYB4+UxQsCNDNhoBSRUkEkQ2GgJJFYEIEkQxACIqZUQSREkXRCcSSwJQSb1FARREMgYWSwJLAVBPAky/TgJQTFCABGfsobhMULAjQyJHAoAARwI2GgFHAhUkEkQ2GgJJTgJJFSQSRDYaA0kiWSUISwEVEkRXAgA2GgRJIlklCEsBFRJEVwIANhoFSU4FSSJZJQhLARVJTgcSRFcCAElOBU4FiA1jSwEVIQYSREkVSSEEEkQnEksFUEm9RQFEvkhXAAhJTgROB4ADbmI6SwVQSb1FARREIksCDyJLA08CTSRLAw8kSwRPAk1LBE8CSwJSgUBLBA+BQEsFTwJNSwVPA0sCUoFgSwUPgWBLBk8CTUsGTwNLAlIhBEsGDyEETwdPAk1LBk8DTwJSTwNPCRJETwJPBxJEMQCAIDBkTnLhMaApuFBFtoGBWF0oM+hIeblwkUPh9ZPwAAABqoj7FE8CEkRPBIj7CxJEIQoiiPYvTgKI9mVEMgYWvxVJQQAUSwJJiA1MAScJTFBJvUUBFEQxAL8xAElFDChMUElFDjIGIicGZUQIFksDTFBMvUUBQQEcSwuIDHZJgQNVSUULIicLZUQMREmBBFlLAYFmWUsCSwJLAlJJTwVQTCJZIwgWVwYCXABLAyJLBFhLAVBLBBVPBUsETwJSUEsCTwQJTwIVTwMITAkWVwYCXGZJRQ1JI1lLAYEEWUlFDVJLAUEABiJZFERLBEsIIwgWSZOBCA5EVwcBSw1JgWZZSwFLDksCUksCVwYgSwNXJiBLBFdGIEsFFU8GTwZPAlJPBklOBhWBaAgrTwhQSwEWVwYCUEsGFU8CCExPBVBPBFBPA1BMFlcGAlBPA1BPAlBMUEsNSbxITL8xAGBJRQohBQxBABMhBUsJCbExALIHsggjshAisgGzMQBLB0sHUEsDUExQJxNQSwVQgARVEM7bTFCwI0MpTFAnDlwAJK+BaEsGCEkWVwYCJxRMUEsDFU8CCExLAlBLAlBPAlBMFlcGAlBLBlBMUClQSw1JvEhMv0L/hiJHA4AARwM2GgFJIlklCEsBFRJEVwIANhoCSU4CSSJZJQhLARVJTgQSRFcCAEyICs1JFYEQEkQBSScFTFBHAr1FAUS+SIEQW0lBAAwyBiInBmVESwIIDkRLAUm+RFcACEUOvEhLAxVJRQhBABRLA0mIC1IBJwlMUEm9RQEURDEAvzEASUUMKExQSUUPMgYiJwZlRAgWSw5MUEy9RQFBARVLC4gKfEmBA1VJRQsiJwtlRAxESYEEWUsBgWZZSwJLAksCUklPBVBMIlkjCBZXBgJcAEsDIksEWEsBUEsEFU8FSwRPAlJQSwJPBAlPAhVPAwhMCRZXBgJcZklFDUkjWUsBgQRZSUUNUksHQQAGIlkUREsFSwgjCBZJk4EIDkRXBwFLDUmBZllLAUsOSwJSSwJXBiBLA1cmIEsEV0YgSwUVTwZPBk8CUk8GSU4GFYFoCCtPCFBLARZXBgJQSwYVTwIITE8FUE8EUE8DUEwWVwYCUE8DUE8CUExQSw5JvEhMvzEAYElFCiEFDEEAEyEFSwkJsTEAsgeyCCOyECKyAbMxAEsDSw5QTFAnEVBLBlAnFUxQsCNDKUxQJw5cACSvgWhLBwhJFlcGAicUTFBLAxVPAghMSwJQSwJQTwJQTBZXBgJQSwdQTFApUEsOSbxITL9C/402GgEVJBJENhoCSSJZJQhLARUSRFcCAIgI8TEAiAeiSLAjQzYaAUcCIlklCEsBFUlOAxJEVwIAiAjRIQciiPJgSYgJjjEAiAd4TDEAKEsBUE4CTAEnCUxQSU4CvUUBFESICMtHAiNZSwGBBFlJTgNSSSJZQQAXSVcCAAEnCUxQSb1FAURJvkgxABJEvEhLAzEAv0sCSVcDAUsBgWZZSwJLBUsCUksDVwYgSwRXJiBLBVdGIEsGFU8HTwZPAlKBaEsNCCtPB1BLARZXBgJQSwYVTwIITE8FUE8EUE8DUEwWVwYCUEsKSU4DUE8DUExQSwZJvEhMvzEAgAIAJFBLAklOAhWBJAgWVwYCUExQTFCABJ4wuiVMULBLBYgH3CNDiAfqIQciiPF5MQCIBpUxAChLAVBMiAf4SSNZSwGBBFlLAk8CSwJSSSJZRElXAgABJwlMUEm9RQFESb5IMQASRLxISwJXAwFLA4FmWUsETwRLAlJLBFcGIEsFVyYgSwZXRiBLBxVPCE8GTwJSK08GUCcTUEsFFYFqCExPBVBPBFBPA1BMFlcGAlApUE8CUExQSwK8SE8CTL8xACcWUExQgASqtfMOTFCwiAcvI0M2GgFJIlklCEsBFRJESVcCAIgHLCEHIojwuxWBoAEORDEAiAXRKDEAUDEAiAc1SSNZSwGBBFlLAk8CSwJSSwJXAwFLA4FmWUsETwRPAlJLA1cGIEsEVyYgTwVXRiBLBRWBaAgrTwZQSwEWVwYCUEsFFU8CCExPBFBPA1BPAlBMFlcGAlBPAlBMUEsDUEsBvEi/MQAnFlBPAlCABJcxBmNMULCIBogjQzYaAUkiWSUISwEVEkRXAgABJwlMUEm9RQFEvkgnCExQsCNDIjYaAUkVJBJEKEsBUElOAr1FAUSIBoJJMgZMgQNVKSJJSUsEDEEAREsFSYEEWUsBgWZZUlcCAEsBgRALgRBYSUUJgQhbSwUOQAAZSwJJSwlQTCJZIwgWVwYCXABFA0sBIwhFAkkjCEUBQv+1SwVJI1lLAYEEWUsCTgJSSwMWSZOBCA5EVwcBSwJXBiBLA1cmIEsEV0YgSwWBZllLBhVPB04CUksFFYFoCCtPBlBLARZXBgJQSwlJTgMVTwIITE8GUE8FUE8EUEwWVwYCUE8DUExQTFBLB0m8SEy/I0MiSYAARwM2GgFHAhUkEkQoTFC9RQFAAAknECcITFCwI0NJiAWXSUUHMgZFBYEDVUUFIkUCIkUDSwJLBQxBADVLBUmBBFlLAYFmWVJXAgBLA4EQC4EQWElFCIEIW0sEDkAACUsGIltLAghFAksCIwhFA0L/w0sBFkL/oDYaAUkVgQgSRDYaAkkVJBJEMQAiKmVEEkSxTBeyCLIHI7IQIrIBsyNDNhoBSRUkEkQxADIJEkQnDExnI0M2GgFJFSQSRDYaAkkVJBJENhoDSSJZJQhLARUSRElXAgCIBL5JFUkkD0SBgBAORAExAIgDYygxAFAxAIgEx0kjWUsBgQRZSwJPAksCUksCVwMBSwOBZllLBE8ESwJSSwQVTwVPA08CUksDFYFoCCtPBFBLARZXBgJQSwMVTwIITEsKUEsJUEsHUEwWVwYCUE8DUE8CUExQSwG8SL8xAE8FUE8EUCcXUE8CUE8CUCcYTFCwiAQaI0MiRwOAADYaAUkiWSUISwEVEkRXAgA2GgJJTgIVJBJENhoDSU4CFSQSRDYaBElOAkkiWSUISwEVEkRXAgBJTgKIA+lLARWBEBJEFUkkD0SBgBAORAFJJwVMUEcCvUUBRL5IgRBbSUEADDIGIicGZURLAggOREsBSb5EVwAISU4CRQ28SEsEAUULMQBJRQsoTFBJRQ4yBiInBmVECBZPAkxQTL1FAUEBDksJiAOiSYEDVSInC2VESwENREsBgQRZSwKBZllLA0sCSwJSSU8GUEwiWSMIFlcGAlwASwQiSwRYSwFQSwUVTwZLBE8CUlBLAk8ECU8CFU8DCEwJFlcGAlxmSSNZSwGBBFlLAk8CSwJSTwMjCBZJk4EIDkRXBwFLA4FmWUsETwRLAlJLBBVPBU8DTwJSSwMVgWgIK08EUEsBFlcGAlBLAxVPAghMSwtQSwpQSw5QTBZXBgJQTwNQTwJQTFBLDEm8SEy/MQBgSUUJIQUMQQATIQVLCAmxMQCyB7III7IQIrIBszEASwNLDFBMUIAEAEoAAFAnFUxQsDEASwdQSwZQJxdQSwpQSwVQJxhMULAjQylMUCcOXABJFYFqCIAGAwBoAQBqSwlQSwhQSwxQTBZXBgJQKVBMUClQSwxJvEhMv0L/gTYaAUkVJBJEKEsBUL1FAUSIAlMnCExQsCNDNhoBSRUkEkQoSwFQvUUBRIgCOUlXBiBLAVcmIE8CV0YgTgJQTFAnCExQsCNDNhoBSRWBCBJEMQAiKmVEEkQXSSEID0RJIQkORCcKTGcnByJnJwQiZyNDIjYaAUcCIllJTgJJJAslCE8CFRJEMQAiKmVEEkRJRIEIDkQiSUsCDEEAJEsCVwIASwEkCyRYJwVMUElFBb1FAUEABEsDvEhJIwhFAUL/1SNDNhoBSSJZJQhLARUSRFcCADYaAkkiWSUISwEVEkRXAgAhCiKI6vCI6yiAAQAiTwJUJwhMULAjQ4oBASJJgAAoi/9QSb1FAUSL/4gBWEkyBkwpTCJMIkwiTIEDVSKLC4sKDEEAk4sESYEEWUsBgWZZUlcCAIsLgRALgRBYSYwBSVcICIwAgQhbiwUOQAA7iwdAAD+LASJbSYwCIw1BACeLAiMJSRaLAFCLBklPAlBMIlkjCBZXBgJcAIwGiwgjCIwIiwkIjAkjjAeLCyMIjAtC/4uLBkmLAUlOA1BMIlkjCBZXBgJcAIwGiwgjCIwIIluLCQiMCUL/0YsHRIsESSNZSwGBBFlLAk4CUosIFkmTgQgORFcHAUsCVwYgSwNXJiBLBFdGIEsFgWZZSwYVTwdOAlJLBRWBaAgrTwZQSwEWVwYCUIsGSU4DFU8CCExPBlBPBVBPBFBMFlcGAlBPA1BMUExQiwNJvEhMv4sJjACJigEAMQCL/xZQgAR3pfftTFCwiTIEJRJEMRYjEkQiOBAjEkQiOAAiJwxlRBJEIjgBgdAPD0SJigEBKIv/UL5MSU8CRCJVSU4CgQMSQQACTImLACUSREkjWUsBgQRZTCUIFlcGAoABA0xQSwIVgQNLAQ+BA0sCTwJNgQRLAg+BBEsDTwJNSwVOAlJPAkxQTwIlCBZXBgJQgQZLAg+BBksDTwJNgWZLAw+BZksETwJNSwRPAksCUk8CTFBLAiUIFlcGAlBLAksCDE8DSwNPAk1PA08DTwJSUClQTImKAQCAAEmL/xVHAoEDD0RJgRQORIv/IlWBXxNEIwmL/0xVgV8TRCKLA4sCDEEASYv/iwNVSYwAgWEPQQA1iwCBeg5BAC0jjAGLAIEwD0EAHosAgTkOQQAWI4sAgV8SiwFPAhERRIsDIwiMA0L/uSJC/+cijAFC/9CJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "CommitmentRegistered", "args": [ { "type": "byte[32]", "name": "commitment" }, { "type": "uint64", "name": "denomination" }, { "type": "uint64", "name": "postedAtRound" } ], "desc": "ARC28 event emitted on `registerCommitment`." }, { "name": "PoolSeeded", "args": [ { "type": "uint64", "name": "count" }, { "type": "uint64", "name": "newTail" } ], "desc": "ARC28 event emitted on `seedSalePool`." }, { "name": "PoolUnseeded", "args": [ { "type": "uint64", "name": "count" }, { "type": "uint64", "name": "newTail" } ], "desc": "ARC28 event emitted on `unseedSalePool`." }, { "name": "ExpiredReclaimed", "args": [ { "type": "uint64", "name": "count" } ], "desc": "ARC28 event emitted on `reclaimExpired` \u2014 admin frees `c:` box MBR." }, { "name": "PriceChanged", "args": [ { "type": "uint64", "name": "oldPrice" }, { "type": "uint64", "name": "newPrice" } ], "desc": "ARC28 event emitted on `setPrice`." }, { "name": "CommitmentsSold", "args": [ { "type": "address", "name": "buyer" }, { "type": "byte[32]", "name": "deliveryPubkey" }, { "type": "byte[32][]", "name": "commitments" }, { "type": "uint64", "name": "purchasedAtRound" } ], "desc": "ARC28 event emitted on `purchaseCodes` \u2014 the wire to the off-chain\npreimage-server. Server watches this stream, decrypts the matching\npreimages to `deliveryPubkey`, and posts ciphertext for buyer retrieval." }, { "name": "RootPosted", "args": [ { "type": "byte[32]", "name": "root" }, { "type": "uint64", "name": "denomination" }, { "type": "uint64", "name": "postedRound" } ], "desc": "ARC28 event emitted on `postRoot` (SPEC-snark-redeem-B \u00a74)." }, { "name": "RedeemedWithProof", "args": [ { "type": "byte[32]", "name": "root" }, { "type": "byte[32]", "name": "nullifier" }, { "type": "uint64", "name": "denomination" }, { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "username" } ], "desc": "ARC28 event emitted on `redeemWithProof` (SPEC-snark-redeem-B \u00a74)." }, { "name": "Redeemed", "args": [ { "type": "byte[32]", "name": "commitment" }, { "type": "uint64", "name": "denomination" }, { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "username" } ], "desc": "ARC28 event emitted on `redeem`." }, { "name": "UsernameClaimed", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "oldName" }, { "type": "byte[]", "name": "newName" } ], "desc": "ARC28 event emitted on first claim or rename of a username." }, { "name": "CreditSpent", "args": [ { "type": "address", "name": "wallet" }, { "type": "uint64", "name": "remaining" } ], "desc": "ARC28 event emitted whenever an identity-mutating op spends 1 credit\n(`publishKeys`, `claimUsername`, `releaseUsername`, `sendMessage`).\n`remaining` is the post-spend live credit total for the wallet, computed\nfrom the kept batches in the same `spendOneCredit` walk \u2014 zero extra\nbox reads. Indexer uses this as a cheap running balance signal." }, { "name": "UsernameReleased", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "name" } ], "desc": "ARC28 event emitted on release of a username." }, { "name": "BioChanged", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[]", "name": "bio" } ], "desc": "ARC28 event emitted on `setBio`. Empty `bio` = cleared." }, { "name": "KeysPublished", "args": [ { "type": "address", "name": "wallet" }, { "type": "byte[32]", "name": "encryptionPubkey" }, { "type": "byte[32]", "name": "scanPubkey" }, { "type": "byte[]", "name": "pqPubkey" }, { "type": "byte[32]", "name": "pqPubkeyHash" } ], "desc": "ARC28 event emitted on `publishKeys`.\n\nCarries the full pq pubkey (up to 2048 bytes) in the event log so indexer\ncan cache it. On-chain box stores only `pqPubkeyHash` (32 bytes). Clients\nverify indexer-served pq pubkey hashes against this anchor before use." } ], "templateVariables": {} }