snarkjs-algorand 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -33,6 +33,8 @@ __export(index_exports, {
33
33
  AppVerifier: () => AppVerifier,
34
34
  LsigVerifier: () => LsigVerifier,
35
35
  PlonkVerifierClient: () => PlonkVerifierClient,
36
+ SignalsAndProofClient: () => SignalsAndProofClient,
37
+ SignalsAndProofFactory: () => SignalsAndProofFactory,
36
38
  encodeProof: () => encodeProof,
37
39
  encodeSignals: () => encodeSignals,
38
40
  encodeVk: () => encodeVk,
@@ -51,7 +53,7 @@ var import_app_factory = require("@algorandfoundation/algokit-utils/types/app-fa
51
53
  var import_composer = require("@algorandfoundation/algokit-utils/types/composer");
52
54
  var import_transaction = require("@algorandfoundation/algokit-utils/types/transaction");
53
55
  var import_algosdk = require("algosdk");
54
- var APP_SPEC = { "name": "PlonkVerifier", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 2059, 2263, 2280, 2290, 2318, 2327, 2338, 2345, 2355], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2562], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1490, 1505, 2006, 2016, 2025, 2034, 2043], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1526, 1699], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMzIgOTYgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSBUTVBMX1JPT1RfT0ZfVU5JVFkgMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHg5NWMxMGNlNCAweDQzZDkwYTM4IC8vIG1ldGhvZCAiX2R1bW15KChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVsxOTJdKSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnkodWludDI1NltdLChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nikpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fX2R1bW15X3JvdXRlQDMgbWFpbl92ZXJpZnlfcm91dGVANAoKbWFpbl9hZnRlcl9pZl9lbHNlQDExOgogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUA0OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX19kdW1teV9yb3V0ZUAzOgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzUKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJDbG9zZU91dCIgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMiAvLyBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IENsb3NlT3V0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXIgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjIKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyMwogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllci52ZXJpZnkoc2lnbmFsczogYnl0ZXMsIHByb29mOiBieXRlcykgLT4gdm9pZDoKdmVyaWZ5OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgaW50Y18zIC8vIDAKICAgIGR1cG4gMzMKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzE5CiAgICAvLyByZXR1cm4gdmVyaWZ5V2l0aExvZ3MoZGVjb2RlVmsodmtCeXRlcyksIHNpZ25hbHMsIHByb29mKTsKICAgIGJ5dGVjIDUgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTQKICAgIC8vIFFtOiB2a0J5dGVzLnNsaWNlKDAsIDk2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDEKICAgID49CiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBpbnRjXzEgLy8gOTYKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDk2CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTUKICAgIC8vIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA1IC8vIDE5MgogICAgZGlnIDMKICAgID49CiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTYKICAgIC8vIFFyOiB2a0J5dGVzLnNsaWNlKDE5MiwgMjg4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNiAvLyAyODgKICAgIGRpZyA0CiAgICA+PQogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk3CiAgICAvLyBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDQgLy8gMzg0CiAgICBkaWcgNQogICAgPj0KICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDYKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OAogICAgLy8gUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA3IC8vIDQ4MAogICAgZGlnIDYKICAgID49CiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA3CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTkKICAgIC8vIFMxOiB2a0J5dGVzLnNsaWNlKDQ4MCwgNTc2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOCAvLyA1NzYKICAgIGRpZyA3CiAgICA+PQogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDgKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAwCiAgICAvLyBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDkgLy8gNjcyCiAgICBkaWcgOAogICAgPj0KICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA5CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwMQogICAgLy8gUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyA5CiAgICA+PQogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAyCiAgICAvLyBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDEwCiAgICA+PQogICAgaW50YyAxMSAvLyA3NzYKICAgIGRpZyAxMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAzCiAgICAvLyBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTEKICAgID49CiAgICBpbnRjIDEyIC8vIDc4NAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDQKICAgIC8vIGsxOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzg0LCA3OTIpKSwKICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTIKICAgID49CiAgICBpbnRjIDEzIC8vIDc5MgogICAgZGlnIDEzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEzCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDUKICAgIC8vIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTMKICAgID49CiAgICBpbnRjIDE0IC8vIDgwMAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDYKICAgIC8vIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgaW50YyAxNSAvLyA5OTIKICAgIGRpZyAxNAogICAgPj0KICAgIGludGMgMTUgLy8gOTkyCiAgICB1bmNvdmVyIDE1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDUgLy8gMTkyCiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDE5MgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjkzLTMwNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbDogdmtCeXRlcy5zbGljZSg5NiwgMTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFjOiB2a0J5dGVzLnNsaWNlKDM4NCwgNDgwKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMzOiB2a0J5dGVzLnNsaWNlKDY3MiwgNzY4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgcG93ZXI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NjgsIDc3NikpLAogICAgLy8gICBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIC8vICAgazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgLy8gICBrMjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc5MiwgODAwKSksCiAgICAvLyAgIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgLy8gfTsKICAgIHVuY292ZXIgMTIKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQzOQogICAgLy8gbGV0IHRkID0gb3AuY29uY2F0KHZrLlFtLCB2ay5RbCk7CiAgICBleHRyYWN0IDAgOTYKICAgIGRpZyAxCiAgICBleHRyYWN0IDk2IDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFyKTsKICAgIGRpZyAxCiAgICBleHRyYWN0IDE5MiA5NgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDEKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5Rbyk7CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFjKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQzCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzEpOwogICAgZGlnIDEKICAgIGludGMgNyAvLyA0ODAKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDQKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMik7CiAgICBkaWcgMQogICAgaW50YyA4IC8vIDU3NgogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMzKTsKICAgIHN3YXAKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDcKICAgIC8vIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NwogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIDQ3CiAgICBmcmFtZV9kaWcgNDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDQ3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGIzMihmclNjYWxhcihzaWduYWwubmF0aXZlKSkpOwogICAgY2FsbHN1YiBiMzIKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQ1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0NwogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5CKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA5NiA5NgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDE5MiA5NgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU2CiAgICAvLyBjb25zdCBiZXRhID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGdhbW1hID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGR1cAogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGdhbW1hLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5aKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDcwCiAgICAvLyBjb25zdCBhbHBoYSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzcKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDgKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDc5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODAKICAgIC8vIGNvbnN0IHhpID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4NwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODY0IC8vIDg2NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODk2IC8vIDg5NgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYy5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTI4IC8vIDkyOAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczEuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDk2MCAvLyA5NjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTEKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3MyLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyAxNSAvLyA5OTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3p3LmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTQKICAgIC8vIGNvbnN0IHYgPSBuZXcgRml4ZWRBcnJheTxVaW50MjU2LCA2PigpOwogICAgaW50YyA1IC8vIDE5MgogICAgYnplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NQogICAgLy8gdlsxXSA9IGdldENoYWxsZW5nZSh0ZCk7IC8vIHYxCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgcmVwbGFjZTIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDM1Cgp2ZXJpZnlfd2hpbGVfdG9wQDU6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUA3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTcKICAgIC8vIHZbaV0gPSBuZXcgVWludDI1Nihmck11bCgodltpIC0gMV0gYXMgVWludDI1NikubmF0aXZlLCB2WzFdLm5hdGl2ZSkpOyAvLyB2W2ldID0gdjFeaQogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZGlnIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBiIHZlcmlmeV93aGlsZV90b3BANQoKdmVyaWZ5X2FmdGVyX3doaWxlQDc6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDQKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5XeGkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDkgLy8gNjcyCiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aXcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDEwIC8vIDc2OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIzCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyOAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA2CiAgICAvLyBjb25zdCB1ID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDgtNTE3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBiZXRhLAogICAgLy8gICBnYW1tYSwKICAgIC8vICAgYWxwaGEsCiAgICAvLyAgIHhpLAogICAgLy8gICB2LAogICAgLy8gICB1LAogICAgLy8gICB4aW46IG5ldyBVaW50MjU2KCksCiAgICAvLyAgIHpoOiBuZXcgVWludDI1NigpLAogICAgLy8gfTsKICAgIGZyYW1lX2RpZyA0NQogICAgZnJhbWVfZGlnIDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMjkKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OAogICAgLy8gZGVidWdMb2coImJldGEiLCBjaGFsbGVuZ2VzLmJldGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHB1c2hieXRlcyAiYmV0YSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OQogICAgLy8gZGVidWdMb2coImdhbW1hIiwgY2hhbGxlbmdlcy5nYW1tYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIHB1c2hieXRlcyAiZ2FtbWEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODAKICAgIC8vIGRlYnVnTG9nKCJhbHBoYSIsIGNoYWxsZW5nZXMuYWxwaGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICBwdXNoYnl0ZXMgImFscGhhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgxCiAgICAvLyBkZWJ1Z0xvZygieGkiLCBjaGFsbGVuZ2VzLnhpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMgogICAgcHVzaGJ5dGVzICJ4aSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgyCiAgICAvLyBkZWJ1Z0xvZygidSIsIGNoYWxsZW5nZXMudS5ieXRlcyk7CiAgICBkaWcgMQogICAgcHVzaGludCAzMjAgLy8gMzIwCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODMKICAgIC8vIGRlYnVnTG9nKCJ4aW4iLCBjaGFsbGVuZ2VzLnhpbi5ieXRlcyk7CiAgICBkaWcgMQogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAieGluIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg0CiAgICAvLyBkZWJ1Z0xvZygiemgiLCBjaGFsbGVuZ2VzLnpoLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInpoIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg1CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgc3dhcAogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbMV0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUtMzg2CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NgogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAidlsyXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NwogICAgLy8gZGVidWdMb2coInZbM10iLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlszXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OAogICAgLy8gZGVidWdMb2coInZbNF0iLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbNF0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODkKICAgIC8vIGRlYnVnTG9nKCJ2WzVdIiwgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls1XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMQogICAgLy8gbGV0IGRvbWFpblNpemU6IHVpbnQ2NCA9IDE7CiAgICBpbnRjXzIgLy8gMQogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2J1cnkgMzMKCnZlcmlmeV93aGlsZV90b3BAMTA6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTAgLy8gNzY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM1CiAgICA+CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDMzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzQKICAgIC8vIGRvbWFpblNpemUgKj0gMjsKICAgIGZyYW1lX2RpZyAzNAogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGZyYW1lX2J1cnkgMzQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxMAoKdmVyaWZ5X2FmdGVyX3doaWxlQDEyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM3CiAgICAvLyBjaGFsbGVuZ2VzLnhpbiA9IG5ldyBVaW50MjU2KHhpbik7CiAgICBmcmFtZV9kaWcgMzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBkdXAyCiAgICBifAogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjIDE2IC8vIDM1MgogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM4CiAgICAvLyBjaGFsbGVuZ2VzLnpoID0gbmV3IFVpbnQyNTYoZnJTdWIoeGluLCBCaWdVaW50KDEpKSk7IC8vIFZhbmlzaGluZyBwb2x5bm9taWFsIFpfSCjOvikgPSDOvl5uIC0gMQogICAgdW5jb3ZlciAyCiAgICBieXRlY18yIC8vIDB4MDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMgogICAgYnwKICAgIGludGMgNCAvLyAzODQKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDAKICAgIC8vIGNvbnN0IG4gPSBmclNjYWxhcihCaWdVaW50KGRvbWFpblNpemUpKTsKICAgIGZyYW1lX2RpZyAzNAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAyMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTQ2CiAgICAvLyBsZXQgdyA9IEJpZ1VpbnQoMSk7CiAgICBieXRlY18yIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1NQogICAgLy8gY29uc3QgTDogVWludDI1NltdID0gW25ldyBVaW50MjU2KCldOwogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU4CiAgICAvLyBjb25zdCBpdGVyYXRpb25zOiB1aW50NjQgPSB2ay5uUHVibGljID09PSAwID8gMSA6IHZrLm5QdWJsaWM7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTEgLy8gNzc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBibnogdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM2Cgp2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM3Cgp2ZXJpZnlfd2hpbGVfdG9wQDE2OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBmcmFtZV9kaWcgMzYKICAgIDw9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MwogICAgLy8gZnJNdWwodywgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZnJhbWVfZGlnIDE3CiAgICBkdXAKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2NAogICAgLy8gZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA5NiAzMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBmcmFtZV9kaWcgMjIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTEKICAgIC8vIGFzc2VydCh4ICE9PSAoMG4gYXMgYmlndWludCksICJGciBpbnZlcnNlIG9mIHplcm8iKTsKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBhc3NlcnQgLy8gRnIgaW52ZXJzZSBvZiB6ZXJvCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIHB1c2hieXRlcyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZlZmZmZmZmZmYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkwCiAgICAvLyBsZXQgcmVzdWx0ID0gMW4gYXMgYmlndWludDsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkxCiAgICAvLyBsZXQgYjogYmlndWludCA9IGJhc2UgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMwogICAgZnJhbWVfYnVyeSAxOAoKdmVyaWZ5X3doaWxlX3RvcEAxODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkzCiAgICAvLyB3aGlsZSAoZSA+ICgwbiBhcyBiaWd1aW50KSkgewogICAgZnJhbWVfZGlnIDE4CiAgICBieXRlY18xIC8vIDB4CiAgICBiPgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMtOTkKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgIGlmICgoZSAmICgxbiBhcyBiaWd1aW50KSkgIT09ICgwbiBhcyBiaWd1aW50KSkgewogICAgLy8gICAgIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIC8vICAgfQogICAgLy8gICBiID0gKGIgKiBiKSAlIG1vZDsKICAgIC8vICAgZSA9IGUgLyBCaWdVaW50KDIpOwogICAgLy8gfQogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NAogICAgLy8gaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgYiYKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGIhPQogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDI2CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGZyYW1lX2RpZyAyNQogICAgZnJhbWVfZGlnIDEzCiAgICBiKgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDI2Cgp2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTcKICAgIC8vIGIgPSAoYiAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDEzCiAgICBkdXAKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTgKICAgIC8vIGUgPSBlIC8gQmlnVWludCgyKTsKICAgIGZyYW1lX2RpZyAxOAogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDE4CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMTgKCnZlcmlmeV9hZnRlcl93aGlsZUAyMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIChhTiAqIGJJbnYpICUgcjsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMjUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MS01NjYKICAgIC8vIG5ldyBVaW50MjU2KAogICAgLy8gICBmckRpdigKICAgIC8vICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIC8vICAgKSwKICAgIC8vICksCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MC01NjcKICAgIC8vIEwucHVzaCgKICAgIC8vICAgbmV3IFVpbnQyNTYoCiAgICAvLyAgICAgZnJEaXYoCiAgICAvLyAgICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICAgICksCiAgICAvLyAgICksCiAgICAvLyApOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY4CiAgICAvLyB3ID0gZnJNdWwodywgUk9PVF9PRl9VTklUWSk7IC8vIE5leHQgcm9vdCBvZiB1bml0eSBzdGVwICjPiV5pKQogICAgYnl0ZWNfMyAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzcKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDIzOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTcwCiAgICAvLyByZXR1cm4geyBMLCBjaGFsbGVuZ2VzIH07CiAgICBwdXNoYnl0ZXMgMHgwMWEyCiAgICBmcmFtZV9kaWcgMTcKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5Mi0zOTYKICAgIC8vIGNvbnN0IHsgTCwgY2hhbGxlbmdlczogdXBkYXRlZENoYWxsZW5nZXMgfSA9IGNhbGN1bGF0ZUxhZ3JhbmdlRXZhbHVhdGlvbnMoCiAgICAvLyAgIGNoYWxsZW5nZXMsCiAgICAvLyAgIHZrLAogICAgLy8gKTsKICAgIC8vIGRlYnVnTG9nKCJMMSh4aSkiLCAoTFsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAyCiAgICBleHRyYWN0IDM0IDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NgogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiTDEoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgwCiAgICAvLyBsZXQgcGkgPSBCaWdVaW50KDApOwogICAgYnl0ZWNfMSAvLyAweAogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHVibGljU2lnbmFscy5sZW5ndGg7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BAMjY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODIKICAgIC8vIGNvbnN0IHcgPSBmclNjYWxhcigocHVibGljU2lnbmFsc1tpXSBhcyBVaW50MjU2KS5uYXRpdmUpOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MwogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgc3dhcAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MwogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICBmcmFtZV9idXJ5IDI0CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMjYKCnZlcmlmeV9hZnRlcl93aGlsZUAyODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHBpKTsKICAgIGZyYW1lX2RpZyAyNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMQogICAgLy8gZGVidWdMb2coIlBJKHhpKSIsIHBpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiUEkoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MDYKICAgIC8vIGZyTXVsKGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlLCBjaGFsbGVuZ2VzLmFscGhhLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludHMgMiA0MTYgLy8gMiwgNDE2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAxCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMzAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxMwogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5iZXRhLm5hdGl2ZSwgcHJvb2YuZXZhbF9zMS5uYXRpdmUpLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZHVwCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgY292ZXIgOAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxNQogICAgLy8gZTNhID0gZnJBZGQoZTNhLCBjaGFsbGVuZ2VzLmdhbW1hLm5hdGl2ZSk7CiAgICBkaWcgNQogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBzd2FwCiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDMKICAgIGZyYW1lX2RpZyAxNAogICAgZHVwCiAgICBjb3ZlciAxMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyAzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMjEKICAgIGR1cAogICAgY292ZXIgMTQKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGR1cAogICAgZGlnIDUKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDE0CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjMwCiAgICAvLyBjb25zdCByMCA9IGZyU3ViKGZyU3ViKGUxLCBlMiksIGUzKTsKICAgIHVuY292ZXIgMTEKICAgIGRpZyA5CiAgICBjYWxsc3ViIGZyU3ViCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzEKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihyMCk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDEzCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA1CiAgICAvLyBkZWJ1Z0xvZygicjAiLCByMC5ieXRlcyk7CiAgICBwdXNoYnl0ZXMgInIwIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTcKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyA0MAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjU4CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5UMik7CiAgICBmcmFtZV9kaWcgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTkKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQzKTsKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY2MAogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgdmsuUWMpOwogICAgZnJhbWVfZGlnIDQxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxMgogICAgZGlnIDcKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY2OQogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIxID0gZnJTdWIoQmlnVWludCgwKSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpOyAvLyAtVDEqemgKICAgIGRpZyAxMgogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgYnl0ZWNfMSAvLyAweAogICAgZGlnIDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MgogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBkaWcgMTQKICAgIGludGMgMTYgLy8gMzUyCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzEKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18xIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzAtNjczCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjIgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyApOyAvLyAtVDIqeGluKnpoCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3NQogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzEgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3NC02ODAKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMyA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bCgKICAgIC8vICAgICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMueGluLm5hdGl2ZSksCiAgICAvLyAgICAgY2hhbGxlbmdlcy56aC5uYXRpdmUsCiAgICAvLyAgICksCiAgICAvLyApOyAvLyAtVDMqeGluwrIqemgKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY4MwogICAgLy8gY29uc3QgYmV0YXhpID0gZnJNdWwoY2hhbGxlbmdlcy5iZXRhLm5hdGl2ZSwgY2hhbGxlbmdlcy54aS5uYXRpdmUpOwogICAgZGlnIDE1CiAgICBleHRyYWN0IDk2IDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMTMKICAgIGRpZyAxCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTQKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyAxMgogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njg5CiAgICAvLyBmckFkZChwcm9vZi5ldmFsX2IubmF0aXZlLCBmck11bChiZXRheGksIEJpZ1VpbnQodmsuazEpKSksCiAgICBmcmFtZV9kaWcgMzkKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50YyAxMiAvLyA3ODQKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyAxMwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjkzCiAgICAvLyBmckFkZChwcm9vZi5ldmFsX2MubmF0aXZlLCBmck11bChiZXRheGksIEJpZ1VpbnQodmsuazIpKSksCiAgICBkaWcgMwogICAgaW50YyAxMyAvLyA3OTIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDEyCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDEyCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBjb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgMTMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgdW5jb3ZlciAxMgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzAxCiAgICAvLyBjb25zdCB6U2NhbGFyID0gZnJBZGQoZnJBZGQoZDJhLCBkMmIpLCBjaGFsbGVuZ2VzLnUubmF0aXZlKTsKICAgIGRpZyAxMwogICAgcHVzaGludCAzMjAgLy8gMzIwCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGRpZyAxCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDEzCiAgICB1bmNvdmVyIDEzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgMTUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIHVuY292ZXIgMTEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyNQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuWik7CiAgICB1bmNvdmVyIDkKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyNgogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgdmsuUzMpOwogICAgZnJhbWVfZGlnIDQ0CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyNwogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuQSk7CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI4CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5CKTsKICAgIGZyYW1lX2RpZyAxMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjkKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLkMpOwogICAgZnJhbWVfZGlnIDUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzMwCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5TMSk7CiAgICBmcmFtZV9kaWcgNDIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzMxCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5TMik7CiAgICBmcmFtZV9kaWcgNDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM0CiAgICAvLyBsZXQgc2NhbGFycyA9IG9wLmNvbmNhdChiMzIoZ2F0ZVNjYWxhcjEpLCBiMzIoZ2F0ZVNjYWxhcjIpKTsKICAgIHVuY292ZXIgOQogICAgY2FsbHN1YiBiMzIKICAgIGRpZyAxMwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM1CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihnYXRlU2NhbGFyMykpOwogICAgZGlnIDExCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzYKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKGdhdGVTY2FsYXI0KSk7CiAgICBkaWcgMTUKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczNwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIxKSk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczOAogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIyKSk7CiAgICB1bmNvdmVyIDgKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczOQogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIzKSk7CiAgICB1bmNvdmVyIDcKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0MAogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoQmlnVWludCgxKSkpOyAvLyBRYyB3aXRoIHNjYWxhciAxCiAgICBieXRlY18yIC8vIDB4MDEKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0MQogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoelNjYWxhcikpOyAvLyBaIHdpdGggelNjYWxhcgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDIKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKGZyU3ViKEJpZ1VpbnQoMCksIHMzU2NhbGFyKSkpOyAvLyBTMyB3aXRoIC1zM1NjYWxhcgogICAgYnl0ZWNfMSAvLyAweAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGZyU3ViCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDMKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICB1bmNvdmVyIDcKICAgIGV4dHJhY3QgMTI4IDE5MgogICAgZHVwCiAgICBleHRyYWN0IDMyIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDMtNzQ0CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyAyCiAgICBleHRyYWN0IDY0IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ0CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ1CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbM10gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDMKICAgIGV4dHJhY3QgOTYgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDYKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudls0XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgNAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDcKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgMTYwIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzUwLTc1NAogICAgLy8gY29uc3QgRiA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsTXVsdGkoCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBwb2ludHMsCiAgICAvLyAgIHNjYWxhcnMsCiAgICAvLyApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pOwogICAgdW5jb3ZlciA2CiAgICBzd2FwCiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDkKICAgIC8vIGRlYnVnTG9nKCJGIiwgZik7CiAgICBwdXNoYnl0ZXMgIkYiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAxMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzcwLTc3MwogICAgLy8gbGV0IGUgPSBmclN1YigKICAgIC8vICAgZnJNdWwoKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHByb29mLmV2YWxfYS5uYXRpdmUpLAogICAgLy8gICByMC5uYXRpdmUsCiAgICAvLyApOwogICAgdW5jb3ZlciA5CiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgNwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMgogICAgdW5jb3ZlciA2CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc4NgogICAgLy8gY29uc3QgcmVzID0gZzFUaW1lc0ZyKEcxX09ORS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwgZSk7CiAgICBwdXNoYnl0ZXMgMHgxN2YxZDNhNzMxOTdkNzk0MjY5NTYzOGM0ZmE5YWMwZmMzNjg4YzRmOTc3NGI5MDVhMTRlM2EzZjE3MWJhYzU4NmM1NWU4M2ZmOTdhMWFlZmZiM2FmMDBhZGIyMmM2YmIwOGIzZjQ4MWUzYWFhMGYxYTA5ZTMwZWQ3NDFkOGFlNGZjZjVlMDk1ZDVkMDBhZjYwMGRiMThjYjJjMDRiM2VkZDAzY2M3NDRhMjg4OGFlNDBjYWEyMzI5NDZjNWU3ZTEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBzd2FwCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDEzCiAgICAvLyBkZWJ1Z0xvZygiRSIsIGUpOwogICAgcHVzaGJ5dGVzICJFIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDIzCiAgICBkaWcgMwogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDI3CiAgICBzd2FwCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAzCiAgICBkaWcgNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODE4CiAgICAvLyBST09UX09GX1VOSVRZLAogICAgYnl0ZWNfMyAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgyMAogICAgLy8gY29uc3QgcGFpcmluZ1NjYWxhcnMgPSBvcC5jb25jYXQoY2hhbGxlbmdlcy54aS5ieXRlcywgYjMyKHMpKTsKICAgIGNhbGxzdWIgYjMyCiAgICB1bmNvdmVyIDUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODIyLTgyNgogICAgLy8gbGV0IEIxID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIHBhaXJpbmdQb2ludHMsCiAgICAvLyAgIHBhaXJpbmdTY2FsYXJzLAogICAgLy8gKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KTsKICAgIGZyYW1lX2RpZyAyOAogICAgc3dhcAogICAgZWNfbXVsdGlfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICB1bmNvdmVyIDMKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgdW5jb3ZlciAyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDUKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjIDQgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDUKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjIDQgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgzMwogICAgLy8gb3AuY29uY2F0KGcxTmVnKEExKSwgQjEpLCAvLyBHMSBwb2ludHMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODM0CiAgICAvLyBvcC5jb25jYXQodmsuWF8yLCBHMl9PTkUpLCAvLyBHMiBwb2ludHMKICAgIHN3YXAKICAgIGludGMgMTQgLy8gODAwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzIDB4MDI0YWEyYjJmMDhmMGE5MTI2MDgwNTI3MmRjNTEwNTFjNmU0N2FkNGZhNDAzYjAyYjQ1MTBiNjQ3YWUzZDE3NzBiYWMwMzI2YTgwNWJiZWZkNDgwNTZjOGMxMjFiZGI4MTNlMDJiNjA1MjcxOWY2MDdkYWNkM2EwODgyNzRmNjU1OTZiZDBkMDk5MjBiNjFhYjVkYTYxYmJkYzdmNTA0OTMzNGNmMTEyMTM5NDVkNTdlNWFjN2QwNTVkMDQyYjdlMGNlNWQ1Mjc3MjdkNmUxMThjYzljZGM2ZGEyZTM1MWFhZGZkOWJhYThjYmRkM2E3NmQ0MjlhNjk1MTYwZDEyYzkyM2FjOWNjM2JhY2EyODllMTkzNTQ4NjA4YjgyODAxMDYwNmM0YTAyZWE3MzRjYzMyYWNkMmIwMmJjMjhiOTljYjNlMjg3ZTg1YTc2M2FmMjY3NDkyYWI1NzJlOTlhYjNmMzcwZDI3NWNlYzFkYTFhYWE5MDc1ZmYwNWY3OWJlCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgzMS04MzUKICAgIC8vIGNvbnN0IHJlcyA9IG9wLkVsbGlwdGljQ3VydmUucGFpcmluZ0NoZWNrKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgb3AuY29uY2F0KGcxTmVnKEExKSwgQjEpLCAvLyBHMSBwb2ludHMKICAgIC8vICAgb3AuY29uY2F0KHZrLlhfMiwgRzJfT05FKSwgLy8gRzIgcG9pbnRzCiAgICAvLyApOwogICAgZWNfcGFpcmluZ19jaGVjayBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzkKICAgIC8vIGFzc2VydCh2ZXJpZnlGcm9tVGVtcGxhdGVXaXRoTG9ncyhzaWduYWxzLCBwcm9vZiksICJWZXJpZmljYXRpb24gZmFpbGVkIik7CiAgICBhc3NlcnQgLy8gVmVyaWZpY2F0aW9uIGZhaWxlZAogICAgcmV0c3ViCgp2ZXJpZnlfdGVybmFyeV9mYWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzOAogICAgZnJhbWVfYnVyeSAzNgogICAgYiB2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARIGABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEAIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////8AAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIg5EIq+L/6tJFSISRImKAQGL/wIoqkkVIg5EIq+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNI0sCDyNLA08CTUsDTwJLAlJJFSMSRCEFSwMPIQVLBE8CTUsETwNLAlJJFSMSRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSMSRCEESwUPIQRLBk8CTUsGTwNLAlJJFSMSRCEHSwYPIQdLB08CTUsHTwNLAlJJFSMSRCEISwcPIQhLCE8CTUsITwNLAlJJFSMSRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSMSRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSMSRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGI1hQSU4CSwEhBCNYSU4DUEsBIQcjWElOA1BLASEII1hJTgNQTCEJI1hJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIiCyJYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAqLLUxQi/9XYGBJjAtQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGI1hJjAZQiP3jSYwMi/8hBCNYSYwHUIv/IQcjWEmMCFCL/yEII1hJjAlQiP2/SYwgi/+B4AYiWEmME1CL/4GAByJYSYwUUIv/gaAHIlhJjBVQi/+BwAciWEmMEFCL/yEPIlhJjA5Qi/+BgAgiWEmMD1AhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIguLHUlPAiJYSwFXICCjKKpJFSIORCKvq0sCIgtMXYwdJAiMI0L/y4v/IQkjWEmMG4v/IQojWEmMF1BJjByI/R6LLYsMUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEUlXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiJYgAF1sLBLASEQIliAA3hpbrCwSwEhBCJYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUiDkQir0mMA0qrixEhEE8CXU8CKoj7yUkVIg5ETwKrIQRMXYwRiyIWKKqMFiqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABUEkjCQkjCWLJYskDkEAvIsRSSEEIliLH0lPAqMoqk8CV2AgTwKI+1mLFqMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowNjBKLEimlQQAtixIqrCmpixmMGkEACYsZiw2jKKqMGosajBmLDUmjKKqMDYsSgAECoowSQv/MiwGLGaMoqkkVIg5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfK6MoqowfiyUkCIwlQv88gAIBoosRUIsAUEmMBEklWUsBFVJJVwIAjAJXIiBJjB6ABkwxKHhpKbCwKYwYJYwjiyOLLgxBACuL/lcCAIsjSU4CIgsiWCiqTCQISYwjIguLAkwiWKMoqosYTIj6WIwYQv/NixhJFSIORIsDSU4Cq4AGUEkoeGkpsEmwiwSDAgKgA1hJV0AgSUsBoyiqix6jKKpLAlcAIEmLEElOCKMoqosTSU4HKKpMKKpLAaAoqksFVyAgTCiqTCiqTEsBoCiqSwOLDklODKMoqosUSU4EKKpMKKpLAaAoqiiqSwOgKKqLFUlODiiqSUsFoCiqTwRPA6MoqklPAqMoqosPSU4OoyiqSwmjKKpPC0sJiPmoTIj5pEkVIg5ETw2rgAJyMLBJsIsoiwdQiwhQiwlQiylQSwxLB6MoqksMIQQiWClLAYj5dEsOIRAiWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJLD1dgIEsNSwGjKKpJKKpPDqAoqiiqSwygKKqLJ0lOAyEMgQhYSwKjKKooqk8NoCiqKKpLDaAoqksDIQ2BCFhPA6MoqiiqTwygKKooqk8MoCiqTgKjKKqjKKpLDaMoqiiqTwwoqqAoqksNgcACIlhMKKpLASiqoCiqTw1PDaMoqksPoyiqTwujKKpPCYsGUIssUIsKUIsLUIsFUIsqUIsrUE8JiPi/Sw2I+LpQSwuI+LRQSw+I+K5QTwmI+KhQTwiI+KJQTweI+JxQKoj4l1BPA4j4kVApTwOI+HeI+IdQTwdXgMBJVyAgTwJLAVBLAldAIExLAVBLA1dgIExLAVBLBFeAIExLAVBPBVegIExLAVBPBkzjAkkVIxJEgAFGsEmwTwVPC6Moqk8JiPglTwVPCaMoqkwoqkwoqqAoqk8ETwmjKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIxJEgAFFsEmwixdLA+ECSRUjEkSLG0zgAkkVIxJETwNLBaMoqiujKKqI91VPBUxQixxM4wJJFSMSRE8D4AJJFSMSRE8CJwThAkkVIxJE4AJJFSMSREwnBOECSRUjEkRMUEwhDiEFWIDAAQJKorLwjwqRJggFJy3FEFHG5HrU+kA7ArRRC2R649F3C6wDJqgFu+/UgFbIwSG9uBPgK2BScZ9gfazToIgnT2VZa9DQmSC2GrXaYbvcf1BJM0zxEhOUXVflrH0FXQQrfgzl1SdyfW4RjMnNxtouNRqt/ZuqjL3Tp21CmmlRYNEskjrJzDusoonhk1SGCLgoAQYGxKAupzTMMqzSsCvCi5nLPih+hadjryZ0kqtXLpmrPzcNJ1zsHaGqqQdf8F95vlDiAkSJiyaMJEL6uw==", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
56
+ var APP_SPEC = { "name": "PlonkVerifier", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 2059, 2263, 2280, 2290, 2318, 2327, 2338, 2345, 2355], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2562], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1490, 1505, 2006, 2016, 2025, 2034, 2043], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1526, 1699], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMzIgOTYgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSBUTVBMX1JPT1RfT0ZfVU5JVFkgMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHg5NWMxMGNlNCAweDQzZDkwYTM4IC8vIG1ldGhvZCAiX2R1bW15KChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVsxOTJdKSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnkodWludDI1NltdLChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nikpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fX2R1bW15X3JvdXRlQDMgbWFpbl92ZXJpZnlfcm91dGVANAoKbWFpbl9hZnRlcl9pZl9lbHNlQDExOgogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUA0OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX19kdW1teV9yb3V0ZUAzOgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzUKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJDbG9zZU91dCIgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMiAvLyBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IENsb3NlT3V0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXIgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjIKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyMwogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllci52ZXJpZnkoc2lnbmFsczogYnl0ZXMsIHByb29mOiBieXRlcykgLT4gdm9pZDoKdmVyaWZ5OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgaW50Y18zIC8vIDAKICAgIGR1cG4gMzMKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzE5CiAgICAvLyByZXR1cm4gdmVyaWZ5V2l0aExvZ3MoZGVjb2RlVmsodmtCeXRlcyksIHNpZ25hbHMsIHByb29mKTsKICAgIGJ5dGVjIDUgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTQKICAgIC8vIFFtOiB2a0J5dGVzLnNsaWNlKDAsIDk2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDEKICAgID49CiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBpbnRjXzEgLy8gOTYKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18xIC8vIDk2CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTUKICAgIC8vIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA1IC8vIDE5MgogICAgZGlnIDMKICAgID49CiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTYKICAgIC8vIFFyOiB2a0J5dGVzLnNsaWNlKDE5MiwgMjg4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNiAvLyAyODgKICAgIGRpZyA0CiAgICA+PQogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk3CiAgICAvLyBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDQgLy8gMzg0CiAgICBkaWcgNQogICAgPj0KICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDYKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OAogICAgLy8gUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA3IC8vIDQ4MAogICAgZGlnIDYKICAgID49CiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA3CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTkKICAgIC8vIFMxOiB2a0J5dGVzLnNsaWNlKDQ4MCwgNTc2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOCAvLyA1NzYKICAgIGRpZyA3CiAgICA+PQogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDgKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAwCiAgICAvLyBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDkgLy8gNjcyCiAgICBkaWcgOAogICAgPj0KICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA5CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwMQogICAgLy8gUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyA5CiAgICA+PQogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAyCiAgICAvLyBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDEwCiAgICA+PQogICAgaW50YyAxMSAvLyA3NzYKICAgIGRpZyAxMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAzCiAgICAvLyBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTEKICAgID49CiAgICBpbnRjIDEyIC8vIDc4NAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDQKICAgIC8vIGsxOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzg0LCA3OTIpKSwKICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTIKICAgID49CiAgICBpbnRjIDEzIC8vIDc5MgogICAgZGlnIDEzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEzCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDUKICAgIC8vIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTMKICAgID49CiAgICBpbnRjIDE0IC8vIDgwMAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDYKICAgIC8vIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgaW50YyAxNSAvLyA5OTIKICAgIGRpZyAxNAogICAgPj0KICAgIGludGMgMTUgLy8gOTkyCiAgICB1bmNvdmVyIDE1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDUgLy8gMTkyCiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDE5MgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjkzLTMwNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbDogdmtCeXRlcy5zbGljZSg5NiwgMTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFjOiB2a0J5dGVzLnNsaWNlKDM4NCwgNDgwKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMzOiB2a0J5dGVzLnNsaWNlKDY3MiwgNzY4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgcG93ZXI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NjgsIDc3NikpLAogICAgLy8gICBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIC8vICAgazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgLy8gICBrMjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc5MiwgODAwKSksCiAgICAvLyAgIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgLy8gfTsKICAgIHVuY292ZXIgMTIKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQzOQogICAgLy8gbGV0IHRkID0gb3AuY29uY2F0KHZrLlFtLCB2ay5RbCk7CiAgICBleHRyYWN0IDAgOTYKICAgIGRpZyAxCiAgICBleHRyYWN0IDk2IDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFyKTsKICAgIGRpZyAxCiAgICBleHRyYWN0IDE5MiA5NgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDEKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5Rbyk7CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFjKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQzCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzEpOwogICAgZGlnIDEKICAgIGludGMgNyAvLyA0ODAKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDQKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMik7CiAgICBkaWcgMQogICAgaW50YyA4IC8vIDU3NgogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMzKTsKICAgIHN3YXAKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDcKICAgIC8vIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NwogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIDQ3CiAgICBmcmFtZV9kaWcgNDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDQ3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGIzMihmclNjYWxhcihzaWduYWwubmF0aXZlKSkpOwogICAgY2FsbHN1YiBiMzIKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQ1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0NwogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5CKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCA5NiA5NgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDE5MiA5NgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU2CiAgICAvLyBjb25zdCBiZXRhID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGdhbW1hID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGR1cAogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGdhbW1hLmJ5dGVzKTsKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQ1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5aKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDcwCiAgICAvLyBjb25zdCBhbHBoYSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzcKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDgKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDc5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODAKICAgIC8vIGNvbnN0IHhpID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4NwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODY0IC8vIDg2NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODk2IC8vIDg5NgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYy5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTI4IC8vIDkyOAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczEuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDk2MCAvLyA5NjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTEKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3MyLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyAxNSAvLyA5OTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3p3LmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTQKICAgIC8vIGNvbnN0IHYgPSBuZXcgRml4ZWRBcnJheTxVaW50MjU2LCA2PigpOwogICAgaW50YyA1IC8vIDE5MgogICAgYnplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NQogICAgLy8gdlsxXSA9IGdldENoYWxsZW5nZSh0ZCk7IC8vIHYxCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgcmVwbGFjZTIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDM1Cgp2ZXJpZnlfd2hpbGVfdG9wQDU6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUA3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTcKICAgIC8vIHZbaV0gPSBuZXcgVWludDI1Nihmck11bCgodltpIC0gMV0gYXMgVWludDI1NikubmF0aXZlLCB2WzFdLm5hdGl2ZSkpOyAvLyB2W2ldID0gdjFeaQogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZGlnIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBiIHZlcmlmeV93aGlsZV90b3BANQoKdmVyaWZ5X2FmdGVyX3doaWxlQDc6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDQKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5XeGkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDkgLy8gNjcyCiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aXcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDEwIC8vIDc2OAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIzCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyOAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA2CiAgICAvLyBjb25zdCB1ID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDgtNTE3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBiZXRhLAogICAgLy8gICBnYW1tYSwKICAgIC8vICAgYWxwaGEsCiAgICAvLyAgIHhpLAogICAgLy8gICB2LAogICAgLy8gICB1LAogICAgLy8gICB4aW46IG5ldyBVaW50MjU2KCksCiAgICAvLyAgIHpoOiBuZXcgVWludDI1NigpLAogICAgLy8gfTsKICAgIGZyYW1lX2RpZyA0NQogICAgZnJhbWVfZGlnIDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMjkKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OAogICAgLy8gZGVidWdMb2coImJldGEiLCBjaGFsbGVuZ2VzLmJldGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHB1c2hieXRlcyAiYmV0YSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OQogICAgLy8gZGVidWdMb2coImdhbW1hIiwgY2hhbGxlbmdlcy5nYW1tYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIHB1c2hieXRlcyAiZ2FtbWEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODAKICAgIC8vIGRlYnVnTG9nKCJhbHBoYSIsIGNoYWxsZW5nZXMuYWxwaGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICBwdXNoYnl0ZXMgImFscGhhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgxCiAgICAvLyBkZWJ1Z0xvZygieGkiLCBjaGFsbGVuZ2VzLnhpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMgogICAgcHVzaGJ5dGVzICJ4aSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgyCiAgICAvLyBkZWJ1Z0xvZygidSIsIGNoYWxsZW5nZXMudS5ieXRlcyk7CiAgICBkaWcgMQogICAgcHVzaGludCAzMjAgLy8gMzIwCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODMKICAgIC8vIGRlYnVnTG9nKCJ4aW4iLCBjaGFsbGVuZ2VzLnhpbi5ieXRlcyk7CiAgICBkaWcgMQogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAieGluIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg0CiAgICAvLyBkZWJ1Z0xvZygiemgiLCBjaGFsbGVuZ2VzLnpoLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInpoIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg1CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgc3dhcAogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbMV0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUtMzg2CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NgogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAidlsyXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NwogICAgLy8gZGVidWdMb2coInZbM10iLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlszXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OAogICAgLy8gZGVidWdMb2coInZbNF0iLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbNF0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODkKICAgIC8vIGRlYnVnTG9nKCJ2WzVdIiwgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls1XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMQogICAgLy8gbGV0IGRvbWFpblNpemU6IHVpbnQ2NCA9IDE7CiAgICBpbnRjXzIgLy8gMQogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2J1cnkgMzMKCnZlcmlmeV93aGlsZV90b3BAMTA6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTAgLy8gNzY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM1CiAgICA+CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDMzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzQKICAgIC8vIGRvbWFpblNpemUgKj0gMjsKICAgIGZyYW1lX2RpZyAzNAogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGZyYW1lX2J1cnkgMzQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxMAoKdmVyaWZ5X2FmdGVyX3doaWxlQDEyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM3CiAgICAvLyBjaGFsbGVuZ2VzLnhpbiA9IG5ldyBVaW50MjU2KHhpbik7CiAgICBmcmFtZV9kaWcgMzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBkdXAyCiAgICBifAogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjIDE2IC8vIDM1MgogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM4CiAgICAvLyBjaGFsbGVuZ2VzLnpoID0gbmV3IFVpbnQyNTYoZnJTdWIoeGluLCBCaWdVaW50KDEpKSk7IC8vIFZhbmlzaGluZyBwb2x5bm9taWFsIFpfSCjOvikgPSDOvl5uIC0gMQogICAgdW5jb3ZlciAyCiAgICBieXRlY18yIC8vIDB4MDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMgogICAgYnwKICAgIGludGMgNCAvLyAzODQKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDE3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDAKICAgIC8vIGNvbnN0IG4gPSBmclNjYWxhcihCaWdVaW50KGRvbWFpblNpemUpKTsKICAgIGZyYW1lX2RpZyAzNAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAyMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTQ2CiAgICAvLyBsZXQgdyA9IEJpZ1VpbnQoMSk7CiAgICBieXRlY18yIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1NQogICAgLy8gY29uc3QgTDogVWludDI1NltdID0gW25ldyBVaW50MjU2KCldOwogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU4CiAgICAvLyBjb25zdCBpdGVyYXRpb25zOiB1aW50NjQgPSB2ay5uUHVibGljID09PSAwID8gMSA6IHZrLm5QdWJsaWM7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTEgLy8gNzc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBibnogdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM2Cgp2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM3Cgp2ZXJpZnlfd2hpbGVfdG9wQDE2OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBmcmFtZV9kaWcgMzYKICAgIDw9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MwogICAgLy8gZnJNdWwodywgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZnJhbWVfZGlnIDE3CiAgICBkdXAKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2NAogICAgLy8gZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA5NiAzMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBmcmFtZV9kaWcgMjIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTEKICAgIC8vIGFzc2VydCh4ICE9PSAoMG4gYXMgYmlndWludCksICJGciBpbnZlcnNlIG9mIHplcm8iKTsKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBhc3NlcnQgLy8gRnIgaW52ZXJzZSBvZiB6ZXJvCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIHB1c2hieXRlcyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZlZmZmZmZmZmYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkwCiAgICAvLyBsZXQgcmVzdWx0ID0gMW4gYXMgYmlndWludDsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkxCiAgICAvLyBsZXQgYjogYmlndWludCA9IGJhc2UgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMwogICAgZnJhbWVfYnVyeSAxOAoKdmVyaWZ5X3doaWxlX3RvcEAxODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkzCiAgICAvLyB3aGlsZSAoZSA+ICgwbiBhcyBiaWd1aW50KSkgewogICAgZnJhbWVfZGlnIDE4CiAgICBieXRlY18xIC8vIDB4CiAgICBiPgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMtOTkKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgIGlmICgoZSAmICgxbiBhcyBiaWd1aW50KSkgIT09ICgwbiBhcyBiaWd1aW50KSkgewogICAgLy8gICAgIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIC8vICAgfQogICAgLy8gICBiID0gKGIgKiBiKSAlIG1vZDsKICAgIC8vICAgZSA9IGUgLyBCaWdVaW50KDIpOwogICAgLy8gfQogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NAogICAgLy8gaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgYiYKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGIhPQogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDI2CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGZyYW1lX2RpZyAyNQogICAgZnJhbWVfZGlnIDEzCiAgICBiKgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDI2Cgp2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTcKICAgIC8vIGIgPSAoYiAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDEzCiAgICBkdXAKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTgKICAgIC8vIGUgPSBlIC8gQmlnVWludCgyKTsKICAgIGZyYW1lX2RpZyAxOAogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDE4CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMTgKCnZlcmlmeV9hZnRlcl93aGlsZUAyMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIChhTiAqIGJJbnYpICUgcjsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMjUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MS01NjYKICAgIC8vIG5ldyBVaW50MjU2KAogICAgLy8gICBmckRpdigKICAgIC8vICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIC8vICAgKSwKICAgIC8vICksCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MC01NjcKICAgIC8vIEwucHVzaCgKICAgIC8vICAgbmV3IFVpbnQyNTYoCiAgICAvLyAgICAgZnJEaXYoCiAgICAvLyAgICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICAgICksCiAgICAvLyAgICksCiAgICAvLyApOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY4CiAgICAvLyB3ID0gZnJNdWwodywgUk9PVF9PRl9VTklUWSk7IC8vIE5leHQgcm9vdCBvZiB1bml0eSBzdGVwICjPiV5pKQogICAgYnl0ZWNfMyAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1OQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzcKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDIzOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTcwCiAgICAvLyByZXR1cm4geyBMLCBjaGFsbGVuZ2VzIH07CiAgICBwdXNoYnl0ZXMgMHgwMWEyCiAgICBmcmFtZV9kaWcgMTcKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5Mi0zOTYKICAgIC8vIGNvbnN0IHsgTCwgY2hhbGxlbmdlczogdXBkYXRlZENoYWxsZW5nZXMgfSA9IGNhbGN1bGF0ZUxhZ3JhbmdlRXZhbHVhdGlvbnMoCiAgICAvLyAgIGNoYWxsZW5nZXMsCiAgICAvLyAgIHZrLAogICAgLy8gKTsKICAgIC8vIGRlYnVnTG9nKCJMMSh4aSkiLCAoTFsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAyCiAgICBleHRyYWN0IDM0IDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NgogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiTDEoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgwCiAgICAvLyBsZXQgcGkgPSBCaWdVaW50KDApOwogICAgYnl0ZWNfMSAvLyAweAogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHVibGljU2lnbmFscy5sZW5ndGg7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BAMjY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODIKICAgIC8vIGNvbnN0IHcgPSBmclNjYWxhcigocHVibGljU2lnbmFsc1tpXSBhcyBVaW50MjU2KS5uYXRpdmUpOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAzMgogICAgKgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MwogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgc3dhcAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MwogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICBmcmFtZV9idXJ5IDI0CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMjYKCnZlcmlmeV9hZnRlcl93aGlsZUAyODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHBpKTsKICAgIGZyYW1lX2RpZyAyNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMQogICAgLy8gZGVidWdMb2coIlBJKHhpKSIsIHBpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiUEkoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MDYKICAgIC8vIGZyTXVsKGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlLCBjaGFsbGVuZ2VzLmFscGhhLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludHMgMiA0MTYgLy8gMiwgNDE2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAxCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMzAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxMwogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5iZXRhLm5hdGl2ZSwgcHJvb2YuZXZhbF9zMS5uYXRpdmUpLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZHVwCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgY292ZXIgOAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxNQogICAgLy8gZTNhID0gZnJBZGQoZTNhLCBjaGFsbGVuZ2VzLmdhbW1hLm5hdGl2ZSk7CiAgICBkaWcgNQogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBzd2FwCiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDMKICAgIGZyYW1lX2RpZyAxNAogICAgZHVwCiAgICBjb3ZlciAxMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyAzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMjEKICAgIGR1cAogICAgY292ZXIgMTQKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGR1cAogICAgZGlnIDUKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDE0CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjMwCiAgICAvLyBjb25zdCByMCA9IGZyU3ViKGZyU3ViKGUxLCBlMiksIGUzKTsKICAgIHVuY292ZXIgMTEKICAgIGRpZyA5CiAgICBjYWxsc3ViIGZyU3ViCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzEKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihyMCk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDEzCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA1CiAgICAvLyBkZWJ1Z0xvZygicjAiLCByMC5ieXRlcyk7CiAgICBwdXNoYnl0ZXMgInIwIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTkKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyA0MAogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjYwCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5UMik7CiAgICBmcmFtZV9kaWcgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NjEKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQzKTsKICAgIGZyYW1lX2RpZyA5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY2MgogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgdmsuUWMpOwogICAgZnJhbWVfZGlnIDQxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxMgogICAgZGlnIDcKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MQogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIxID0gZnJTdWIoQmlnVWludCgwKSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpOyAvLyDiiJJ6aCAoYXBwbGllcyB0byBUMSkKICAgIGRpZyAxMgogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgYnl0ZWNfMSAvLyAweAogICAgZGlnIDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3NAogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBkaWcgMTQKICAgIGludGMgMTYgLy8gMzUyCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzMKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18xIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzItNjc1CiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjIgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyApOyAvLyDiiJJ4aW7Ct3poIChhcHBsaWVzIHRvIFQyKQogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzcKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18xIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzYtNjgyCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjMgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoCiAgICAvLyAgICAgZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnhpbi5uYXRpdmUpLAogICAgLy8gICAgIGNoYWxsZW5nZXMuemgubmF0aXZlLAogICAgLy8gICApLAogICAgLy8gKTsgLy8g4oiSeGluwrLCt3poIChhcHBsaWVzIHRvIFQzKQogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njg1CiAgICAvLyBjb25zdCBiZXRheGkgPSBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBjaGFsbGVuZ2VzLnhpLm5hdGl2ZSk7CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOTYgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxMwogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxNAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEyCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2OTEKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYi5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMSkpKSwKICAgIGZyYW1lX2RpZyAzOQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjIDEyIC8vIDc4NAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxMwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2OTUKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYy5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMikpKSwKICAgIGRpZyAzCiAgICBpbnRjIDEzIC8vIDc5MgogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTIKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTIKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyAxMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICB1bmNvdmVyIDEyCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MDMKICAgIC8vIGNvbnN0IHpTY2FsYXIgPSBmckFkZChmckFkZChkMmEsIGQyYiksIGNoYWxsZW5nZXMudS5uYXRpdmUpOwogICAgZGlnIDEzCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZGlnIDEKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMTMKICAgIHVuY292ZXIgMTMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyAxNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgdW5jb3ZlciAxMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI3CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5aKTsKICAgIHVuY292ZXIgOQogICAgZnJhbWVfZGlnIDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI4CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5TMyk7CiAgICBmcmFtZV9kaWcgNDQKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI5CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzAKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczMQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzIKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHZrLlMxKTsKICAgIGZyYW1lX2RpZyA0MgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzMKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHZrLlMyKTsKICAgIGZyYW1lX2RpZyA0MwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzYKICAgIC8vIGxldCBzY2FsYXJzID0gb3AuY29uY2F0KGIzMihnYXRlU2NhbGFyMSksIGIzMihnYXRlU2NhbGFyMikpOwogICAgdW5jb3ZlciA5CiAgICBjYWxsc3ViIGIzMgogICAgZGlnIDEzCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzcKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKGdhdGVTY2FsYXIzKSk7CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczOAogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoZ2F0ZVNjYWxhcjQpKTsKICAgIGRpZyAxNQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM5CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjEpKTsKICAgIHVuY292ZXIgOQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQwCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjIpKTsKICAgIHVuY292ZXIgOAogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQxCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjMpKTsKICAgIHVuY292ZXIgNwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQyCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihCaWdVaW50KDEpKSk7IC8vIFFjIHdpdGggc2NhbGFyIDEKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQzCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMih6U2NhbGFyKSk7IC8vIFogd2l0aCB6U2NhbGFyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NAogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoZnJTdWIoQmlnVWludCgwKSwgczNTY2FsYXIpKSk7IC8vIFMzIHdpdGggLXMzU2NhbGFyCiAgICBieXRlY18xIC8vIDB4CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZnJTdWIKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NQogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHVuY292ZXIgNwogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NS03NDYKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDYKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsyXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDcKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlszXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0OAogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyA0CiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0OQogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCAxNjAgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTItNzU2CiAgICAvLyBjb25zdCBGID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIHBvaW50cywKICAgIC8vICAgc2NhbGFycywKICAgIC8vICkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSk7CiAgICB1bmNvdmVyIDYKICAgIHN3YXAKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwOQogICAgLy8gZGVidWdMb2coIkYiLCBmKTsKICAgIHB1c2hieXRlcyAiRiIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDExCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NzItNzc1CiAgICAvLyBsZXQgZSA9IGZyU3ViKAogICAgLy8gICBmck11bCgoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgcHJvb2YuZXZhbF9hLm5hdGl2ZSksCiAgICAvLyAgIHIwLm5hdGl2ZSwKICAgIC8vICk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA3CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICB1bmNvdmVyIDYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Nzg4CiAgICAvLyBjb25zdCByZXMgPSBnMVRpbWVzRnIoRzFfT05FLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLCBlKTsKICAgIHB1c2hieXRlcyAweDE3ZjFkM2E3MzE5N2Q3OTQyNjk1NjM4YzRmYTlhYzBmYzM2ODhjNGY5Nzc0YjkwNWExNGUzYTNmMTcxYmFjNTg2YzU1ZTgzZmY5N2ExYWVmZmIzYWYwMGFkYjIyYzZiYjA4YjNmNDgxZTNhYWEwZjFhMDllMzBlZDc0MWQ4YWU0ZmNmNWUwOTVkNWQwMGFmNjAwZGIxOGNiMmMwNGIzZWRkMDNjYzc0NGEyODg4YWU0MGNhYTIzMjk0NmM1ZTdlMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MTMKICAgIC8vIGRlYnVnTG9nKCJFIiwgZSk7CiAgICBwdXNoYnl0ZXMgIkUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjMKICAgIGRpZyAzCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjcKICAgIHN3YXAKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGRpZyA1CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MjAKICAgIC8vIFJPT1RfT0ZfVU5JVFksCiAgICBieXRlY18zIC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODIyCiAgICAvLyBjb25zdCBwYWlyaW5nU2NhbGFycyA9IG9wLmNvbmNhdChjaGFsbGVuZ2VzLnhpLmJ5dGVzLCBiMzIocykpOwogICAgY2FsbHN1YiBiMzIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MjQtODI4CiAgICAvLyBsZXQgQjEgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgcGFpcmluZ1BvaW50cywKICAgIC8vICAgcGFpcmluZ1NjYWxhcnMsCiAgICAvLyApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pOwogICAgZnJhbWVfZGlnIDI4CiAgICBzd2FwCiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgMwogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICB1bmNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWMgNCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWMgNCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODM1CiAgICAvLyBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzYKICAgIC8vIG9wLmNvbmNhdCh2ay5YXzIsIEcyX09ORSksIC8vIEcyIHBvaW50cwogICAgc3dhcAogICAgaW50YyAxNCAvLyA4MDAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgMHgwMjRhYTJiMmYwOGYwYTkxMjYwODA1MjcyZGM1MTA1MWM2ZTQ3YWQ0ZmE0MDNiMDJiNDUxMGI2NDdhZTNkMTc3MGJhYzAzMjZhODA1YmJlZmQ0ODA1NmM4YzEyMWJkYjgxM2UwMmI2MDUyNzE5ZjYwN2RhY2QzYTA4ODI3NGY2NTU5NmJkMGQwOTkyMGI2MWFiNWRhNjFiYmRjN2Y1MDQ5MzM0Y2YxMTIxMzk0NWQ1N2U1YWM3ZDA1NWQwNDJiN2UwY2U1ZDUyNzcyN2Q2ZTExOGNjOWNkYzZkYTJlMzUxYWFkZmQ5YmFhOGNiZGQzYTc2ZDQyOWE2OTUxNjBkMTJjOTIzYWM5Y2MzYmFjYTI4OWUxOTM1NDg2MDhiODI4MDEwNjA2YzRhMDJlYTczNGNjMzJhY2QyYjAyYmMyOGI5OWNiM2UyODdlODVhNzYzYWYyNjc0OTJhYjU3MmU5OWFiM2YzNzBkMjc1Y2VjMWRhMWFhYTkwNzVmZjA1Zjc5YmUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODMzLTgzNwogICAgLy8gY29uc3QgcmVzID0gb3AuRWxsaXB0aWNDdXJ2ZS5wYWlyaW5nQ2hlY2soCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgLy8gICBvcC5jb25jYXQodmsuWF8yLCBHMl9PTkUpLCAvLyBHMiBwb2ludHMKICAgIC8vICk7CiAgICBlY19wYWlyaW5nX2NoZWNrIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czozOQogICAgLy8gYXNzZXJ0KHZlcmlmeUZyb21UZW1wbGF0ZVdpdGhMb2dzKHNpZ25hbHMsIHByb29mKSwgIlZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKICAgIGFzc2VydCAvLyBWZXJpZmljYXRpb24gZmFpbGVkCiAgICByZXRzdWIKCnZlcmlmeV90ZXJuYXJ5X2ZhbHNlQDE0OgogICAgZnJhbWVfZGlnIDM4CiAgICBmcmFtZV9idXJ5IDM2CiAgICBiIHZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARIGABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEAIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////8AAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIg5EIq+L/6tJFSISRImKAQGL/wIoqkkVIg5EIq+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNI0sCDyNLA08CTUsDTwJLAlJJFSMSRCEFSwMPIQVLBE8CTUsETwNLAlJJFSMSRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSMSRCEESwUPIQRLBk8CTUsGTwNLAlJJFSMSRCEHSwYPIQdLB08CTUsHTwNLAlJJFSMSRCEISwcPIQhLCE8CTUsITwNLAlJJFSMSRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSMSRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSMSRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGI1hQSU4CSwEhBCNYSU4DUEsBIQcjWElOA1BLASEII1hJTgNQTCEJI1hJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIiCyJYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAqLLUxQi/9XYGBJjAtQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGI1hJjAZQiP3jSYwMi/8hBCNYSYwHUIv/IQcjWEmMCFCL/yEII1hJjAlQiP2/SYwgi/+B4AYiWEmME1CL/4GAByJYSYwUUIv/gaAHIlhJjBVQi/+BwAciWEmMEFCL/yEPIlhJjA5Qi/+BgAgiWEmMD1AhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIguLHUlPAiJYSwFXICCjKKpJFSIORCKvq0sCIgtMXYwdJAiMI0L/y4v/IQkjWEmMG4v/IQojWEmMF1BJjByI/R6LLYsMUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEUlXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiJYgAF1sLBLASEQIliAA3hpbrCwSwEhBCJYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUiDkQir0mMA0qrixEhEE8CXU8CKoj7yUkVIg5ETwKrIQRMXYwRiyIWKKqMFiqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABUEkjCQkjCWLJYskDkEAvIsRSSEEIliLH0lPAqMoqk8CV2AgTwKI+1mLFqMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowNjBKLEimlQQAtixIqrCmpixmMGkEACYsZiw2jKKqMGosajBmLDUmjKKqMDYsSgAECoowSQv/MiwGLGaMoqkkVIg5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfK6MoqowfiyUkCIwlQv88gAIBoosRUIsAUEmMBEklWUsBFVJJVwIAjAJXIiBJjB6ABkwxKHhpKbCwKYwYJYwjiyOLLgxBACuL/lcCAIsjSU4CIgsiWCiqTCQISYwjIguLAkwiWKMoqosYTIj6WIwYQv/NixhJFSIORIsDSU4Cq4AGUEkoeGkpsEmwiwSDAgKgA1hJV0AgSUsBoyiqix6jKKpLAlcAIEmLEElOCKMoqosTSU4HKKpMKKpLAaAoqksFVyAgTCiqTCiqTEsBoCiqSwOLDklODKMoqosUSU4EKKpMKKpLAaAoqiiqSwOgKKqLFUlODiiqSUsFoCiqTwRPA6MoqklPAqMoqosPSU4OoyiqSwmjKKpPC0sJiPmoTIj5pEkVIg5ETw2rgAJyMLBJsIsoiwdQiwhQiwlQiylQSwxLB6MoqksMIQQiWClLAYj5dEsOIRAiWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJLD1dgIEsNSwGjKKpJKKpPDqAoqiiqSwygKKqLJ0lOAyEMgQhYSwKjKKooqk8NoCiqKKpLDaAoqksDIQ2BCFhPA6MoqiiqTwygKKooqk8MoCiqTgKjKKqjKKpLDaMoqiiqTwwoqqAoqksNgcACIlhMKKpLASiqoCiqTw1PDaMoqksPoyiqTwujKKpPCYsGUIssUIsKUIsLUIsFUIsqUIsrUE8JiPi/Sw2I+LpQSwuI+LRQSw+I+K5QTwmI+KhQTwiI+KJQTweI+JxQKoj4l1BPA4j4kVApTwOI+HeI+IdQTwdXgMBJVyAgTwJLAVBLAldAIExLAVBLA1dgIExLAVBLBFeAIExLAVBPBVegIExLAVBPBkzjAkkVIxJEgAFGsEmwTwVPC6Moqk8JiPglTwVPCaMoqkwoqkwoqqAoqk8ETwmjKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIxJEgAFFsEmwixdLA+ECSRUjEkSLG0zgAkkVIxJETwNLBaMoqiujKKqI91VPBUxQixxM4wJJFSMSRE8D4AJJFSMSRE8CJwThAkkVIxJE4AJJFSMSREwnBOECSRUjEkRMUEwhDiEFWIDAAQJKorLwjwqRJggFJy3FEFHG5HrU+kA7ArRRC2R649F3C6wDJqgFu+/UgFbIwSG9uBPgK2BScZ9gfazToIgnT2VZa9DQmSC2GrXaYbvcf1BJM0zxEhOUXVflrH0FXQQrfgzl1SdyfW4RjMnNxtouNRqt/ZuqjL3Tp21CmmlRYNEskjrJzDusoonhk1SGCLgoAQYGxKAupzTMMqzSsCvCi5nLPih+hadjryZ0kqtXLpmrPzcNJ1zsHaGqqQdf8F95vlDiAkSJiyaMJEL6uw==", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
55
57
  var PlonkVerifierParamsFactory = class {
56
58
  /**
57
59
  * Gets available closeOut ABI call param factories
@@ -464,7 +466,7 @@ var import_app_factory2 = require("@algorandfoundation/algokit-utils/types/app-f
464
466
  var import_composer2 = require("@algorandfoundation/algokit-utils/types/composer");
465
467
  var import_transaction2 = require("@algorandfoundation/algokit-utils/types/transaction");
466
468
  var import_algosdk2 = require("algosdk");
467
- var APP_SPEC2 = { "name": "PlonkVerifierWithLogs", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 2059, 2263, 2280, 2290, 2318, 2327, 2338, 2345, 2355], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2562], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1490, 1505, 2006, 2016, 2025, 2034, 2043], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1526, 1699], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMzIgOTYgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSBUTVBMX1JPT1RfT0ZfVU5JVFkgMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDk1YzEwY2U0IDB4NDNkOTBhMzggLy8gbWV0aG9kICJfZHVtbXkoKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlWzE5Ml0pKXZvaWQiLCBtZXRob2QgInZlcmlmeSh1aW50MjU2W10sKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9fZHVtbXlfcm91dGVAMyBtYWluX3ZlcmlmeV9yb3V0ZUA0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICBlcnIKCm1haW5fdmVyaWZ5X3JvdXRlQDQ6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXJXaXRoTG9ncyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI4CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICBjYWxsc3ViIHZlcmlmeQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9fZHVtbXlfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiQ2xvc2VPdXQiIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjIKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyMwogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllcldpdGhMb2dzLnZlcmlmeShzaWduYWxzOiBieXRlcywgcHJvb2Y6IGJ5dGVzKSAtPiB2b2lkOgp2ZXJpZnk6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICBpbnRjXzMgLy8gMAogICAgZHVwbiAzMwogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTkKICAgIC8vIHJldHVybiB2ZXJpZnlXaXRoTG9ncyhkZWNvZGVWayh2a0J5dGVzKSwgc2lnbmFscywgcHJvb2YpOwogICAgYnl0ZWMgNSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NAogICAgLy8gUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMSAvLyA5NgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzEgLy8gOTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NQogICAgLy8gUWw6IHZrQnl0ZXMuc2xpY2UoOTYsIDE5MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgMwogICAgPj0KICAgIGludGMgNSAvLyAxOTIKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NgogICAgLy8gUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDQKICAgID49CiAgICBpbnRjIDYgLy8gMjg4CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTcKICAgIC8vIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA1CiAgICA+PQogICAgaW50YyA0IC8vIDM4NAogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNgogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk4CiAgICAvLyBRYzogdmtCeXRlcy5zbGljZSgzODQsIDQ4MCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNgogICAgPj0KICAgIGludGMgNyAvLyA0ODAKICAgIGRpZyA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDcKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OQogICAgLy8gUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDcKICAgID49CiAgICBpbnRjIDggLy8gNTc2CiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA4CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDAKICAgIC8vIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA4CiAgICA+PQogICAgaW50YyA5IC8vIDY3MgogICAgZGlnIDkKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAxCiAgICAvLyBTMzogdmtCeXRlcy5zbGljZSg2NzIsIDc2OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDkKICAgID49CiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDIKICAgIC8vIHBvd2VyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzY4LCA3NzYpKSwKICAgIGludGMgMTEgLy8gNzc2CiAgICBkaWcgMTAKICAgID49CiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDExCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDExCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDMKICAgIC8vIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgaW50YyAxMiAvLyA3ODQKICAgIGRpZyAxMQogICAgPj0KICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNAogICAgLy8gazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgaW50YyAxMyAvLyA3OTIKICAgIGRpZyAxMgogICAgPj0KICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNQogICAgLy8gazI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3OTIsIDgwMCkpLAogICAgaW50YyAxNCAvLyA4MDAKICAgIGRpZyAxMwogICAgPj0KICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTQKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNgogICAgLy8gWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICBpbnRjIDE1IC8vIDk5MgogICAgZGlnIDE0CiAgICA+PQogICAgaW50YyAxNSAvLyA5OTIKICAgIHVuY292ZXIgMTUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGMgNSAvLyAxOTIKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgMTkyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTMtMzA3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBRbTogdmtCeXRlcy5zbGljZSgwLCA5NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRcjogdmtCeXRlcy5zbGljZSgxOTIsIDI4OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMTogdmtCeXRlcy5zbGljZSg0ODAsIDU3NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICAvLyAgIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgLy8gICBrMTogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc4NCwgNzkyKSksCiAgICAvLyAgIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIC8vICAgWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICAvLyB9OwogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDM5CiAgICAvLyBsZXQgdGQgPSBvcC5jb25jYXQodmsuUW0sIHZrLlFsKTsKICAgIGV4dHJhY3QgMCA5NgogICAgZGlnIDEKICAgIGV4dHJhY3QgOTYgOTYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUXIpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFvKTsKICAgIGRpZyAxCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQyCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUWMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMSk7CiAgICBkaWcgMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMyKTsKICAgIGRpZyAxCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ1CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzMpOwogICAgc3dhcAogICAgaW50YyA5IC8vIDY3MgogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NwogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAwCgp2ZXJpZnlfZm9yX2hlYWRlckAyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ3CiAgICAvLyBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7CiAgICBmcmFtZV9kaWcgNDcKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNDcKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgYjMyKGZyU2NhbGFyKHNpZ25hbC5uYXRpdmUpKSk7CiAgICBjYWxsc3ViIGIzMgogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNDUKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQ3CiAgICBiIHZlcmlmeV9mb3JfaGVhZGVyQDIKCnZlcmlmeV9hZnRlcl9mb3JANDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkEpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgOTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMAogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDk2IDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU0CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTYKICAgIC8vIGNvbnN0IGJldGEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgZ2FtbWEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgZHVwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDY4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgZ2FtbWEuYnl0ZXMpOwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlopOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzAKICAgIC8vIGNvbnN0IGFscGhhID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3NwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDc4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDcgLy8gNDgwCiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOCAvLyA1NzYKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4MAogICAgLy8gY29uc3QgeGkgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg3CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9hLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4NjQgLy8gODY0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9iLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4OTYgLy8gODk2CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9jLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5MjggLy8gOTI4CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9zMS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTYwIC8vIDk2MAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczIuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDE1IC8vIDk5MgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE0CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfencuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDEwMjQgLy8gMTAyNAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NAogICAgLy8gY29uc3QgdiA9IG5ldyBGaXhlZEFycmF5PFVpbnQyNTYsIDY+KCk7CiAgICBpbnRjIDUgLy8gMTkyCiAgICBiemVybwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk1CiAgICAvLyB2WzFdID0gZ2V0Q2hhbGxlbmdlKHRkKTsgLy8gdjEKICAgIHN3YXAKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICByZXBsYWNlMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgcHVzaGludCAyIC8vIDIKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BANToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAzMgogICAgKgogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk3CiAgICAvLyB2W2ldID0gbmV3IFVpbnQyNTYoZnJNdWwoKHZbaSAtIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgdlsxXS5uYXRpdmUpKTsgLy8gdltpXSA9IHYxXmkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBzd2FwCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEA1Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA1CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuV3hpdyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgMTAgLy8gNzY4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDYKICAgIC8vIGNvbnN0IHUgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwOC01MTcKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGJldGEsCiAgICAvLyAgIGdhbW1hLAogICAgLy8gICBhbHBoYSwKICAgIC8vICAgeGksCiAgICAvLyAgIHYsCiAgICAvLyAgIHUsCiAgICAvLyAgIHhpbjogbmV3IFVpbnQyNTYoKSwKICAgIC8vICAgemg6IG5ldyBVaW50MjU2KCksCiAgICAvLyB9OwogICAgZnJhbWVfZGlnIDQ1CiAgICBmcmFtZV9kaWcgMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc4CiAgICAvLyBkZWJ1Z0xvZygiYmV0YSIsIGNoYWxsZW5nZXMuYmV0YS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgcHVzaGJ5dGVzICJiZXRhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc5CiAgICAvLyBkZWJ1Z0xvZygiZ2FtbWEiLCBjaGFsbGVuZ2VzLmdhbW1hLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMgogICAgcHVzaGJ5dGVzICJnYW1tYSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MAogICAgLy8gZGVidWdMb2coImFscGhhIiwgY2hhbGxlbmdlcy5hbHBoYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIHB1c2hieXRlcyAiYWxwaGEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODEKICAgIC8vIGRlYnVnTG9nKCJ4aSIsIGNoYWxsZW5nZXMueGkuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyCiAgICBwdXNoYnl0ZXMgInhpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODIKICAgIC8vIGRlYnVnTG9nKCJ1IiwgY2hhbGxlbmdlcy51LmJ5dGVzKTsKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAidSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MwogICAgLy8gZGVidWdMb2coInhpbiIsIGNoYWxsZW5nZXMueGluLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDE2IC8vIDM1MgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ4aW4iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODQKICAgIC8vIGRlYnVnTG9nKCJ6aCIsIGNoYWxsZW5nZXMuemguYnl0ZXMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAiemgiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBzd2FwCiAgICBleHRyYWN0IDEyOCAxOTIKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlsxXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NS0zODYKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg2CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJ2WzJdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg3CiAgICAvLyBkZWJ1Z0xvZygidlszXSIsIChjaGFsbGVuZ2VzLnZbM10gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzNdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg4CiAgICAvLyBkZWJ1Z0xvZygidls0XSIsIChjaGFsbGVuZ2VzLnZbNF0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls0XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OQogICAgLy8gZGVidWdMb2coInZbNV0iLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGV4dHJhY3QgMTYwIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzVdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMxCiAgICAvLyBsZXQgZG9tYWluU2l6ZTogdWludDY0ID0gMTsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSAzMwoKdmVyaWZ5X3doaWxlX3RvcEAxMDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMCAvLyA3NjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMzUKICAgID4KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAxMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMzCiAgICBkdXAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzNAogICAgLy8gZG9tYWluU2l6ZSAqPSAyOwogICAgZnJhbWVfZGlnIDM0CiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNQogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDEwCgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzcKICAgIC8vIGNoYWxsZW5nZXMueGluID0gbmV3IFVpbnQyNTYoeGluKTsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGR1cDIKICAgIGJ8CiAgICBmcmFtZV9kaWcgMTcKICAgIGludGMgMTYgLy8gMzUyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzgKICAgIC8vIGNoYWxsZW5nZXMuemggPSBuZXcgVWludDI1NihmclN1Yih4aW4sIEJpZ1VpbnQoMSkpKTsgLy8gVmFuaXNoaW5nIHBvbHlub21pYWwgWl9IKM6+KSA9IM6+Xm4gLSAxCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgY2FsbHN1YiBmclN1YgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciAyCiAgICBifAogICAgaW50YyA0IC8vIDM4NAogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU0MAogICAgLy8gY29uc3QgbiA9IGZyU2NhbGFyKEJpZ1VpbnQoZG9tYWluU2l6ZSkpOwogICAgZnJhbWVfZGlnIDM0CiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNTgKICAgIC8vIHJldHVybiBhICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDYKICAgIC8vIGxldCB3ID0gQmlnVWludCgxKTsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU1CiAgICAvLyBjb25zdCBMOiBVaW50MjU2W10gPSBbbmV3IFVpbnQyNTYoKV07CiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NTgKICAgIC8vIGNvbnN0IGl0ZXJhdGlvbnM6IHVpbnQ2NCA9IHZrLm5QdWJsaWMgPT09IDAgPyAxIDogdmsublB1YmxpYzsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMSAvLyA3NzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGJueiB2ZXJpZnlfdGVybmFyeV9mYWxzZUAxNAogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzYKCnZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzcKCnZlcmlmeV93aGlsZV90b3BAMTY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDE7IGkgPD0gaXRlcmF0aW9uczsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzcKICAgIGZyYW1lX2RpZyAzNgogICAgPD0KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAyMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYzCiAgICAvLyBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY0CiAgICAvLyBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDk2IDMyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAyMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAxCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KHggIT09ICgwbiBhcyBiaWd1aW50KSwgIkZyIGludmVyc2Ugb2YgemVybyIpOwogICAgZHVwCiAgICBieXRlY18xIC8vIDB4CiAgICBiIT0KICAgIGFzc2VydCAvLyBGciBpbnZlcnNlIG9mIHplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgcHVzaGJ5dGVzIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmVmZmZmZmZmZgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTAKICAgIC8vIGxldCByZXN1bHQgPSAxbiBhcyBiaWd1aW50OwogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5MQogICAgLy8gbGV0IGI6IGJpZ3VpbnQgPSBiYXNlICUgbW9kOwogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEzCiAgICBmcmFtZV9idXJ5IDE4Cgp2ZXJpZnlfd2hpbGVfdG9wQDE4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGI+CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5My05OQogICAgLy8gd2hpbGUgKGUgPiAoMG4gYXMgYmlndWludCkpIHsKICAgIC8vICAgaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgLy8gICB9CiAgICAvLyAgIGIgPSAoYiAqIGIpICUgbW9kOwogICAgLy8gICBlID0gZSAvIEJpZ1VpbnQoMik7CiAgICAvLyB9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk0CiAgICAvLyBpZiAoKGUgJiAoMW4gYXMgYmlndWludCkpICE9PSAoMG4gYXMgYmlndWludCkpIHsKICAgIGZyYW1lX2RpZyAxOAogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBiJgogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBmcmFtZV9kaWcgMjUKICAgIGZyYW1lX2J1cnkgMjYKICAgIGJ6IHZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9kaWcgMTMKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgYiUKICAgIGZyYW1lX2J1cnkgMjYKCnZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxOgogICAgZnJhbWVfZGlnIDI2CiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBmcmFtZV9kaWcgMTMKICAgIGR1cAogICAgYioKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk3CiAgICAvLyBiID0gKGIgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5OAogICAgLy8gZSA9IGUgLyBCaWdVaW50KDIpOwogICAgZnJhbWVfZGlnIDE4CiAgICBwdXNoYnl0ZXMgMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMTgKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxOAoKdmVyaWZ5X2FmdGVyX3doaWxlQDIyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTI1CiAgICAvLyByZXR1cm4gKGFOICogYkludikgJSByOwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYxLTU2NgogICAgLy8gbmV3IFVpbnQyNTYoCiAgICAvLyAgIGZyRGl2KAogICAgLy8gICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICApLAogICAgLy8gKSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGZyYW1lX2RpZyAzCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYwLTU2NwogICAgLy8gTC5wdXNoKAogICAgLy8gICBuZXcgVWludDI1NigKICAgIC8vICAgICBmckRpdigKICAgIC8vICAgICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICAgIGZyTXVsKG4sIGZyU3ViKGNoYWxsZW5nZXMueGkubmF0aXZlLCB3KSksCiAgICAvLyAgICAgKSwKICAgIC8vICAgKSwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NjgKICAgIC8vIHcgPSBmck11bCh3LCBST09UX09GX1VOSVRZKTsgLy8gTmV4dCByb290IG9mIHVuaXR5IHN0ZXAgKM+JXmkpCiAgICBieXRlY18zIC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNwogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDE2Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjM6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NzAKICAgIC8vIHJldHVybiB7IEwsIGNoYWxsZW5nZXMgfTsKICAgIHB1c2hieXRlcyAweDAxYTIKICAgIGZyYW1lX2RpZyAxNwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzkyLTM5NgogICAgLy8gY29uc3QgeyBMLCBjaGFsbGVuZ2VzOiB1cGRhdGVkQ2hhbGxlbmdlcyB9ID0gY2FsY3VsYXRlTGFncmFuZ2VFdmFsdWF0aW9ucygKICAgIC8vICAgY2hhbGxlbmdlcywKICAgIC8vICAgdmssCiAgICAvLyApOwogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGV4dHJhY3QgMzQgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzk2CiAgICAvLyBkZWJ1Z0xvZygiTDEoeGkpIiwgKExbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJMMSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODAKICAgIC8vIGxldCBwaSA9IEJpZ1VpbnQoMCk7CiAgICBieXRlY18xIC8vIDB4CiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQoKdmVyaWZ5X3doaWxlX3RvcEAyNjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHB1YmxpY1NpZ25hbHMubGVuZ3RoOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfZGlnIDQ2CiAgICA8CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MgogICAgLy8gY29uc3QgdyA9IGZyU2NhbGFyKChwdWJsaWNTaWduYWxzW2ldIGFzIFVpbnQyNTYpLm5hdGl2ZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgzCiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM1CiAgICBpbnRjXzAgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgzCiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBmcmFtZV9kaWcgMjQKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIGZyYW1lX2J1cnkgMjQKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAyNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDI4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTg1CiAgICAvLyByZXR1cm4gbmV3IFVpbnQyNTYocGkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDAxCiAgICAvLyBkZWJ1Z0xvZygiUEkoeGkpIiwgcGkuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJQSSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYwNgogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5hbHBoYS5uYXRpdmUsIGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlKSwKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50cyAyIDQxNiAvLyAyLCA0MTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2RpZyAzMAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjEzCiAgICAvLyBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBwcm9vZi5ldmFsX3MxLm5hdGl2ZSksCiAgICBkaWcgMgogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxNgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTkKICAgIGR1cAogICAgY292ZXIgNwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjE1CiAgICAvLyBlM2EgPSBmckFkZChlM2EsIGNoYWxsZW5nZXMuZ2FtbWEubmF0aXZlKTsKICAgIGRpZyA1CiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMwogICAgZnJhbWVfZGlnIDE0CiAgICBkdXAKICAgIGNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgY292ZXIgNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGZyYW1lX2RpZyAyMQogICAgZHVwCiAgICBjb3ZlciAxNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZHVwCiAgICBkaWcgNQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgY292ZXIgMTQKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzAKICAgIC8vIGNvbnN0IHIwID0gZnJTdWIoZnJTdWIoZTEsIGUyKSwgZTMpOwogICAgdW5jb3ZlciAxMQogICAgZGlnIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYzMQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHIwKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMTMKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDUKICAgIC8vIGRlYnVnTG9nKCJyMCIsIHIwLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAicjAiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY1NwogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuVDEpOwogICAgZnJhbWVfZGlnIDQwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTgKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY1OQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIDkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjYwCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5RYyk7CiAgICBmcmFtZV9kaWcgNDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEyCiAgICBkaWcgNwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjY5CiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjEgPSBmclN1YihCaWdVaW50KDApLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSk7IC8vIC1UMSp6aAogICAgZGlnIDEyCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBieXRlY18xIC8vIDB4CiAgICBkaWcgMQogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjcyCiAgICAvLyBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIGRpZyAxNAogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MQogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzEgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MC02NzMKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMiA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICk7IC8vIC1UMip4aW4qemgKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIHVuY292ZXIgMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc1CiAgICAvLyBCaWdVaW50KDApLAogICAgYnl0ZWNfMSAvLyAweAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc0LTY4MAogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIzID0gZnJTdWIoCiAgICAvLyAgIEJpZ1VpbnQoMCksCiAgICAvLyAgIGZyTXVsKAogICAgLy8gICAgIGZyTXVsKGNoYWxsZW5nZXMueGluLm5hdGl2ZSwgY2hhbGxlbmdlcy54aW4ubmF0aXZlKSwKICAgIC8vICAgICBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSwKICAgIC8vICAgKSwKICAgIC8vICk7IC8vIC1UMyp4aW7Csip6aAogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjgzCiAgICAvLyBjb25zdCBiZXRheGkgPSBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBjaGFsbGVuZ2VzLnhpLm5hdGl2ZSk7CiAgICBkaWcgMTUKICAgIGV4dHJhY3QgOTYgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxMwogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxNAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEyCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2ODkKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYi5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMSkpKSwKICAgIGZyYW1lX2RpZyAzOQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjIDEyIC8vIDc4NAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxMwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2OTMKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYy5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMikpKSwKICAgIGRpZyAzCiAgICBpbnRjIDEzIC8vIDc5MgogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTIKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTIKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyAxMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICB1bmNvdmVyIDEyCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MDEKICAgIC8vIGNvbnN0IHpTY2FsYXIgPSBmckFkZChmckFkZChkMmEsIGQyYiksIGNoYWxsZW5nZXMudS5uYXRpdmUpOwogICAgZGlnIDEzCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZGlnIDEKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMTMKICAgIHVuY292ZXIgMTMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyAxNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgdW5jb3ZlciAxMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI1CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5aKTsKICAgIHVuY292ZXIgOQogICAgZnJhbWVfZGlnIDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI2CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5TMyk7CiAgICBmcmFtZV9kaWcgNDQKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzI3CiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjgKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyOQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzAKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHZrLlMxKTsKICAgIGZyYW1lX2RpZyA0MgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzEKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHZrLlMyKTsKICAgIGZyYW1lX2RpZyA0MwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzQKICAgIC8vIGxldCBzY2FsYXJzID0gb3AuY29uY2F0KGIzMihnYXRlU2NhbGFyMSksIGIzMihnYXRlU2NhbGFyMikpOwogICAgdW5jb3ZlciA5CiAgICBjYWxsc3ViIGIzMgogICAgZGlnIDEzCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzUKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKGdhdGVTY2FsYXIzKSk7CiAgICBkaWcgMTEKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczNgogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoZ2F0ZVNjYWxhcjQpKTsKICAgIGRpZyAxNQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM3CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjEpKTsKICAgIHVuY292ZXIgOQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM4CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjIpKTsKICAgIHVuY292ZXIgOAogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM5CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjMpKTsKICAgIHVuY292ZXIgNwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQwCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihCaWdVaW50KDEpKSk7IC8vIFFjIHdpdGggc2NhbGFyIDEKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQxCiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMih6U2NhbGFyKSk7IC8vIFogd2l0aCB6U2NhbGFyCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0MgogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoZnJTdWIoQmlnVWludCgwKSwgczNTY2FsYXIpKSk7IC8vIFMzIHdpdGggLXMzU2NhbGFyCiAgICBieXRlY18xIC8vIDB4CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZnJTdWIKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0MwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHVuY292ZXIgNwogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0My03NDQKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDIKICAgIGV4dHJhY3QgNjQgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDQKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsyXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDUKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlszXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NgogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyA0CiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCAxNjAgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTAtNzU0CiAgICAvLyBjb25zdCBGID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIHBvaW50cywKICAgIC8vICAgc2NhbGFycywKICAgIC8vICkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSk7CiAgICB1bmNvdmVyIDYKICAgIHN3YXAKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwOQogICAgLy8gZGVidWdMb2coIkYiLCBmKTsKICAgIHB1c2hieXRlcyAiRiIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDExCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NzAtNzczCiAgICAvLyBsZXQgZSA9IGZyU3ViKAogICAgLy8gICBmck11bCgoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgcHJvb2YuZXZhbF9hLm5hdGl2ZSksCiAgICAvLyAgIHIwLm5hdGl2ZSwKICAgIC8vICk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA3CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICB1bmNvdmVyIDYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Nzg2CiAgICAvLyBjb25zdCByZXMgPSBnMVRpbWVzRnIoRzFfT05FLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLCBlKTsKICAgIHB1c2hieXRlcyAweDE3ZjFkM2E3MzE5N2Q3OTQyNjk1NjM4YzRmYTlhYzBmYzM2ODhjNGY5Nzc0YjkwNWExNGUzYTNmMTcxYmFjNTg2YzU1ZTgzZmY5N2ExYWVmZmIzYWYwMGFkYjIyYzZiYjA4YjNmNDgxZTNhYWEwZjFhMDllMzBlZDc0MWQ4YWU0ZmNmNWUwOTVkNWQwMGFmNjAwZGIxOGNiMmMwNGIzZWRkMDNjYzc0NGEyODg4YWU0MGNhYTIzMjk0NmM1ZTdlMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MTMKICAgIC8vIGRlYnVnTG9nKCJFIiwgZSk7CiAgICBwdXNoYnl0ZXMgIkUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjMKICAgIGRpZyAzCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjcKICAgIHN3YXAKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGRpZyA1CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MTgKICAgIC8vIFJPT1RfT0ZfVU5JVFksCiAgICBieXRlY18zIC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODIwCiAgICAvLyBjb25zdCBwYWlyaW5nU2NhbGFycyA9IG9wLmNvbmNhdChjaGFsbGVuZ2VzLnhpLmJ5dGVzLCBiMzIocykpOwogICAgY2FsbHN1YiBiMzIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MjItODI2CiAgICAvLyBsZXQgQjEgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgcGFpcmluZ1BvaW50cywKICAgIC8vICAgcGFpcmluZ1NjYWxhcnMsCiAgICAvLyApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pOwogICAgZnJhbWVfZGlnIDI4CiAgICBzd2FwCiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgMwogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICB1bmNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWMgNCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWMgNCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODMzCiAgICAvLyBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzQKICAgIC8vIG9wLmNvbmNhdCh2ay5YXzIsIEcyX09ORSksIC8vIEcyIHBvaW50cwogICAgc3dhcAogICAgaW50YyAxNCAvLyA4MDAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgMHgwMjRhYTJiMmYwOGYwYTkxMjYwODA1MjcyZGM1MTA1MWM2ZTQ3YWQ0ZmE0MDNiMDJiNDUxMGI2NDdhZTNkMTc3MGJhYzAzMjZhODA1YmJlZmQ0ODA1NmM4YzEyMWJkYjgxM2UwMmI2MDUyNzE5ZjYwN2RhY2QzYTA4ODI3NGY2NTU5NmJkMGQwOTkyMGI2MWFiNWRhNjFiYmRjN2Y1MDQ5MzM0Y2YxMTIxMzk0NWQ1N2U1YWM3ZDA1NWQwNDJiN2UwY2U1ZDUyNzcyN2Q2ZTExOGNjOWNkYzZkYTJlMzUxYWFkZmQ5YmFhOGNiZGQzYTc2ZDQyOWE2OTUxNjBkMTJjOTIzYWM5Y2MzYmFjYTI4OWUxOTM1NDg2MDhiODI4MDEwNjA2YzRhMDJlYTczNGNjMzJhY2QyYjAyYmMyOGI5OWNiM2UyODdlODVhNzYzYWYyNjc0OTJhYjU3MmU5OWFiM2YzNzBkMjc1Y2VjMWRhMWFhYTkwNzVmZjA1Zjc5YmUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODMxLTgzNQogICAgLy8gY29uc3QgcmVzID0gb3AuRWxsaXB0aWNDdXJ2ZS5wYWlyaW5nQ2hlY2soCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgLy8gICBvcC5jb25jYXQodmsuWF8yLCBHMl9PTkUpLCAvLyBHMiBwb2ludHMKICAgIC8vICk7CiAgICBlY19wYWlyaW5nX2NoZWNrIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOQogICAgLy8gYXNzZXJ0KHZlcmlmeUZyb21UZW1wbGF0ZVdpdGhMb2dzKHNpZ25hbHMsIHByb29mKSwgIlZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKICAgIGFzc2VydCAvLyBWZXJpZmljYXRpb24gZmFpbGVkCiAgICByZXRzdWIKCnZlcmlmeV90ZXJuYXJ5X2ZhbHNlQDE0OgogICAgZnJhbWVfZGlnIDM4CiAgICBmcmFtZV9idXJ5IDM2CiAgICBiIHZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARIGABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEAIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////8AAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIg5EIq+L/6tJFSISRImKAQGL/wIoqkkVIg5EIq+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNI0sCDyNLA08CTUsDTwJLAlJJFSMSRCEFSwMPIQVLBE8CTUsETwNLAlJJFSMSRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSMSRCEESwUPIQRLBk8CTUsGTwNLAlJJFSMSRCEHSwYPIQdLB08CTUsHTwNLAlJJFSMSRCEISwcPIQhLCE8CTUsITwNLAlJJFSMSRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSMSRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSMSRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGI1hQSU4CSwEhBCNYSU4DUEsBIQcjWElOA1BLASEII1hJTgNQTCEJI1hJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIiCyJYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAqLLUxQi/9XYGBJjAtQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGI1hJjAZQiP3jSYwMi/8hBCNYSYwHUIv/IQcjWEmMCFCL/yEII1hJjAlQiP2/SYwgi/+B4AYiWEmME1CL/4GAByJYSYwUUIv/gaAHIlhJjBVQi/+BwAciWEmMEFCL/yEPIlhJjA5Qi/+BgAgiWEmMD1AhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIguLHUlPAiJYSwFXICCjKKpJFSIORCKvq0sCIgtMXYwdJAiMI0L/y4v/IQkjWEmMG4v/IQojWEmMF1BJjByI/R6LLYsMUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEUlXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiJYgAF1sLBLASEQIliAA3hpbrCwSwEhBCJYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUiDkQir0mMA0qrixEhEE8CXU8CKoj7yUkVIg5ETwKrIQRMXYwRiyIWKKqMFiqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABUEkjCQkjCWLJYskDkEAvIsRSSEEIliLH0lPAqMoqk8CV2AgTwKI+1mLFqMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowNjBKLEimlQQAtixIqrCmpixmMGkEACYsZiw2jKKqMGosajBmLDUmjKKqMDYsSgAECoowSQv/MiwGLGaMoqkkVIg5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfK6MoqowfiyUkCIwlQv88gAIBoosRUIsAUEmMBEklWUsBFVJJVwIAjAJXIiBJjB6ABkwxKHhpKbCwKYwYJYwjiyOLLgxBACuL/lcCAIsjSU4CIgsiWCiqTCQISYwjIguLAkwiWKMoqosYTIj6WIwYQv/NixhJFSIORIsDSU4Cq4AGUEkoeGkpsEmwiwSDAgKgA1hJV0AgSUsBoyiqix6jKKpLAlcAIEmLEElOCKMoqosTSU4HKKpMKKpLAaAoqksFVyAgTCiqTCiqTEsBoCiqSwOLDklODKMoqosUSU4EKKpMKKpLAaAoqiiqSwOgKKqLFUlODiiqSUsFoCiqTwRPA6MoqklPAqMoqosPSU4OoyiqSwmjKKpPC0sJiPmoTIj5pEkVIg5ETw2rgAJyMLBJsIsoiwdQiwhQiwlQiylQSwxLB6MoqksMIQQiWClLAYj5dEsOIRAiWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJLD1dgIEsNSwGjKKpJKKpPDqAoqiiqSwygKKqLJ0lOAyEMgQhYSwKjKKooqk8NoCiqKKpLDaAoqksDIQ2BCFhPA6MoqiiqTwygKKooqk8MoCiqTgKjKKqjKKpLDaMoqiiqTwwoqqAoqksNgcACIlhMKKpLASiqoCiqTw1PDaMoqksPoyiqTwujKKpPCYsGUIssUIsKUIsLUIsFUIsqUIsrUE8JiPi/Sw2I+LpQSwuI+LRQSw+I+K5QTwmI+KhQTwiI+KJQTweI+JxQKoj4l1BPA4j4kVApTwOI+HeI+IdQTwdXgMBJVyAgTwJLAVBLAldAIExLAVBLA1dgIExLAVBLBFeAIExLAVBPBVegIExLAVBPBkzjAkkVIxJEgAFGsEmwTwVPC6Moqk8JiPglTwVPCaMoqkwoqkwoqqAoqk8ETwmjKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIxJEgAFFsEmwixdLA+ECSRUjEkSLG0zgAkkVIxJETwNLBaMoqiujKKqI91VPBUxQixxM4wJJFSMSRE8D4AJJFSMSRE8CJwThAkkVIxJE4AJJFSMSREwnBOECSRUjEkRMUEwhDiEFWIDAAQJKorLwjwqRJggFJy3FEFHG5HrU+kA7ArRRC2R649F3C6wDJqgFu+/UgFbIwSG9uBPgK2BScZ9gfazToIgnT2VZa9DQmSC2GrXaYbvcf1BJM0zxEhOUXVflrH0FXQQrfgzl1SdyfW4RjMnNxtouNRqt/ZuqjL3Tp21CmmlRYNEskjrJzDusoonhk1SGCLgoAQYGxKAupzTMMqzSsCvCi5nLPih+hadjryZ0kqtXLpmrPzcNJ1zsHaGqqQdf8F95vlDiAkSJiyaMJEL6uw==", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
469
+ var APP_SPEC2 = { "name": "PlonkVerifierWithLogs", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 2059, 2263, 2280, 2290, 2318, 2327, 2338, 2345, 2355], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2562], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1490, 1505, 2006, 2016, 2025, 2034, 2043], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1526, 1699], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMzIgOTYgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSBUTVBMX1JPT1RfT0ZfVU5JVFkgMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDk1YzEwY2U0IDB4NDNkOTBhMzggLy8gbWV0aG9kICJfZHVtbXkoKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlWzE5Ml0pKXZvaWQiLCBtZXRob2QgInZlcmlmeSh1aW50MjU2W10sKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9fZHVtbXlfcm91dGVAMyBtYWluX3ZlcmlmeV9yb3V0ZUA0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICBlcnIKCm1haW5fdmVyaWZ5X3JvdXRlQDQ6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXJXaXRoTG9ncyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI4CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICBjYWxsc3ViIHZlcmlmeQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9fZHVtbXlfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiQ2xvc2VPdXQiIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjIKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyMwogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllcldpdGhMb2dzLnZlcmlmeShzaWduYWxzOiBieXRlcywgcHJvb2Y6IGJ5dGVzKSAtPiB2b2lkOgp2ZXJpZnk6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICBpbnRjXzMgLy8gMAogICAgZHVwbiAzMwogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTkKICAgIC8vIHJldHVybiB2ZXJpZnlXaXRoTG9ncyhkZWNvZGVWayh2a0J5dGVzKSwgc2lnbmFscywgcHJvb2YpOwogICAgYnl0ZWMgNSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NAogICAgLy8gUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMSAvLyA5NgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzEgLy8gOTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NQogICAgLy8gUWw6IHZrQnl0ZXMuc2xpY2UoOTYsIDE5MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgMwogICAgPj0KICAgIGludGMgNSAvLyAxOTIKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NgogICAgLy8gUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDQKICAgID49CiAgICBpbnRjIDYgLy8gMjg4CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTcKICAgIC8vIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA1CiAgICA+PQogICAgaW50YyA0IC8vIDM4NAogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNgogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk4CiAgICAvLyBRYzogdmtCeXRlcy5zbGljZSgzODQsIDQ4MCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNgogICAgPj0KICAgIGludGMgNyAvLyA0ODAKICAgIGRpZyA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDcKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OQogICAgLy8gUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDcKICAgID49CiAgICBpbnRjIDggLy8gNTc2CiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA4CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDAKICAgIC8vIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA4CiAgICA+PQogICAgaW50YyA5IC8vIDY3MgogICAgZGlnIDkKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAxCiAgICAvLyBTMzogdmtCeXRlcy5zbGljZSg2NzIsIDc2OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDkKICAgID49CiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDIKICAgIC8vIHBvd2VyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzY4LCA3NzYpKSwKICAgIGludGMgMTEgLy8gNzc2CiAgICBkaWcgMTAKICAgID49CiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDExCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDExCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDMKICAgIC8vIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgaW50YyAxMiAvLyA3ODQKICAgIGRpZyAxMQogICAgPj0KICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNAogICAgLy8gazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgaW50YyAxMyAvLyA3OTIKICAgIGRpZyAxMgogICAgPj0KICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNQogICAgLy8gazI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3OTIsIDgwMCkpLAogICAgaW50YyAxNCAvLyA4MDAKICAgIGRpZyAxMwogICAgPj0KICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTQKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNgogICAgLy8gWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICBpbnRjIDE1IC8vIDk5MgogICAgZGlnIDE0CiAgICA+PQogICAgaW50YyAxNSAvLyA5OTIKICAgIHVuY292ZXIgMTUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGMgNSAvLyAxOTIKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgMTkyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTMtMzA3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBRbTogdmtCeXRlcy5zbGljZSgwLCA5NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRcjogdmtCeXRlcy5zbGljZSgxOTIsIDI4OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMTogdmtCeXRlcy5zbGljZSg0ODAsIDU3NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICAvLyAgIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgLy8gICBrMTogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc4NCwgNzkyKSksCiAgICAvLyAgIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIC8vICAgWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICAvLyB9OwogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDM5CiAgICAvLyBsZXQgdGQgPSBvcC5jb25jYXQodmsuUW0sIHZrLlFsKTsKICAgIGV4dHJhY3QgMCA5NgogICAgZGlnIDEKICAgIGV4dHJhY3QgOTYgOTYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUXIpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFvKTsKICAgIGRpZyAxCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQyCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUWMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMSk7CiAgICBkaWcgMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMyKTsKICAgIGRpZyAxCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ1CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzMpOwogICAgc3dhcAogICAgaW50YyA5IC8vIDY3MgogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NwogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAwCgp2ZXJpZnlfZm9yX2hlYWRlckAyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ3CiAgICAvLyBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7CiAgICBmcmFtZV9kaWcgNDcKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNDcKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgYjMyKGZyU2NhbGFyKHNpZ25hbC5uYXRpdmUpKSk7CiAgICBjYWxsc3ViIGIzMgogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNDUKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQ3CiAgICBiIHZlcmlmeV9mb3JfaGVhZGVyQDIKCnZlcmlmeV9hZnRlcl9mb3JANDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkEpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgOTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMAogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDk2IDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU0CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTYKICAgIC8vIGNvbnN0IGJldGEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2MQogICAgLy8gY29uc3QgZ2FtbWEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgZHVwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDY4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgZ2FtbWEuYnl0ZXMpOwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlopOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzAKICAgIC8vIGNvbnN0IGFscGhhID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3NwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18xIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDc4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDcgLy8gNDgwCiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOCAvLyA1NzYKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4MAogICAgLy8gY29uc3QgeGkgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg3CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9hLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4NjQgLy8gODY0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9iLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4OTYgLy8gODk2CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9jLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5MjggLy8gOTI4CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9zMS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTYwIC8vIDk2MAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczIuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDE1IC8vIDk5MgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE0CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfencuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDEwMjQgLy8gMTAyNAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NAogICAgLy8gY29uc3QgdiA9IG5ldyBGaXhlZEFycmF5PFVpbnQyNTYsIDY+KCk7CiAgICBpbnRjIDUgLy8gMTkyCiAgICBiemVybwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk1CiAgICAvLyB2WzFdID0gZ2V0Q2hhbGxlbmdlKHRkKTsgLy8gdjEKICAgIHN3YXAKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICByZXBsYWNlMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgcHVzaGludCAyIC8vIDIKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BANToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAzMgogICAgKgogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk3CiAgICAvLyB2W2ldID0gbmV3IFVpbnQyNTYoZnJNdWwoKHZbaSAtIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgdlsxXS5uYXRpdmUpKTsgLy8gdltpXSA9IHYxXmkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMCAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBzd2FwCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEA1Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMSAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA1CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuV3hpdyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgMTAgLy8gNzY4CiAgICBpbnRjXzEgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDYKICAgIC8vIGNvbnN0IHUgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwOC01MTcKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGJldGEsCiAgICAvLyAgIGdhbW1hLAogICAgLy8gICBhbHBoYSwKICAgIC8vICAgeGksCiAgICAvLyAgIHYsCiAgICAvLyAgIHUsCiAgICAvLyAgIHhpbjogbmV3IFVpbnQyNTYoKSwKICAgIC8vICAgemg6IG5ldyBVaW50MjU2KCksCiAgICAvLyB9OwogICAgZnJhbWVfZGlnIDQ1CiAgICBmcmFtZV9kaWcgMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc4CiAgICAvLyBkZWJ1Z0xvZygiYmV0YSIsIGNoYWxsZW5nZXMuYmV0YS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgcHVzaGJ5dGVzICJiZXRhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc5CiAgICAvLyBkZWJ1Z0xvZygiZ2FtbWEiLCBjaGFsbGVuZ2VzLmdhbW1hLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMgogICAgcHVzaGJ5dGVzICJnYW1tYSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MAogICAgLy8gZGVidWdMb2coImFscGhhIiwgY2hhbGxlbmdlcy5hbHBoYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIHB1c2hieXRlcyAiYWxwaGEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODEKICAgIC8vIGRlYnVnTG9nKCJ4aSIsIGNoYWxsZW5nZXMueGkuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyCiAgICBwdXNoYnl0ZXMgInhpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODIKICAgIC8vIGRlYnVnTG9nKCJ1IiwgY2hhbGxlbmdlcy51LmJ5dGVzKTsKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAidSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MwogICAgLy8gZGVidWdMb2coInhpbiIsIGNoYWxsZW5nZXMueGluLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDE2IC8vIDM1MgogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ4aW4iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODQKICAgIC8vIGRlYnVnTG9nKCJ6aCIsIGNoYWxsZW5nZXMuemguYnl0ZXMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAiemgiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBzd2FwCiAgICBleHRyYWN0IDEyOCAxOTIKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlsxXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NS0zODYKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg2CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJ2WzJdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg3CiAgICAvLyBkZWJ1Z0xvZygidlszXSIsIChjaGFsbGVuZ2VzLnZbM10gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzNdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg4CiAgICAvLyBkZWJ1Z0xvZygidls0XSIsIChjaGFsbGVuZ2VzLnZbNF0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls0XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OQogICAgLy8gZGVidWdMb2coInZbNV0iLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGV4dHJhY3QgMTYwIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzVdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMxCiAgICAvLyBsZXQgZG9tYWluU2l6ZTogdWludDY0ID0gMTsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSAzMwoKdmVyaWZ5X3doaWxlX3RvcEAxMDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMCAvLyA3NjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMzUKICAgID4KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAxMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMzCiAgICBkdXAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzNAogICAgLy8gZG9tYWluU2l6ZSAqPSAyOwogICAgZnJhbWVfZGlnIDM0CiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNQogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDEwCgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzcKICAgIC8vIGNoYWxsZW5nZXMueGluID0gbmV3IFVpbnQyNTYoeGluKTsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGR1cDIKICAgIGJ8CiAgICBmcmFtZV9kaWcgMTcKICAgIGludGMgMTYgLy8gMzUyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzgKICAgIC8vIGNoYWxsZW5nZXMuemggPSBuZXcgVWludDI1NihmclN1Yih4aW4sIEJpZ1VpbnQoMSkpKTsgLy8gVmFuaXNoaW5nIHBvbHlub21pYWwgWl9IKM6+KSA9IM6+Xm4gLSAxCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgY2FsbHN1YiBmclN1YgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciAyCiAgICBifAogICAgaW50YyA0IC8vIDM4NAogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU0MAogICAgLy8gY29uc3QgbiA9IGZyU2NhbGFyKEJpZ1VpbnQoZG9tYWluU2l6ZSkpOwogICAgZnJhbWVfZGlnIDM0CiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNTgKICAgIC8vIHJldHVybiBhICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDYKICAgIC8vIGxldCB3ID0gQmlnVWludCgxKTsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU1CiAgICAvLyBjb25zdCBMOiBVaW50MjU2W10gPSBbbmV3IFVpbnQyNTYoKV07CiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NTgKICAgIC8vIGNvbnN0IGl0ZXJhdGlvbnM6IHVpbnQ2NCA9IHZrLm5QdWJsaWMgPT09IDAgPyAxIDogdmsublB1YmxpYzsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMSAvLyA3NzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGJueiB2ZXJpZnlfdGVybmFyeV9mYWxzZUAxNAogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzYKCnZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzcKCnZlcmlmeV93aGlsZV90b3BAMTY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDE7IGkgPD0gaXRlcmF0aW9uczsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzcKICAgIGZyYW1lX2RpZyAzNgogICAgPD0KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAyMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYzCiAgICAvLyBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY0CiAgICAvLyBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDk2IDMyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAyMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAxCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KHggIT09ICgwbiBhcyBiaWd1aW50KSwgIkZyIGludmVyc2Ugb2YgemVybyIpOwogICAgZHVwCiAgICBieXRlY18xIC8vIDB4CiAgICBiIT0KICAgIGFzc2VydCAvLyBGciBpbnZlcnNlIG9mIHplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgcHVzaGJ5dGVzIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmVmZmZmZmZmZgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTAKICAgIC8vIGxldCByZXN1bHQgPSAxbiBhcyBiaWd1aW50OwogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5MQogICAgLy8gbGV0IGI6IGJpZ3VpbnQgPSBiYXNlICUgbW9kOwogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEzCiAgICBmcmFtZV9idXJ5IDE4Cgp2ZXJpZnlfd2hpbGVfdG9wQDE4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTgKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGI+CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5My05OQogICAgLy8gd2hpbGUgKGUgPiAoMG4gYXMgYmlndWludCkpIHsKICAgIC8vICAgaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgLy8gICB9CiAgICAvLyAgIGIgPSAoYiAqIGIpICUgbW9kOwogICAgLy8gICBlID0gZSAvIEJpZ1VpbnQoMik7CiAgICAvLyB9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk0CiAgICAvLyBpZiAoKGUgJiAoMW4gYXMgYmlndWludCkpICE9PSAoMG4gYXMgYmlndWludCkpIHsKICAgIGZyYW1lX2RpZyAxOAogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBiJgogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBmcmFtZV9kaWcgMjUKICAgIGZyYW1lX2J1cnkgMjYKICAgIGJ6IHZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9kaWcgMTMKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgYiUKICAgIGZyYW1lX2J1cnkgMjYKCnZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxOgogICAgZnJhbWVfZGlnIDI2CiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBmcmFtZV9kaWcgMTMKICAgIGR1cAogICAgYioKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk3CiAgICAvLyBiID0gKGIgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5OAogICAgLy8gZSA9IGUgLyBCaWdVaW50KDIpOwogICAgZnJhbWVfZGlnIDE4CiAgICBwdXNoYnl0ZXMgMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMTgKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxOAoKdmVyaWZ5X2FmdGVyX3doaWxlQDIyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTI1CiAgICAvLyByZXR1cm4gKGFOICogYkludikgJSByOwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYxLTU2NgogICAgLy8gbmV3IFVpbnQyNTYoCiAgICAvLyAgIGZyRGl2KAogICAgLy8gICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICApLAogICAgLy8gKSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGZyYW1lX2RpZyAzCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYwLTU2NwogICAgLy8gTC5wdXNoKAogICAgLy8gICBuZXcgVWludDI1NigKICAgIC8vICAgICBmckRpdigKICAgIC8vICAgICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICAgIGZyTXVsKG4sIGZyU3ViKGNoYWxsZW5nZXMueGkubmF0aXZlLCB3KSksCiAgICAvLyAgICAgKSwKICAgIC8vICAgKSwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NjgKICAgIC8vIHcgPSBmck11bCh3LCBST09UX09GX1VOSVRZKTsgLy8gTmV4dCByb290IG9mIHVuaXR5IHN0ZXAgKM+JXmkpCiAgICBieXRlY18zIC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNwogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDE2Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjM6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NzAKICAgIC8vIHJldHVybiB7IEwsIGNoYWxsZW5nZXMgfTsKICAgIHB1c2hieXRlcyAweDAxYTIKICAgIGZyYW1lX2RpZyAxNwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzkyLTM5NgogICAgLy8gY29uc3QgeyBMLCBjaGFsbGVuZ2VzOiB1cGRhdGVkQ2hhbGxlbmdlcyB9ID0gY2FsY3VsYXRlTGFncmFuZ2VFdmFsdWF0aW9ucygKICAgIC8vICAgY2hhbGxlbmdlcywKICAgIC8vICAgdmssCiAgICAvLyApOwogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGV4dHJhY3QgMzQgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzk2CiAgICAvLyBkZWJ1Z0xvZygiTDEoeGkpIiwgKExbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJMMSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODAKICAgIC8vIGxldCBwaSA9IEJpZ1VpbnQoMCk7CiAgICBieXRlY18xIC8vIDB4CiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQoKdmVyaWZ5X3doaWxlX3RvcEAyNjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MQogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHB1YmxpY1NpZ25hbHMubGVuZ3RoOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfZGlnIDQ2CiAgICA8CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MgogICAgLy8gY29uc3QgdyA9IGZyU2NhbGFyKChwdWJsaWNTaWduYWxzW2ldIGFzIFVpbnQyNTYpLm5hdGl2ZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDMyCiAgICAqCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgzCiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM1CiAgICBpbnRjXzAgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgzCiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBmcmFtZV9kaWcgMjQKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIGZyYW1lX2J1cnkgMjQKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAyNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDI4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTg1CiAgICAvLyByZXR1cm4gbmV3IFVpbnQyNTYocGkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDAxCiAgICAvLyBkZWJ1Z0xvZygiUEkoeGkpIiwgcGkuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJQSSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYwNgogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5hbHBoYS5uYXRpdmUsIGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlKSwKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50cyAyIDQxNiAvLyAyLCA0MTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2RpZyAzMAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjEzCiAgICAvLyBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBwcm9vZi5ldmFsX3MxLm5hdGl2ZSksCiAgICBkaWcgMgogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxNgogICAgZHVwCiAgICBjb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTkKICAgIGR1cAogICAgY292ZXIgNwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjE1CiAgICAvLyBlM2EgPSBmckFkZChlM2EsIGNoYWxsZW5nZXMuZ2FtbWEubmF0aXZlKTsKICAgIGRpZyA1CiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMwogICAgZnJhbWVfZGlnIDE0CiAgICBkdXAKICAgIGNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgY292ZXIgNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGZyYW1lX2RpZyAyMQogICAgZHVwCiAgICBjb3ZlciAxNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZHVwCiAgICBkaWcgNQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgY292ZXIgMTQKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzAKICAgIC8vIGNvbnN0IHIwID0gZnJTdWIoZnJTdWIoZTEsIGUyKSwgZTMpOwogICAgdW5jb3ZlciAxMQogICAgZGlnIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYzMQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHIwKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMTMKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDUKICAgIC8vIGRlYnVnTG9nKCJyMCIsIHIwLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAicjAiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY1OQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuVDEpOwogICAgZnJhbWVfZGlnIDQwCiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NjAKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY2MQogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIDkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjYyCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCB2ay5RYyk7CiAgICBmcmFtZV9kaWcgNDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEyCiAgICBkaWcgNwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjcxCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjEgPSBmclN1YihCaWdVaW50KDApLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSk7IC8vIOKIknpoIChhcHBsaWVzIHRvIFQxKQogICAgZGlnIDEyCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBieXRlY18xIC8vIDB4CiAgICBkaWcgMQogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc0CiAgICAvLyBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIGRpZyAxNAogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MwogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzEgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3Mi02NzUKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMiA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICk7IC8vIOKIknhpbsK3emggKGFwcGxpZXMgdG8gVDIpCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3NwogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzEgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3Ni02ODIKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMyA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bCgKICAgIC8vICAgICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMueGluLm5hdGl2ZSksCiAgICAvLyAgICAgY2hhbGxlbmdlcy56aC5uYXRpdmUsCiAgICAvLyAgICksCiAgICAvLyApOyAvLyDiiJJ4aW7CssK3emggKGFwcGxpZXMgdG8gVDMpCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2ODUKICAgIC8vIGNvbnN0IGJldGF4aSA9IGZyTXVsKGNoYWxsZW5nZXMuYmV0YS5uYXRpdmUsIGNoYWxsZW5nZXMueGkubmF0aXZlKTsKICAgIGRpZyAxNQogICAgZXh0cmFjdCA5NiAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEzCiAgICBkaWcgMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZHVwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDE0CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMTIKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5MQogICAgLy8gZnJBZGQocHJvb2YuZXZhbF9iLm5hdGl2ZSwgZnJNdWwoYmV0YXhpLCBCaWdVaW50KHZrLmsxKSkpLAogICAgZnJhbWVfZGlnIDM5CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGMgMTIgLy8gNzg0CiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDEzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMTMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5NQogICAgLy8gZnJBZGQocHJvb2YuZXZhbF9jLm5hdGl2ZSwgZnJNdWwoYmV0YXhpLCBCaWdVaW50KHZrLmsyKSkpLAogICAgZGlnIDMKICAgIGludGMgMTMgLy8gNzkyCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxMgogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxMgogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZGlnIDEzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHVuY292ZXIgMTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwMwogICAgLy8gY29uc3QgelNjYWxhciA9IGZyQWRkKGZyQWRkKGQyYSwgZDJiKSwgY2hhbGxlbmdlcy51Lm5hdGl2ZSk7CiAgICBkaWcgMTMKICAgIHB1c2hpbnQgMzIwIC8vIDMyMAogICAgaW50Y18wIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBkaWcgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZGlnIDE1CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICB1bmNvdmVyIDExCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjcKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLlopOwogICAgdW5jb3ZlciA5CiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjgKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHZrLlMzKTsKICAgIGZyYW1lX2RpZyA0NAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjkKICAgIC8vIHBvaW50cyA9IG9wLmNvbmNhdChwb2ludHMsIHByb29mLkEpOwogICAgZnJhbWVfZGlnIDEwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczMAogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgcHJvb2YuQik7CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzMxCiAgICAvLyBwb2ludHMgPSBvcC5jb25jYXQocG9pbnRzLCBwcm9vZi5DKTsKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczMgogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgdmsuUzEpOwogICAgZnJhbWVfZGlnIDQyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczMwogICAgLy8gcG9pbnRzID0gb3AuY29uY2F0KHBvaW50cywgdmsuUzIpOwogICAgZnJhbWVfZGlnIDQzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczNgogICAgLy8gbGV0IHNjYWxhcnMgPSBvcC5jb25jYXQoYjMyKGdhdGVTY2FsYXIxKSwgYjMyKGdhdGVTY2FsYXIyKSk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgYjMyCiAgICBkaWcgMTMKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjczNwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCBiMzIoZ2F0ZVNjYWxhcjMpKTsKICAgIGRpZyAxMQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzM4CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihnYXRlU2NhbGFyNCkpOwogICAgZGlnIDE1CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzkKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMSkpOwogICAgdW5jb3ZlciA5CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDAKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMikpOwogICAgdW5jb3ZlciA4CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDEKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMykpOwogICAgdW5jb3ZlciA3CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDIKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKEJpZ1VpbnQoMSkpKTsgLy8gUWMgd2l0aCBzY2FsYXIgMQogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDMKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgYjMyKHpTY2FsYXIpKTsgLy8gWiB3aXRoIHpTY2FsYXIKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ0CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIGIzMihmclN1YihCaWdVaW50KDApLCBzM1NjYWxhcikpKTsgLy8gUzMgd2l0aCAtczNTY2FsYXIKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBmclN1YgogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ1CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgdW5jb3ZlciA3CiAgICBleHRyYWN0IDEyOCAxOTIKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ1LTc0NgogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIC8vIHNjYWxhcnMgPSBvcC5jb25jYXQoc2NhbGFycywgKGNoYWxsZW5nZXMudlsyXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgMgogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NgogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc0NwogICAgLy8gc2NhbGFycyA9IG9wLmNvbmNhdChzY2FsYXJzLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ4CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbNF0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDQKICAgIGV4dHJhY3QgMTI4IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ5CiAgICAvLyBzY2FsYXJzID0gb3AuY29uY2F0KHNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbNV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc1Mi03NTYKICAgIC8vIGNvbnN0IEYgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgcG9pbnRzLAogICAgLy8gICBzY2FsYXJzLAogICAgLy8gKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KTsKICAgIHVuY292ZXIgNgogICAgc3dhcAogICAgZWNfbXVsdGlfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA5CiAgICAvLyBkZWJ1Z0xvZygiRiIsIGYpOwogICAgcHVzaGJ5dGVzICJGIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMTEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc3Mi03NzUKICAgIC8vIGxldCBlID0gZnJTdWIoCiAgICAvLyAgIGZyTXVsKChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikubmF0aXZlLCBwcm9vZi5ldmFsX2EubmF0aXZlKSwKICAgIC8vICAgcjAubmF0aXZlLAogICAgLy8gKTsKICAgIHVuY292ZXIgOQogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDkKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDkKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDkKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDcKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDIKICAgIHVuY292ZXIgNgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3ODgKICAgIC8vIGNvbnN0IHJlcyA9IGcxVGltZXNGcihHMV9PTkUudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksIGUpOwogICAgcHVzaGJ5dGVzIDB4MTdmMWQzYTczMTk3ZDc5NDI2OTU2MzhjNGZhOWFjMGZjMzY4OGM0Zjk3NzRiOTA1YTE0ZTNhM2YxNzFiYWM1ODZjNTVlODNmZjk3YTFhZWZmYjNhZjAwYWRiMjJjNmJiMDhiM2Y0ODFlM2FhYTBmMWEwOWUzMGVkNzQxZDhhZTRmY2Y1ZTA5NWQ1ZDAwYWY2MDBkYjE4Y2IyYzA0YjNlZGQwM2NjNzQ0YTI4ODhhZTQwY2FhMjMyOTQ2YzVlN2UxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgc3dhcAogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQxMwogICAgLy8gZGVidWdMb2coIkUiLCBlKTsKICAgIHB1c2hieXRlcyAiRSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyAyMwogICAgZGlnIDMKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyAyNwogICAgc3dhcAogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgZGlnIDUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgyMAogICAgLy8gUk9PVF9PRl9VTklUWSwKICAgIGJ5dGVjXzMgLy8gVE1QTF9ST09UX09GX1VOSVRZCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MjIKICAgIC8vIGNvbnN0IHBhaXJpbmdTY2FsYXJzID0gb3AuY29uY2F0KGNoYWxsZW5nZXMueGkuYnl0ZXMsIGIzMihzKSk7CiAgICBjYWxsc3ViIGIzMgogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgyNC04MjgKICAgIC8vIGxldCBCMSA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsTXVsdGkoCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBwYWlyaW5nUG9pbnRzLAogICAgLy8gICBwYWlyaW5nU2NhbGFycywKICAgIC8vICkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSk7CiAgICBmcmFtZV9kaWcgMjgKICAgIHN3YXAKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgdW5jb3ZlciAzCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gZzFUaW1lc0ZyKHAsIFJfTUlOVVNfMSk7CiAgICBieXRlYyA0IC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gZzFUaW1lc0ZyKHAsIFJfTUlOVVNfMSk7CiAgICBieXRlYyA0IC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzUKICAgIC8vIG9wLmNvbmNhdChnMU5lZyhBMSksIEIxKSwgLy8gRzEgcG9pbnRzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgzNgogICAgLy8gb3AuY29uY2F0KHZrLlhfMiwgRzJfT05FKSwgLy8gRzIgcG9pbnRzCiAgICBzd2FwCiAgICBpbnRjIDE0IC8vIDgwMAogICAgaW50YyA1IC8vIDE5MgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAweDAyNGFhMmIyZjA4ZjBhOTEyNjA4MDUyNzJkYzUxMDUxYzZlNDdhZDRmYTQwM2IwMmI0NTEwYjY0N2FlM2QxNzcwYmFjMDMyNmE4MDViYmVmZDQ4MDU2YzhjMTIxYmRiODEzZTAyYjYwNTI3MTlmNjA3ZGFjZDNhMDg4Mjc0ZjY1NTk2YmQwZDA5OTIwYjYxYWI1ZGE2MWJiZGM3ZjUwNDkzMzRjZjExMjEzOTQ1ZDU3ZTVhYzdkMDU1ZDA0MmI3ZTBjZTVkNTI3NzI3ZDZlMTE4Y2M5Y2RjNmRhMmUzNTFhYWRmZDliYWE4Y2JkZDNhNzZkNDI5YTY5NTE2MGQxMmM5MjNhYzljYzNiYWNhMjg5ZTE5MzU0ODYwOGI4MjgwMTA2MDZjNGEwMmVhNzM0Y2MzMmFjZDJiMDJiYzI4Yjk5Y2IzZTI4N2U4NWE3NjNhZjI2NzQ5MmFiNTcyZTk5YWIzZjM3MGQyNzVjZWMxZGExYWFhOTA3NWZmMDVmNzliZQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzMtODM3CiAgICAvLyBjb25zdCByZXMgPSBvcC5FbGxpcHRpY0N1cnZlLnBhaXJpbmdDaGVjaygKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIG9wLmNvbmNhdChnMU5lZyhBMSksIEIxKSwgLy8gRzEgcG9pbnRzCiAgICAvLyAgIG9wLmNvbmNhdCh2ay5YXzIsIEcyX09ORSksIC8vIEcyIHBvaW50cwogICAgLy8gKTsKICAgIGVjX3BhaXJpbmdfY2hlY2sgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI5CiAgICAvLyBhc3NlcnQodmVyaWZ5RnJvbVRlbXBsYXRlV2l0aExvZ3Moc2lnbmFscywgcHJvb2YpLCAiVmVyaWZpY2F0aW9uIGZhaWxlZCIpOwogICAgYXNzZXJ0IC8vIFZlcmlmaWNhdGlvbiBmYWlsZWQKICAgIHJldHN1YgoKdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMzgKICAgIGZyYW1lX2J1cnkgMzYKICAgIGIgdmVyaWZ5X3Rlcm5hcnlfbWVyZ2VAMTUK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARIGABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEAIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////8AAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIg5EIq+L/6tJFSISRImKAQGL/wIoqkkVIg5EIq+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNI0sCDyNLA08CTUsDTwJLAlJJFSMSRCEFSwMPIQVLBE8CTUsETwNLAlJJFSMSRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSMSRCEESwUPIQRLBk8CTUsGTwNLAlJJFSMSRCEHSwYPIQdLB08CTUsHTwNLAlJJFSMSRCEISwcPIQhLCE8CTUsITwNLAlJJFSMSRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSMSRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSMSRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGI1hQSU4CSwEhBCNYSU4DUEsBIQcjWElOA1BLASEII1hJTgNQTCEJI1hJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIiCyJYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAqLLUxQi/9XYGBJjAtQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGI1hJjAZQiP3jSYwMi/8hBCNYSYwHUIv/IQcjWEmMCFCL/yEII1hJjAlQiP2/SYwgi/+B4AYiWEmME1CL/4GAByJYSYwUUIv/gaAHIlhJjBVQi/+BwAciWEmMEFCL/yEPIlhJjA5Qi/+BgAgiWEmMD1AhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIguLHUlPAiJYSwFXICCjKKpJFSIORCKvq0sCIgtMXYwdJAiMI0L/y4v/IQkjWEmMG4v/IQojWEmMF1BJjByI/R6LLYsMUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEUlXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiJYgAF1sLBLASEQIliAA3hpbrCwSwEhBCJYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUiDkQir0mMA0qrixEhEE8CXU8CKoj7yUkVIg5ETwKrIQRMXYwRiyIWKKqMFiqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABUEkjCQkjCWLJYskDkEAvIsRSSEEIliLH0lPAqMoqk8CV2AgTwKI+1mLFqMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowNjBKLEimlQQAtixIqrCmpixmMGkEACYsZiw2jKKqMGosajBmLDUmjKKqMDYsSgAECoowSQv/MiwGLGaMoqkkVIg5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfK6MoqowfiyUkCIwlQv88gAIBoosRUIsAUEmMBEklWUsBFVJJVwIAjAJXIiBJjB6ABkwxKHhpKbCwKYwYJYwjiyOLLgxBACuL/lcCAIsjSU4CIgsiWCiqTCQISYwjIguLAkwiWKMoqosYTIj6WIwYQv/NixhJFSIORIsDSU4Cq4AGUEkoeGkpsEmwiwSDAgKgA1hJV0AgSUsBoyiqix6jKKpLAlcAIEmLEElOCKMoqosTSU4HKKpMKKpLAaAoqksFVyAgTCiqTCiqTEsBoCiqSwOLDklODKMoqosUSU4EKKpMKKpLAaAoqiiqSwOgKKqLFUlODiiqSUsFoCiqTwRPA6MoqklPAqMoqosPSU4OoyiqSwmjKKpPC0sJiPmoTIj5pEkVIg5ETw2rgAJyMLBJsIsoiwdQiwhQiwlQiylQSwxLB6MoqksMIQQiWClLAYj5dEsOIRAiWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJLD1dgIEsNSwGjKKpJKKpPDqAoqiiqSwygKKqLJ0lOAyEMgQhYSwKjKKooqk8NoCiqKKpLDaAoqksDIQ2BCFhPA6MoqiiqTwygKKooqk8MoCiqTgKjKKqjKKpLDaMoqiiqTwwoqqAoqksNgcACIlhMKKpLASiqoCiqTw1PDaMoqksPoyiqTwujKKpPCYsGUIssUIsKUIsLUIsFUIsqUIsrUE8JiPi/Sw2I+LpQSwuI+LRQSw+I+K5QTwmI+KhQTwiI+KJQTweI+JxQKoj4l1BPA4j4kVApTwOI+HeI+IdQTwdXgMBJVyAgTwJLAVBLAldAIExLAVBLA1dgIExLAVBLBFeAIExLAVBPBVegIExLAVBPBkzjAkkVIxJEgAFGsEmwTwVPC6Moqk8JiPglTwVPCaMoqkwoqkwoqqAoqk8ETwmjKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIxJEgAFFsEmwixdLA+ECSRUjEkSLG0zgAkkVIxJETwNLBaMoqiujKKqI91VPBUxQixxM4wJJFSMSRE8D4AJJFSMSRE8CJwThAkkVIxJE4AJJFSMSREwnBOECSRUjEkRMUEwhDiEFWIDAAQJKorLwjwqRJggFJy3FEFHG5HrU+kA7ArRRC2R649F3C6wDJqgFu+/UgFbIwSG9uBPgK2BScZ9gfazToIgnT2VZa9DQmSC2GrXaYbvcf1BJM0zxEhOUXVflrH0FXQQrfgzl1SdyfW4RjMnNxtouNRqt/ZuqjL3Tp21CmmlRYNEskjrJzDusoonhk1SGCLgoAQYGxKAupzTMMqzSsCvCi5nLPih+hadjryZ0kqtXLpmrPzcNJ1zsHaGqqQdf8F95vlDiAkSJiyaMJEL6uw==", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
468
470
  var PlonkVerifierWithLogsParamsFactory = class {
469
471
  /**
470
472
  * Gets available closeOut ABI call param factories
@@ -870,9 +872,9 @@ var PlonkVerifierWithLogsClient = class _PlonkVerifierWithLogsClient {
870
872
 
871
873
  // src/index.ts
872
874
  var snarkjs = __toESM(require("snarkjs"), 1);
873
- var import_app_arc563 = require("@algorandfoundation/algokit-utils/types/app-arc56");
875
+ var import_app_arc564 = require("@algorandfoundation/algokit-utils/types/app-arc56");
874
876
  var import_fs = require("fs");
875
- var import_algosdk3 = require("algosdk");
877
+ var import_algosdk4 = require("algosdk");
876
878
 
877
879
  // contracts/out/lsig_source.ts
878
880
  var LSIG_SOURCE = `#pragma version 10
@@ -3282,6 +3284,341 @@ getChallenge:
3282
3284
  retsub
3283
3285
  `;
3284
3286
 
3287
+ // contracts/clients/SignalsAndProof.ts
3288
+ var import_algorand_client3 = require("@algorandfoundation/algokit-utils/types/algorand-client");
3289
+ var import_app3 = require("@algorandfoundation/algokit-utils/types/app");
3290
+ var import_app_arc563 = require("@algorandfoundation/algokit-utils/types/app-arc56");
3291
+ var import_app_client3 = require("@algorandfoundation/algokit-utils/types/app-client");
3292
+ var import_app_factory3 = require("@algorandfoundation/algokit-utils/types/app-factory");
3293
+ var import_composer3 = require("@algorandfoundation/algokit-utils/types/composer");
3294
+ var import_transaction3 = require("@algorandfoundation/algokit-utils/types/transaction");
3295
+ var import_algosdk3 = require("algosdk");
3296
+ var APP_SPEC3 = { "name": "SignalsAndProof", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }] }, "methods": [{ "name": "signalsAndProof", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [23], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [38], "errorMessage": "can only call when creating" }, { "pc": [26], "errorMessage": "can only call when not creating" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoxMDEKICAgIC8vIGV4cG9ydCBjbGFzcyBTaWduYWxzQW5kUHJvb2YgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4NDRhNDc4OGIgLy8gbWV0aG9kICJzaWduYWxzQW5kUHJvb2YodWludDI1NltdLChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nikpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fc2lnbmFsc0FuZFByb29mX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGVycgoKbWFpbl9zaWduYWxzQW5kUHJvb2Zfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwMgogICAgLy8gcHVibGljIHNpZ25hbHNBbmRQcm9vZihzaWduYWxzOiBVaW50MjU2W10sIHByb29mOiBQcm9vZik6IHZvaWQge30KICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwMQogICAgLy8gZXhwb3J0IGNsYXNzIFNpZ25hbHNBbmRQcm9vZiBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CjEbQQAYgAREpHiLNhoAjgEAAQAxGRREMRhEgQFDMRlA//AxGBREgQFD", "clear": "CoEBQw==" }, "events": [], "templateVariables": {} };
3297
+ var SignalsAndProofParamsFactory = class {
3298
+ /**
3299
+ * Constructs a no op call for the signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void ABI method
3300
+ *
3301
+ * @param params Parameters for the call
3302
+ * @returns An `AppClientMethodCallParams` object for the call
3303
+ */
3304
+ static signalsAndProof(params) {
3305
+ return {
3306
+ ...params,
3307
+ method: "signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void",
3308
+ args: Array.isArray(params.args) ? params.args : [params.args.signals, params.args.proof]
3309
+ };
3310
+ }
3311
+ };
3312
+ var SignalsAndProofFactory = class {
3313
+ /**
3314
+ * The underlying `AppFactory` for when you want to have more flexibility
3315
+ */
3316
+ appFactory;
3317
+ /**
3318
+ * Creates a new instance of `SignalsAndProofFactory`
3319
+ *
3320
+ * @param params The parameters to initialise the app factory with
3321
+ */
3322
+ constructor(params) {
3323
+ this.appFactory = new import_app_factory3.AppFactory({
3324
+ ...params,
3325
+ appSpec: APP_SPEC3
3326
+ });
3327
+ }
3328
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
3329
+ get appName() {
3330
+ return this.appFactory.appName;
3331
+ }
3332
+ /** The ARC-56 app spec being used */
3333
+ get appSpec() {
3334
+ return APP_SPEC3;
3335
+ }
3336
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
3337
+ get algorand() {
3338
+ return this.appFactory.algorand;
3339
+ }
3340
+ /**
3341
+ * Returns a new `AppClient` client for an app instance of the given ID.
3342
+ *
3343
+ * Automatically populates appName, defaultSender and source maps from the factory
3344
+ * if not specified in the params.
3345
+ * @param params The parameters to create the app client
3346
+ * @returns The `AppClient`
3347
+ */
3348
+ getAppClientById(params) {
3349
+ return new SignalsAndProofClient(this.appFactory.getAppClientById(params));
3350
+ }
3351
+ /**
3352
+ * Returns a new `AppClient` client, resolving the app by creator address and name
3353
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
3354
+ *
3355
+ * Automatically populates appName, defaultSender and source maps from the factory
3356
+ * if not specified in the params.
3357
+ * @param params The parameters to create the app client
3358
+ * @returns The `AppClient`
3359
+ */
3360
+ async getAppClientByCreatorAndName(params) {
3361
+ return new SignalsAndProofClient(await this.appFactory.getAppClientByCreatorAndName(params));
3362
+ }
3363
+ /**
3364
+ * Idempotently deploys the SignalsAndProof smart contract.
3365
+ *
3366
+ * @param params The arguments for the contract calls and any additional parameters for the call
3367
+ * @returns The deployment result
3368
+ */
3369
+ async deploy(params = {}) {
3370
+ const result = await this.appFactory.deploy({
3371
+ ...params
3372
+ });
3373
+ return { result: result.result, appClient: new SignalsAndProofClient(result.appClient) };
3374
+ }
3375
+ /**
3376
+ * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
3377
+ */
3378
+ params = {
3379
+ /**
3380
+ * Gets available create methods
3381
+ */
3382
+ create: {
3383
+ /**
3384
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
3385
+ *
3386
+ * @param params The params for the bare (raw) call
3387
+ * @returns The params for a create call
3388
+ */
3389
+ bare: (params) => {
3390
+ return this.appFactory.params.bare.create(params);
3391
+ }
3392
+ }
3393
+ };
3394
+ /**
3395
+ * Create transactions for the current app
3396
+ */
3397
+ createTransaction = {
3398
+ /**
3399
+ * Gets available create methods
3400
+ */
3401
+ create: {
3402
+ /**
3403
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
3404
+ *
3405
+ * @param params The params for the bare (raw) call
3406
+ * @returns The transaction for a create call
3407
+ */
3408
+ bare: (params) => {
3409
+ return this.appFactory.createTransaction.bare.create(params);
3410
+ }
3411
+ }
3412
+ };
3413
+ /**
3414
+ * Send calls to the current app
3415
+ */
3416
+ send = {
3417
+ /**
3418
+ * Gets available create methods
3419
+ */
3420
+ create: {
3421
+ /**
3422
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
3423
+ *
3424
+ * @param params The params for the bare (raw) call
3425
+ * @returns The create result
3426
+ */
3427
+ bare: async (params) => {
3428
+ const result = await this.appFactory.send.bare.create(params);
3429
+ return { result: result.result, appClient: new SignalsAndProofClient(result.appClient) };
3430
+ }
3431
+ }
3432
+ };
3433
+ };
3434
+ var SignalsAndProofClient = class _SignalsAndProofClient {
3435
+ /**
3436
+ * The underlying `AppClient` for when you want to have more flexibility
3437
+ */
3438
+ appClient;
3439
+ constructor(appClientOrParams) {
3440
+ this.appClient = appClientOrParams instanceof import_app_client3.AppClient ? appClientOrParams : new import_app_client3.AppClient({
3441
+ ...appClientOrParams,
3442
+ appSpec: APP_SPEC3
3443
+ });
3444
+ }
3445
+ /**
3446
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
3447
+ * @returns The typed return value or undefined if there was no value
3448
+ */
3449
+ decodeReturnValue(method, returnValue) {
3450
+ return returnValue !== void 0 ? (0, import_app_arc563.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), APP_SPEC3.structs) : void 0;
3451
+ }
3452
+ /**
3453
+ * Returns a new `SignalsAndProofClient` client, resolving the app by creator address and name
3454
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
3455
+ * @param params The parameters to create the app client
3456
+ */
3457
+ static async fromCreatorAndName(params) {
3458
+ return new _SignalsAndProofClient(await import_app_client3.AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC3 }));
3459
+ }
3460
+ /**
3461
+ * Returns an `SignalsAndProofClient` instance for the current network based on
3462
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
3463
+ *
3464
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
3465
+ * @param params The parameters to create the app client
3466
+ */
3467
+ static async fromNetwork(params) {
3468
+ return new _SignalsAndProofClient(await import_app_client3.AppClient.fromNetwork({ ...params, appSpec: APP_SPEC3 }));
3469
+ }
3470
+ /** The ID of the app instance this client is linked to. */
3471
+ get appId() {
3472
+ return this.appClient.appId;
3473
+ }
3474
+ /** The app address of the app instance this client is linked to. */
3475
+ get appAddress() {
3476
+ return this.appClient.appAddress;
3477
+ }
3478
+ /** The name of the app. */
3479
+ get appName() {
3480
+ return this.appClient.appName;
3481
+ }
3482
+ /** The ARC-56 app spec being used */
3483
+ get appSpec() {
3484
+ return this.appClient.appSpec;
3485
+ }
3486
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
3487
+ get algorand() {
3488
+ return this.appClient.algorand;
3489
+ }
3490
+ /**
3491
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
3492
+ */
3493
+ params = {
3494
+ /**
3495
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
3496
+ *
3497
+ * @param params The params for the bare (raw) call
3498
+ * @returns The clearState result
3499
+ */
3500
+ clearState: (params) => {
3501
+ return this.appClient.params.bare.clearState(params);
3502
+ },
3503
+ /**
3504
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
3505
+ *
3506
+ * @param params The params for the smart contract call
3507
+ * @returns The call params
3508
+ */
3509
+ signalsAndProof: (params) => {
3510
+ return this.appClient.params.call(SignalsAndProofParamsFactory.signalsAndProof(params));
3511
+ }
3512
+ };
3513
+ /**
3514
+ * Create transactions for the current app
3515
+ */
3516
+ createTransaction = {
3517
+ /**
3518
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
3519
+ *
3520
+ * @param params The params for the bare (raw) call
3521
+ * @returns The clearState result
3522
+ */
3523
+ clearState: (params) => {
3524
+ return this.appClient.createTransaction.bare.clearState(params);
3525
+ },
3526
+ /**
3527
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
3528
+ *
3529
+ * @param params The params for the smart contract call
3530
+ * @returns The call transaction
3531
+ */
3532
+ signalsAndProof: (params) => {
3533
+ return this.appClient.createTransaction.call(SignalsAndProofParamsFactory.signalsAndProof(params));
3534
+ }
3535
+ };
3536
+ /**
3537
+ * Send calls to the current app
3538
+ */
3539
+ send = {
3540
+ /**
3541
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
3542
+ *
3543
+ * @param params The params for the bare (raw) call
3544
+ * @returns The clearState result
3545
+ */
3546
+ clearState: (params) => {
3547
+ return this.appClient.send.bare.clearState(params);
3548
+ },
3549
+ /**
3550
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
3551
+ *
3552
+ * @param params The params for the smart contract call
3553
+ * @returns The call result
3554
+ */
3555
+ signalsAndProof: async (params) => {
3556
+ const result = await this.appClient.send.call(SignalsAndProofParamsFactory.signalsAndProof(params));
3557
+ return { ...result, return: result.return };
3558
+ }
3559
+ };
3560
+ /**
3561
+ * Clone this app client with different params
3562
+ *
3563
+ * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
3564
+ * @returns A new app client with the altered params
3565
+ */
3566
+ clone(params) {
3567
+ return new _SignalsAndProofClient(this.appClient.clone(params));
3568
+ }
3569
+ /**
3570
+ * Methods to access state for the current SignalsAndProof app
3571
+ */
3572
+ state = {};
3573
+ newGroup() {
3574
+ const client = this;
3575
+ const composer = this.algorand.newGroup();
3576
+ let promiseChain = Promise.resolve();
3577
+ const resultMappers = [];
3578
+ return {
3579
+ /**
3580
+ * Add a signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void method call against the SignalsAndProof contract
3581
+ */
3582
+ signalsAndProof(params) {
3583
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.signalsAndProof(params)));
3584
+ resultMappers.push(void 0);
3585
+ return this;
3586
+ },
3587
+ /**
3588
+ * Add a clear state call to the SignalsAndProof contract
3589
+ */
3590
+ clearState(params) {
3591
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
3592
+ return this;
3593
+ },
3594
+ addTransaction(txn, signer) {
3595
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
3596
+ return this;
3597
+ },
3598
+ async composer() {
3599
+ await promiseChain;
3600
+ return composer;
3601
+ },
3602
+ async simulate(options) {
3603
+ await promiseChain;
3604
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
3605
+ return {
3606
+ ...result,
3607
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
3608
+ };
3609
+ },
3610
+ async send(params) {
3611
+ await promiseChain;
3612
+ const result = await composer.send(params);
3613
+ return {
3614
+ ...result,
3615
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
3616
+ };
3617
+ }
3618
+ };
3619
+ }
3620
+ };
3621
+
3285
3622
  // src/index.ts
3286
3623
  function stringValuesToBigints(obj) {
3287
3624
  for (const key in obj) {
@@ -3328,7 +3665,7 @@ async function getVkey(zKey2, curve) {
3328
3665
  };
3329
3666
  }
3330
3667
  function encodeVk(vkey, appSpec) {
3331
- return (0, import_app_arc563.getABIEncodedValue)(vkey, "VerificationKey", appSpec.structs);
3668
+ return (0, import_app_arc564.getABIEncodedValue)(vkey, "VerificationKey", appSpec.structs);
3332
3669
  }
3333
3670
  async function getProof(path, curve) {
3334
3671
  const proof = JSON.parse((0, import_fs.readFileSync)(path, "utf8"));
@@ -3536,6 +3873,8 @@ var AppVerifier = class {
3536
3873
  AppVerifier,
3537
3874
  LsigVerifier,
3538
3875
  PlonkVerifierClient,
3876
+ SignalsAndProofClient,
3877
+ SignalsAndProofFactory,
3539
3878
  encodeProof,
3540
3879
  encodeSignals,
3541
3880
  encodeVk,