@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/capabilities.d.ts +4 -4
  2. package/dist/capabilities.js +5 -5
  3. package/dist/capture-stack.d.ts +1 -1
  4. package/dist/capture-stack.js +2 -2
  5. package/dist/class-serialization.d.ts +8 -8
  6. package/dist/class-serialization.js +9 -9
  7. package/dist/classify-error.js +5 -5
  8. package/dist/context-violation-error.d.ts +5 -5
  9. package/dist/context-violation-error.d.ts.map +1 -1
  10. package/dist/context-violation-error.js +5 -5
  11. package/dist/create-hook.d.ts +10 -6
  12. package/dist/create-hook.d.ts.map +1 -1
  13. package/dist/create-hook.js +1 -1
  14. package/dist/define-hook.js +2 -2
  15. package/dist/describe-error.d.ts +7 -7
  16. package/dist/describe-error.js +8 -8
  17. package/dist/encryption.d.ts +5 -5
  18. package/dist/encryption.js +7 -7
  19. package/dist/events-consumer.d.ts +19 -7
  20. package/dist/events-consumer.d.ts.map +1 -1
  21. package/dist/events-consumer.js +33 -12
  22. package/dist/flushable-stream.d.ts +4 -4
  23. package/dist/flushable-stream.js +12 -12
  24. package/dist/global.d.ts +1 -1
  25. package/dist/global.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/log-format.d.ts +2 -2
  29. package/dist/log-format.js +5 -5
  30. package/dist/logger.js +4 -4
  31. package/dist/private.d.ts +39 -64
  32. package/dist/private.d.ts.map +1 -1
  33. package/dist/private.js +294 -48
  34. package/dist/replay-payload-cache.d.ts +1 -1
  35. package/dist/replay-payload-cache.js +4 -4
  36. package/dist/runtime/compute-instance.d.ts +4 -3
  37. package/dist/runtime/compute-instance.d.ts.map +1 -1
  38. package/dist/runtime/compute-instance.js +5 -4
  39. package/dist/runtime/constants.d.ts +46 -19
  40. package/dist/runtime/constants.d.ts.map +1 -1
  41. package/dist/runtime/constants.js +76 -38
  42. package/dist/runtime/count-step-started-events.d.ts +7 -7
  43. package/dist/runtime/count-step-started-events.js +4 -4
  44. package/dist/runtime/deployment-guard.d.ts +7 -7
  45. package/dist/runtime/deployment-guard.js +8 -8
  46. package/dist/runtime/get-port-lazy.d.ts +2 -2
  47. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  48. package/dist/runtime/get-port-lazy.js +37 -30
  49. package/dist/runtime/get-world-lazy.d.ts +2 -2
  50. package/dist/runtime/get-world-lazy.js +3 -3
  51. package/dist/runtime/helpers.d.ts +18 -18
  52. package/dist/runtime/helpers.js +27 -27
  53. package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
  54. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  55. package/dist/runtime/quickjs-entrypoint.js +200 -81
  56. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  57. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  58. package/dist/runtime/quickjs-runtime.js +126 -77
  59. package/dist/runtime/quickjs-serde.d.ts +10 -10
  60. package/dist/runtime/quickjs-serde.js +20 -20
  61. package/dist/runtime/replay-budget.d.ts +4 -4
  62. package/dist/runtime/replay-budget.js +5 -5
  63. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  64. package/dist/runtime/replay-recovery-reporter.js +2 -2
  65. package/dist/runtime/resume-hook.d.ts +2 -2
  66. package/dist/runtime/resume-hook.js +27 -27
  67. package/dist/runtime/resume-latency.d.ts +25 -25
  68. package/dist/runtime/resume-latency.d.ts.map +1 -1
  69. package/dist/runtime/resume-latency.js +4 -4
  70. package/dist/runtime/run-id-time.d.ts +2 -2
  71. package/dist/runtime/run-id-time.js +5 -5
  72. package/dist/runtime/run.d.ts +21 -4
  73. package/dist/runtime/run.d.ts.map +1 -1
  74. package/dist/runtime/run.js +154 -35
  75. package/dist/runtime/runs.d.ts +4 -4
  76. package/dist/runtime/runs.js +2 -2
  77. package/dist/runtime/start.d.ts +3 -3
  78. package/dist/runtime/start.d.ts.map +1 -1
  79. package/dist/runtime/start.js +27 -23
  80. package/dist/runtime/step-executor.d.ts +59 -11
  81. package/dist/runtime/step-executor.d.ts.map +1 -1
  82. package/dist/runtime/step-executor.js +116 -42
  83. package/dist/runtime/step-latency.d.ts +20 -14
  84. package/dist/runtime/step-latency.d.ts.map +1 -1
  85. package/dist/runtime/step-latency.js +13 -11
  86. package/dist/runtime/step-ownership.d.ts +6 -6
  87. package/dist/runtime/step-ownership.js +8 -8
  88. package/dist/runtime/step-single-flight.d.ts +1 -1
  89. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  90. package/dist/runtime/step-single-flight.js +17 -11
  91. package/dist/runtime/suspension-handler.d.ts +99 -7
  92. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  93. package/dist/runtime/suspension-handler.js +678 -57
  94. package/dist/runtime/unserializable-step.d.ts +34 -0
  95. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  96. package/dist/runtime/unserializable-step.js +52 -0
  97. package/dist/runtime/vm-mode.d.ts +1 -1
  98. package/dist/runtime/vm-mode.js +2 -2
  99. package/dist/runtime/wait-continuation.d.ts +31 -9
  100. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  101. package/dist/runtime/wait-continuation.js +44 -13
  102. package/dist/runtime/wait-until.d.ts +1 -1
  103. package/dist/runtime/wait-until.js +2 -2
  104. package/dist/runtime/world-compatibility.d.ts +20 -9
  105. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  106. package/dist/runtime/world-compatibility.js +24 -13
  107. package/dist/runtime/world-init.d.ts +5 -5
  108. package/dist/runtime/world-init.js +6 -6
  109. package/dist/runtime/world.d.ts.map +1 -1
  110. package/dist/runtime/world.js +13 -3
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +417 -213
  113. package/dist/sealed-box.d.ts +7 -7
  114. package/dist/sealed-box.js +15 -15
  115. package/dist/serialization/client.js +2 -2
  116. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  117. package/dist/serialization/codec-devalue-vm.js +4 -4
  118. package/dist/serialization/codec-devalue.d.ts +1 -1
  119. package/dist/serialization/codec-devalue.js +2 -2
  120. package/dist/serialization/codec.d.ts +4 -4
  121. package/dist/serialization/codec.js +2 -2
  122. package/dist/serialization/compression.d.ts +12 -11
  123. package/dist/serialization/compression.d.ts.map +1 -1
  124. package/dist/serialization/compression.js +16 -15
  125. package/dist/serialization/encryption.d.ts +7 -7
  126. package/dist/serialization/encryption.d.ts.map +1 -1
  127. package/dist/serialization/encryption.js +8 -8
  128. package/dist/serialization/errors.js +2 -2
  129. package/dist/serialization/format.d.ts +6 -6
  130. package/dist/serialization/format.js +7 -7
  131. package/dist/serialization/hardened.d.ts +18 -18
  132. package/dist/serialization/hardened.d.ts.map +1 -1
  133. package/dist/serialization/hardened.js +41 -32
  134. package/dist/serialization/index.d.ts +1 -1
  135. package/dist/serialization/index.js +2 -2
  136. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  137. package/dist/serialization/reducers/class-vm.js +2 -2
  138. package/dist/serialization/reducers/class.js +2 -2
  139. package/dist/serialization/reducers/common-vm.js +12 -12
  140. package/dist/serialization/reducers/common.js +12 -12
  141. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  142. package/dist/serialization/reducers/step-function-vm.js +2 -2
  143. package/dist/serialization/reducers/step-function.js +2 -2
  144. package/dist/serialization/step.js +2 -2
  145. package/dist/serialization/types.d.ts +5 -5
  146. package/dist/serialization/types.js +2 -2
  147. package/dist/serialization/workflow-vm.d.ts +1 -1
  148. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  149. package/dist/serialization/workflow-vm.js +13 -10
  150. package/dist/serialization-format.d.ts +11 -11
  151. package/dist/serialization-format.d.ts.map +1 -1
  152. package/dist/serialization-format.js +29 -23
  153. package/dist/serialization.d.ts +20 -12
  154. package/dist/serialization.d.ts.map +1 -1
  155. package/dist/serialization.js +141 -99
  156. package/dist/set-attributes.js +2 -2
  157. package/dist/source-map.d.ts +1 -1
  158. package/dist/source-map.d.ts.map +1 -1
  159. package/dist/source-map.js +18 -12
  160. package/dist/step/context-storage.d.ts +5 -5
  161. package/dist/step/context-storage.js +1 -1
  162. package/dist/step/writable-stream.d.ts +3 -3
  163. package/dist/step/writable-stream.js +7 -7
  164. package/dist/step.js +12 -12
  165. package/dist/symbols.d.ts +2 -2
  166. package/dist/symbols.js +3 -3
  167. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  168. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  169. package/dist/telemetry/semantic-conventions.js +21 -15
  170. package/dist/telemetry.d.ts +9 -3
  171. package/dist/telemetry.d.ts.map +1 -1
  172. package/dist/telemetry.js +40 -10
  173. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  174. package/dist/test-support/orchestrator-context.js +12 -2
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +2 -2
  177. package/dist/vm/index.js +4 -4
  178. package/dist/vm/script-cache.d.ts.map +1 -1
  179. package/dist/vm/script-cache.js +23 -17
  180. package/dist/vm/uint8array-base64.js +1 -1
  181. package/dist/workflow/abort-controller.d.ts +1 -1
  182. package/dist/workflow/abort-controller.js +12 -12
  183. package/dist/workflow/create-hook.js +3 -3
  184. package/dist/workflow/get-workflow-metadata.js +2 -2
  185. package/dist/workflow/hook.js +18 -18
  186. package/dist/workflow/set-attributes.d.ts +1 -1
  187. package/dist/workflow/set-attributes.js +2 -2
  188. package/dist/workflow/sleep.js +2 -2
  189. package/dist/workflow/world-init-stub.d.ts +1 -1
  190. package/dist/workflow/world-init-stub.js +2 -2
  191. package/dist/workflow.d.ts +2 -2
  192. package/dist/workflow.js +36 -14
  193. package/docs/api-reference/create-hook.mdx +15 -15
  194. package/docs/api-reference/create-webhook.mdx +15 -15
  195. package/docs/api-reference/define-hook.mdx +10 -10
  196. package/docs/api-reference/fatal-error.mdx +2 -2
  197. package/docs/api-reference/fetch.mdx +7 -7
  198. package/docs/api-reference/get-step-metadata.mdx +2 -2
  199. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  200. package/docs/api-reference/get-writable.mdx +7 -7
  201. package/docs/api-reference/index.mdx +1 -1
  202. package/docs/api-reference/retryable-error.mdx +1 -1
  203. package/docs/api-reference/set-attributes.mdx +2 -2
  204. package/docs/api-reference/sleep.mdx +3 -3
  205. package/docs/foundations/cancellation.mdx +31 -31
  206. package/docs/foundations/errors-and-retries.mdx +42 -11
  207. package/docs/foundations/hooks.mdx +37 -37
  208. package/docs/foundations/idempotency.mdx +9 -9
  209. package/docs/foundations/serialization.mdx +21 -22
  210. package/docs/foundations/starting-workflows.mdx +36 -37
  211. package/docs/foundations/streaming.mdx +68 -39
  212. package/docs/foundations/versioning.mdx +3 -3
  213. package/docs/foundations/workflows-and-steps.mdx +9 -9
  214. package/docs/how-it-works/cancellation.mdx +62 -62
  215. package/docs/how-it-works/code-transform.mdx +66 -54
  216. package/docs/how-it-works/encryption.mdx +25 -21
  217. package/docs/how-it-works/event-sourcing.mdx +84 -28
  218. package/docs/how-it-works/framework-integrations.mdx +12 -12
  219. package/docs/how-it-works/understanding-directives.mdx +21 -21
  220. package/package.json +7 -7
@@ -3,7 +3,7 @@ import { type CryptoKey } from './encryption.js';
3
3
  * A per-run X25519 keypair, derived from the run's key material.
4
4
  *
5
5
  * Callers should derive this once per run and memoize it alongside the
6
- * symmetric key derivation costs several Web Crypto round trips.
6
+ * symmetric key, since derivation costs several Web Crypto round trips.
7
7
  */
8
8
  export interface RunKeyPair {
9
9
  /** Raw 32-byte X25519 private scalar. Secret. */
@@ -41,7 +41,7 @@ export declare function bytesToBase64(bytes: Uint8Array): string;
41
41
  * symmetric path) rather than crash a resumption.
42
42
  *
43
43
  * Validation is strict, because a lenient decoder is worse than a throwing one
44
- * here silently returning a short or truncated key makes a corrupt value look
44
+ * here: silently returning a short or truncated key makes a corrupt value look
45
45
  * *present*, so the caller seals to garbage instead of taking the fallback.
46
46
  * Rejected: characters outside the alphabet, a length that cannot describe a
47
47
  * whole number of bytes (`length % 4 === 1`), padding anywhere but the end, and
@@ -52,7 +52,7 @@ export declare function base64ToBytes(value: string): Uint8Array | undefined;
52
52
  * The writer half of the KEM: generate an ephemeral keypair and derive a
53
53
  * content key for a recipient's public key.
54
54
  *
55
- * Use this when many payloads share one KEM operation i.e. stream frames.
55
+ * Use this when many payloads share one KEM operation, i.e. stream frames.
56
56
  * The returned `contentKey` can only encrypt, so a stream writer provably
57
57
  * cannot read the recipient run's data even by mistake.
58
58
  *
@@ -83,7 +83,7 @@ export declare function decapsulate(keyPair: RunKeyPair, ephemeralPublicKey: Uin
83
83
  * Seal a payload to a run's public key.
84
84
  *
85
85
  * Each call performs its own KEM operation, so every sealed payload gets an
86
- * independent content key nonce reuse across calls is impossible by
86
+ * independent content key: nonce reuse across calls is impossible by
87
87
  * construction.
88
88
  *
89
89
  * @param recipientPublicKey - The recipient run's raw 32-byte X25519 public key
@@ -105,7 +105,7 @@ export declare function seal(recipientPublicKey: Uint8Array, data: Uint8Array, a
105
105
  export declare function open(keyPair: RunKeyPair, sealed: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
106
106
  /**
107
107
  * A writer-side session that amortizes one KEM operation across many sealed
108
- * payloads use it for streams, where one-shot {@link seal} would perform a
108
+ * payloads. Use it for streams, where one-shot {@link seal} would perform a
109
109
  * fresh keygen + ECDH + HKDF for every frame.
110
110
  *
111
111
  * Safety rests on two properties:
@@ -129,7 +129,7 @@ export declare function createSealSession(recipientPublicKey: Uint8Array, aad?:
129
129
  * The mirror of {@link createSealSession}: because every frame from one writer
130
130
  * carries the same ephemeral public key, this turns an ECDH per frame into an
131
131
  * ECDH per writer. Correctness does not depend on the writer having used a
132
- * session a stream of independently sealed payloads simply misses the cache
132
+ * session: a stream of independently sealed payloads misses the cache
133
133
  * on each new ephemeral key.
134
134
  *
135
135
  * The cache is keyed by the ephemeral public key and holds one entry, which is
@@ -151,7 +151,7 @@ export declare function createOpenSession(keyPair: RunKeyPair, aad?: Uint8Array)
151
151
  * `ephemeralPublicKey ‖ recipientPublicKey`, and a recipient public key is
152
152
  * unique per (deployment key × project × run). Replaying a sealed payload at
153
153
  * a different run therefore fails at key agreement regardless. AAD is
154
- * available for callers that want an additional, KDF-independent binding
154
+ * available for callers that want an additional, KDF-independent binding:
155
155
  * both sides must supply byte-identical values or the payload will not open.
156
156
  */
157
157
  export declare function runAad(projectId: string, runId: string): Uint8Array;
@@ -6,7 +6,7 @@ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, NONCE_LENGTH, TAG_B
6
6
  * ## Why this exists
7
7
  *
8
8
  * The symmetric `encr` path requires the writer to hold the recipient run's
9
- * key which also grants decrypt capability. For *cross-run* writes (a hook
9
+ * key, which also grants decrypt capability. For *cross-run* writes (a hook
10
10
  * resumption targeting another run, or a child workflow writing into a
11
11
  * parent's forwarded `WritableStream`) that is more authority than the writer
12
12
  * needs, and obtaining the symmetric key across a deployment boundary costs a
@@ -16,7 +16,7 @@ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, NONCE_LENGTH, TAG_B
16
16
  * key, which is not secret and therefore travels on the run entity (and in
17
17
  * stream descriptors) at no cost. "Encrypt-only" stops being an honor-system
18
18
  * convention enforced by `importKey(raw, ['encrypt'])` and becomes a
19
- * cryptographic guarantee a writer holding just the public key provably
19
+ * cryptographic guarantee: a writer holding only the public key provably
20
20
  * cannot read anything.
21
21
  *
22
22
  * ## Key hierarchy
@@ -58,7 +58,7 @@ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, NONCE_LENGTH, TAG_B
58
58
  * HPKE's `kem_context`): it prevents key-substitution/unknown-key-share
59
59
  * attacks in which an adversary replays a ciphertext as though it had been
60
60
  * sealed to a different recipient. Deviating from strict RFC 9180 framing is
61
- * a deliberate, documented choice the envelope is versioned via its format
61
+ * a deliberate, documented choice: the envelope is versioned via its format
62
62
  * prefix and the HKDF labels below, so a conformant profile can be added
63
63
  * later as a new version without touching existing payloads.
64
64
  *
@@ -71,8 +71,8 @@ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, NONCE_LENGTH, TAG_B
71
71
  *
72
72
  * ## Nonce discipline
73
73
  *
74
- * One-shot {@link seal} generates a fresh ephemeral keypair and therefore a
75
- * fresh content key for every call, so nonce reuse is impossible.
74
+ * One-shot {@link seal} generates a fresh ephemeral keypair (and therefore a
75
+ * fresh content key) for every call, so nonce reuse is impossible.
76
76
  *
77
77
  * Callers that amortize the KEM across many frames via {@link encapsulate}
78
78
  * take on nonce discipline themselves, because the content key then outlives a
@@ -80,7 +80,7 @@ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, NONCE_LENGTH, TAG_B
80
80
  *
81
81
  * 1. Every frame MUST use a fresh random nonce (which `aesGcmEncrypt` does).
82
82
  * Never a counter: a counter restarts at zero after a stream reconnect or a
83
- * durable replay, reusing `(contentKey, nonce)` which under AES-GCM leaks
83
+ * durable replay, reusing `(contentKey, nonce)`, which under AES-GCM leaks
84
84
  * the plaintext XOR of the two frames and the GCM auth subkey.
85
85
  * 2. A writer must not inherit a previous incarnation's content key, so
86
86
  * {@link encapsulate} is re-run per writer instance.
@@ -201,7 +201,7 @@ async function importScalar(scalar, extractable) {
201
201
  function importPublicKey(publicKey) {
202
202
  return globalThis.crypto.subtle.importKey('raw', publicKey, { name: 'X25519' },
203
203
  /* extractable */ true,
204
- // Public keys carry no usages for X25519 the private key does the
204
+ // Public keys carry no usages for X25519: the private key does the
205
205
  // deriving; the public key is only ever an argument to it.
206
206
  []);
207
207
  }
@@ -241,7 +241,7 @@ export function bytesToBase64(bytes) {
241
241
  * symmetric path) rather than crash a resumption.
242
242
  *
243
243
  * Validation is strict, because a lenient decoder is worse than a throwing one
244
- * here silently returning a short or truncated key makes a corrupt value look
244
+ * here: silently returning a short or truncated key makes a corrupt value look
245
245
  * *present*, so the caller seals to garbage instead of taking the fallback.
246
246
  * Rejected: characters outside the alphabet, a length that cannot describe a
247
247
  * whole number of bytes (`length % 4 === 1`), padding anywhere but the end, and
@@ -287,7 +287,7 @@ export function base64ToBytes(value) {
287
287
  * Hand-rolled rather than using `atob` or `Buffer`: this module also runs
288
288
  * inside the workflow VM, whose global surface is deliberately minimal and
289
289
  * does not include either. The inputs here are fixed-size JWK key components,
290
- * so a compact decoder is sufficient it accepts unpadded base64url only,
290
+ * so a compact decoder is sufficient: it accepts unpadded base64url only,
291
291
  * which is what RFC 7515 §2 mandates for JWK members.
292
292
  */
293
293
  function base64UrlToBytes(value) {
@@ -332,7 +332,7 @@ async function deriveContentKey(sharedSecret, ephemeralPublicKey, recipientPubli
332
332
  * The writer half of the KEM: generate an ephemeral keypair and derive a
333
333
  * content key for a recipient's public key.
334
334
  *
335
- * Use this when many payloads share one KEM operation i.e. stream frames.
335
+ * Use this when many payloads share one KEM operation, i.e. stream frames.
336
336
  * The returned `contentKey` can only encrypt, so a stream writer provably
337
337
  * cannot read the recipient run's data even by mistake.
338
338
  *
@@ -413,7 +413,7 @@ export async function decapsulate(keyPair, ephemeralPublicKey) {
413
413
  * Seal a payload to a run's public key.
414
414
  *
415
415
  * Each call performs its own KEM operation, so every sealed payload gets an
416
- * independent content key nonce reuse across calls is impossible by
416
+ * independent content key: nonce reuse across calls is impossible by
417
417
  * construction.
418
418
  *
419
419
  * @param recipientPublicKey - The recipient run's raw 32-byte X25519 public key
@@ -452,7 +452,7 @@ export async function open(keyPair, sealed, aad) {
452
452
  }
453
453
  /**
454
454
  * A writer-side session that amortizes one KEM operation across many sealed
455
- * payloads use it for streams, where one-shot {@link seal} would perform a
455
+ * payloads. Use it for streams, where one-shot {@link seal} would perform a
456
456
  * fresh keygen + ECDH + HKDF for every frame.
457
457
  *
458
458
  * Safety rests on two properties:
@@ -489,7 +489,7 @@ export function createSealSession(recipientPublicKey, aad) {
489
489
  * The mirror of {@link createSealSession}: because every frame from one writer
490
490
  * carries the same ephemeral public key, this turns an ECDH per frame into an
491
491
  * ECDH per writer. Correctness does not depend on the writer having used a
492
- * session a stream of independently sealed payloads simply misses the cache
492
+ * session: a stream of independently sealed payloads misses the cache
493
493
  * on each new ephemeral key.
494
494
  *
495
495
  * The cache is keyed by the ephemeral public key and holds one entry, which is
@@ -546,7 +546,7 @@ function keyCacheId(publicKey) {
546
546
  * `ephemeralPublicKey ‖ recipientPublicKey`, and a recipient public key is
547
547
  * unique per (deployment key × project × run). Replaying a sealed payload at
548
548
  * a different run therefore fails at key agreement regardless. AAD is
549
- * available for callers that want an additional, KDF-independent binding
549
+ * available for callers that want an additional, KDF-independent binding:
550
550
  * both sides must supply byte-identical values or the payload will not open.
551
551
  */
552
552
  export function runAad(projectId, runId) {
@@ -568,4 +568,4 @@ export function decodeRunPublicKey(value) {
568
568
  return undefined;
569
569
  return bytes;
570
570
  }
571
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhbGVkLWJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZWFsZWQtYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixZQUFZLEVBQ1osU0FBUyxHQUNWLE1BQU0saUJBQWlCLENBQUM7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVGRztBQUVILG1FQUFtRTtBQUNuRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qix3RUFBd0U7QUFDeEUsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFOUI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDO0FBRTlDOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxVQUFVLENBQUM7SUFDekMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUM1RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQWV0QyxTQUFTLHVCQUF1QixDQUFDLGNBQTBCO0lBQ3pELElBQUksY0FBYyxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsRUFB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Q2hDLEtBQXlCO0lBRXpCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxpQkFBaUI7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgZGVjcnlwdCBhcyBhZXNHY21EZWNyeXB0LFxuICBlbmNyeXB0IGFzIGFlc0djbUVuY3J5cHQsXG4gIHR5cGUgQ3J5cHRvS2V5LFxuICBOT05DRV9MRU5HVEgsXG4gIFRBR19CWVRFUyxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcblxuLyoqXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgc2VhbGVkLWJveCAoYXN5bW1ldHJpYykgZW5jcnlwdGlvbiBmb3IgY3Jvc3MtcnVuIHdyaXRlcy5cbiAqXG4gKiAjIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBUaGUgc3ltbWV0cmljIGBlbmNyYCBwYXRoIHJlcXVpcmVzIHRoZSB3cml0ZXIgdG8gaG9sZCB0aGUgcmVjaXBpZW50IHJ1bidzXG4gKiBrZXkg4oCUIHdoaWNoIGFsc28gZ3JhbnRzIGRlY3J5cHQgY2FwYWJpbGl0eS4gRm9yICpjcm9zcy1ydW4qIHdyaXRlcyAoYSBob29rXG4gKiByZXN1bXB0aW9uIHRhcmdldGluZyBhbm90aGVyIHJ1biwgb3IgYSBjaGlsZCB3b3JrZmxvdyB3cml0aW5nIGludG8gYVxuICogcGFyZW50J3MgZm9yd2FyZGVkIGBXcml0YWJsZVN0cmVhbWApIHRoYXQgaXMgbW9yZSBhdXRob3JpdHkgdGhhbiB0aGUgd3JpdGVyXG4gKiBuZWVkcywgYW5kIG9idGFpbmluZyB0aGUgc3ltbWV0cmljIGtleSBhY3Jvc3MgYSBkZXBsb3ltZW50IGJvdW5kYXJ5IGNvc3RzIGFcbiAqIHJvdW5kIHRyaXAgdG8gdGhlIFZlcmNlbCBBUEkuXG4gKlxuICogQSBzZWFsZWQgYm94IGZpeGVzIGJvdGg6IHRoZSB3cml0ZXIgbmVlZHMgb25seSB0aGUgcmVjaXBpZW50J3MgKipwdWJsaWMqKlxuICoga2V5LCB3aGljaCBpcyBub3Qgc2VjcmV0IGFuZCB0aGVyZWZvcmUgdHJhdmVscyBvbiB0aGUgcnVuIGVudGl0eSAoYW5kIGluXG4gKiBzdHJlYW0gZGVzY3JpcHRvcnMpIGF0IG5vIGNvc3QuIFwiRW5jcnlwdC1vbmx5XCIgc3RvcHMgYmVpbmcgYW4gaG9ub3Itc3lzdGVtXG4gKiBjb252ZW50aW9uIGVuZm9yY2VkIGJ5IGBpbXBvcnRLZXkocmF3LCBbJ2VuY3J5cHQnXSlgIGFuZCBiZWNvbWVzIGFcbiAqIGNyeXB0b2dyYXBoaWMgZ3VhcmFudGVlIOKAlCBhIHdyaXRlciBob2xkaW5nIGp1c3QgdGhlIHB1YmxpYyBrZXkgcHJvdmFibHlcbiAqIGNhbm5vdCByZWFkIGFueXRoaW5nLlxuICpcbiAqICMjIEtleSBoaWVyYXJjaHlcbiAqXG4gKiBCb3RoIGtleXMgZGVzY2VuZCBmcm9tIHRoZSBzYW1lIHBlci1ydW4ga2V5IG1hdGVyaWFsIGBLYCB0aGF0XG4gKiBgV29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYCBhbHJlYWR5IHJldHVybnMgdG9kYXksIHNvIG5vdGhpbmcgYWJvdXRcbiAqIGtleSBhY3F1aXNpdGlvbiwgdGhlIFdvcmxkIGludGVyZmFjZSwgb3IgdGhlIFZlcmNlbCBBUEkgY2hhbmdlczpcbiAqXG4gKiBgYGBcbiAqIEsgICgzMiBieXRlcywgcGVyLXJ1biwgPSBIS0RGKFZFUkNFTF9ERVBMT1lNRU5UX0tFWSwgXCJwcm9qZWN0SWR8cnVuSWRcIikpXG4gKiDilJzilIDilIAgQUVTLTI1NiBrZXkgPSBLIHVzZWQgZGlyZWN0bHkgICAgICAgICAgICDihpIgJ2VuY3InIGVudmVsb3BlcyAodW5jaGFuZ2VkKVxuICog4pSU4pSA4pSAIFgyNTUxOSBzY2FsYXIgPSBIS0RGKEssIFNDQUxBUl9JTkZPKSAgICAg4oaSICdlbmNwJyBlbnZlbG9wZXNcbiAqICAgICDilJTilIDilIAgcHVibGljIGtleSA9IFgyNTUxOSBiYXNlcG9pbnQgwrcgc2NhbGFyICAgKHB1Ymxpc2hlZCwgbm90IHNlY3JldClcbiAqIGBgYFxuICpcbiAqIGBLYCBpcyB0aGVyZWZvcmUgYm90aCBhbiBBRUFEIGtleSBhbmQgYSBrZXktZGVyaXZhdGlvbiBrZXkuIFRoaXMgaXMgc291bmQ6XG4gKiBBRVMtR0NNIG5ldmVyIGV4cG9zZXMgaXRzIGtleSwgYW5kIEhLREYtU0hBMjU2IG91dHB1dCBpcyBjb21wdXRhdGlvbmFsbHlcbiAqIGluZGVwZW5kZW50IG9mIHRoZSBBRVMga2V5c3RyZWFtLiBBIHN0cmljdCByZWFkaW5nIG9mIE5JU1QgU1AgODAwLTEwOFxuICogcHJlZmVycyB0aGVzZSByb2xlcyBiZSBzZXBhcmF0ZWQsIGJ1dCBgS2AncyBkaXJlY3QgQUVTIHVzZSBpcyBmaXhlZCBieVxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV2ZXJ5IGBlbmNyYCBwYXlsb2FkIGFscmVhZHkgd3JpdHRlbi5cbiAqXG4gKiAjIyBDb25zdHJ1Y3Rpb25cbiAqXG4gKiBBbiBFQ0lFUy1zdHlsZSBzZWFsZWQgYm94IHVzaW5nIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgSFBLRSAoUkZDIDkxODApXG4gKiBiYXNlIG1vZGUgd2l0aCBESEtFTShYMjU1MTksIEhLREYtU0hBMjU2KSBhbmQgQUVTLTI1Ni1HQ00sIGJ1dCB3aXRob3V0IHRoZVxuICogZnVsbCBgTGFiZWxlZEV4dHJhY3RgL2BMYWJlbGVkRXhwYW5kYCBzdWl0ZS1JRCBjZXJlbW9ueTpcbiAqXG4gKiBgYGBcbiAqIGVwaGVtZXJhbCAgICA9IFgyNTUxOSBrZXlwYWlyLCBmcmVzaGx5IGdlbmVyYXRlZCBwZXIgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBzaGFyZWRTZWNyZXQgPSBYMjU1MTkoZXBoZW1lcmFsUHJpdmF0ZSwgcmVjaXBpZW50UHVibGljKVxuICogY29udGVudEtleSAgID0gSEtERi1TSEEyNTYoXG4gKiAgICAgICAgICAgICAgICAgIGlrbSAgPSBzaGFyZWRTZWNyZXQsXG4gKiAgICAgICAgICAgICAgICAgIHNhbHQgPSB6ZXJvcygzMiksXG4gKiAgICAgICAgICAgICAgICAgIGluZm8gPSBDT05URU5UX0tFWV9JTkZPIOKAliBlcGhlbWVyYWxQdWJsaWMg4oCWIHJlY2lwaWVudFB1YmxpYyxcbiAqICAgICAgICAgICAgICAgIClcbiAqIGBgYFxuICpcbiAqIEJpbmRpbmcgYm90aCBwdWJsaWMga2V5cyBpbnRvIGBpbmZvYCBpcyB0aGUgc2VjdXJpdHktY3JpdGljYWwgcGFydCAoaXQgaXNcbiAqIEhQS0UncyBga2VtX2NvbnRleHRgKTogaXQgcHJldmVudHMga2V5LXN1YnN0aXR1dGlvbi91bmtub3duLWtleS1zaGFyZVxuICogYXR0YWNrcyBpbiB3aGljaCBhbiBhZHZlcnNhcnkgcmVwbGF5cyBhIGNpcGhlcnRleHQgYXMgdGhvdWdoIGl0IGhhZCBiZWVuXG4gKiBzZWFsZWQgdG8gYSBkaWZmZXJlbnQgcmVjaXBpZW50LiBEZXZpYXRpbmcgZnJvbSBzdHJpY3QgUkZDIDkxODAgZnJhbWluZyBpc1xuICogYSBkZWxpYmVyYXRlLCBkb2N1bWVudGVkIGNob2ljZSDigJQgdGhlIGVudmVsb3BlIGlzIHZlcnNpb25lZCB2aWEgaXRzIGZvcm1hdFxuICogcHJlZml4IGFuZCB0aGUgSEtERiBsYWJlbHMgYmVsb3csIHNvIGEgY29uZm9ybWFudCBwcm9maWxlIGNhbiBiZSBhZGRlZFxuICogbGF0ZXIgYXMgYSBuZXcgdmVyc2lvbiB3aXRob3V0IHRvdWNoaW5nIGV4aXN0aW5nIHBheWxvYWRzLlxuICpcbiAqIFdpcmUgZm9ybWF0ICh0aGUgYGVuY3BgIGZvcm1hdCBwcmVmaXggaXMgYXR0YWNoZWQgYnkgdGhlIHNlcmlhbGl6YXRpb25cbiAqIGxheWVyLCBub3QgYnkgdGhpcyBtb2R1bGUpOlxuICpcbiAqIGBgYFxuICogW2VwaGVtZXJhbCBwdWJsaWMga2V5ICgzMiBieXRlcyldW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gdGFnICgxNiBieXRlcyldXG4gKiBgYGBcbiAqXG4gKiAjIyBOb25jZSBkaXNjaXBsaW5lXG4gKlxuICogT25lLXNob3Qge0BsaW5rIHNlYWx9IGdlbmVyYXRlcyBhIGZyZXNoIGVwaGVtZXJhbCBrZXlwYWlyIOKAlCBhbmQgdGhlcmVmb3JlIGFcbiAqIGZyZXNoIGNvbnRlbnQga2V5IOKAlCBmb3IgZXZlcnkgY2FsbCwgc28gbm9uY2UgcmV1c2UgaXMgaW1wb3NzaWJsZS5cbiAqXG4gKiBDYWxsZXJzIHRoYXQgYW1vcnRpemUgdGhlIEtFTSBhY3Jvc3MgbWFueSBmcmFtZXMgdmlhIHtAbGluayBlbmNhcHN1bGF0ZX1cbiAqIHRha2Ugb24gbm9uY2UgZGlzY2lwbGluZSB0aGVtc2VsdmVzLCBiZWNhdXNlIHRoZSBjb250ZW50IGtleSB0aGVuIG91dGxpdmVzIGFcbiAqIHNpbmdsZSBtZXNzYWdlLiBUd28gcnVsZXMgYXBwbHk6XG4gKlxuICogMS4gRXZlcnkgZnJhbWUgTVVTVCB1c2UgYSBmcmVzaCByYW5kb20gbm9uY2UgKHdoaWNoIGBhZXNHY21FbmNyeXB0YCBkb2VzKS5cbiAqICAgIE5ldmVyIGEgY291bnRlcjogYSBjb3VudGVyIHJlc3RhcnRzIGF0IHplcm8gYWZ0ZXIgYSBzdHJlYW0gcmVjb25uZWN0IG9yIGFcbiAqICAgIGR1cmFibGUgcmVwbGF5LCByZXVzaW5nIGAoY29udGVudEtleSwgbm9uY2UpYCDigJQgd2hpY2ggdW5kZXIgQUVTLUdDTSBsZWFrc1xuICogICAgdGhlIHBsYWludGV4dCBYT1Igb2YgdGhlIHR3byBmcmFtZXMgYW5kIHRoZSBHQ00gYXV0aCBzdWJrZXkuXG4gKiAyLiBBIHdyaXRlciBtdXN0IG5vdCBpbmhlcml0IGEgcHJldmlvdXMgaW5jYXJuYXRpb24ncyBjb250ZW50IGtleSwgc29cbiAqICAgIHtAbGluayBlbmNhcHN1bGF0ZX0gaXMgcmUtcnVuIHBlciB3cml0ZXIgaW5zdGFuY2UuXG4gKlxuICogTm90aGluZyBpbiB0aGlzIG1vZHVsZSBlbmZvcmNlcyBlaXRoZXIgcnVsZTsgaXQgaXMgdGhlIHN0cmVhbWluZyBjYWxsZXInc1xuICogY29udHJhY3QuXG4gKi9cblxuLyoqIExlbmd0aCBvZiBhbiBYMjU1MTkgcHJpdmF0ZSBzY2FsYXIgYW5kIHB1YmxpYyBrZXksIGluIGJ5dGVzLiAqL1xuY29uc3QgWDI1NTE5X0tFWV9MRU5HVEggPSAzMjtcblxuLyoqIExlbmd0aCBvZiB0aGUgQUVTLTI1NiBjb250ZW50IGtleSBkZXJpdmVkIGZyb20gdGhlIHNoYXJlZCBzZWNyZXQuICovXG5jb25zdCBDT05URU5UX0tFWV9MRU5HVEggPSAzMjtcblxuLyoqXG4gKiBIS0RGIGBpbmZvYCBsYWJlbCBmb3IgZGVyaXZpbmcgdGhlIHBlci1ydW4gWDI1NTE5IHNjYWxhciBmcm9tIHRoZSBwZXItcnVuXG4gKiBrZXkgbWF0ZXJpYWwuXG4gKlxuICogVmVyc2lvbmVkIGFuZCBuYW1lc3BhY2VkIHNvIHRoYXQgYW55IGZ1dHVyZSBkZXJpdmF0aW9uIGZyb20gdGhlIHNhbWUgYEtgXG4gKiAoYSBzZWNvbmQga2V5cGFpciwgYSBNQUMga2V5LCBhIGRpZmZlcmVudCBjdXJ2ZSkgY2FuIG5ldmVyIGNvbGxpZGUgd2l0aFxuICogdGhpcyBvbmUuXG4gKi9cbmNvbnN0IFNDQUxBUl9JTkZPID0gJ3dvcmtmbG93L2VuY3AveDI1NTE5L3YxJztcblxuLyoqXG4gKiBIS0RGIGBpbmZvYCBwcmVmaXggZm9yIGRlcml2aW5nIHRoZSBBRVMtMjU2LUdDTSBjb250ZW50IGtleSBmcm9tIGFuIFgyNTUxOVxuICogc2hhcmVkIHNlY3JldC4gVGhlIGVwaGVtZXJhbCBhbmQgcmVjaXBpZW50IHB1YmxpYyBrZXlzIGFyZSBhcHBlbmRlZCB0byB0aGlzXG4gKiBsYWJlbCB0byBmb3JtIHRoZSBmdWxsIGBpbmZvYCAoSFBLRSdzIGBrZW1fY29udGV4dGApLlxuICovXG5jb25zdCBDT05URU5UX0tFWV9JTkZPID0gJ3dvcmtmbG93L2VuY3AvYWVzMjU2Z2NtL3YxJztcblxuLyoqXG4gKiBERVIgcHJlZml4IGZvciBhbiBSRkMgODQxMCBgUHJpdmF0ZUtleUluZm9gIHdyYXBwaW5nIGEgcmF3IFgyNTUxOSBzY2FsYXIuXG4gKlxuICogV2ViIENyeXB0byBjYW5ub3QgaW1wb3J0IGEgcmF3IFgyNTUxOSBwcml2YXRlIGtleSAoYGltcG9ydEtleSgncmF3JywgLi4uKWBcbiAqIGlzIG9ubHkgZGVmaW5lZCBmb3IgcHVibGljIGtleXMgb24gdGhlIFNlY3VyZSBDdXJ2ZXMgYWxnb3JpdGhtcyksIHNvIGFcbiAqIGRlcml2ZWQgc2NhbGFyIGhhcyB0byBiZSB3cmFwcGVkIGluIFBLQ1MjOCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIFRoZVxuICogc3RydWN0dXJlIGlzIGZ1bGx5IGRldGVybWluZWQgZm9yIGEgMzItYnl0ZSBYMjU1MTkga2V5OlxuICpcbiAqIGBgYFxuICogU0VRVUVOQ0UgKDQ2IGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAzMCAyZVxuICogICBJTlRFR0VSIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiAwMSAwMFxuICogICBTRVFVRU5DRSAoNSBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAzMCAwNVxuICogICAgIE9CSkVDVCBJREVOVElGSUVSIDEuMy4xMDEuMTEwIChYMjU1MTkpICAwNiAwMyAyYiA2NSA2ZVxuICogICBPQ1RFVCBTVFJJTkcgKDM0IGJ5dGVzKSAgICAgICAgICAgICAgICAgICAwNCAyMlxuICogICAgIE9DVEVUIFNUUklORyAoMzIgYnl0ZXMpICAgICAgICAgICAgICAgICAwNCAyMFxuICogICAgICAgPHNjYWxhcj5cbiAqIGBgYFxuICovXG5jb25zdCBQS0NTOF9YMjU1MTlfUFJFRklYID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAweDMwLCAweDJlLCAweDAyLCAweDAxLCAweDAwLCAweDMwLCAweDA1LCAweDA2LCAweDAzLCAweDJiLCAweDY1LCAweDZlLCAweDA0LFxuICAweDIyLCAweDA0LCAweDIwLFxuXSk7XG5cbmNvbnN0IGluZm9FbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qKlxuICogQSBwZXItcnVuIFgyNTUxOSBrZXlwYWlyLCBkZXJpdmVkIGZyb20gdGhlIHJ1bidzIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBDYWxsZXJzIHNob3VsZCBkZXJpdmUgdGhpcyBvbmNlIHBlciBydW4gYW5kIG1lbW9pemUgaXQgYWxvbmdzaWRlIHRoZVxuICogc3ltbWV0cmljIGtleSDigJQgZGVyaXZhdGlvbiBjb3N0cyBzZXZlcmFsIFdlYiBDcnlwdG8gcm91bmQgdHJpcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuS2V5UGFpciB7XG4gIC8qKiBSYXcgMzItYnl0ZSBYMjU1MTkgcHJpdmF0ZSBzY2FsYXIuIFNlY3JldC4gKi9cbiAgcmVhZG9ubHkgc2NhbGFyOiBVaW50OEFycmF5O1xuICAvKiogUmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXkuIFNhZmUgdG8gcHVibGlzaC4gKi9cbiAgcmVhZG9ubHkgcHVibGljS2V5OiBVaW50OEFycmF5O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRLZXlNYXRlcmlhbExlbmd0aChydW5LZXlNYXRlcmlhbDogVWludDhBcnJheSk6IHZvaWQge1xuICBpZiAocnVuS2V5TWF0ZXJpYWwuYnl0ZUxlbmd0aCAhPT0gQ09OVEVOVF9LRVlfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgYFJ1biBrZXkgbWF0ZXJpYWwgbXVzdCBiZSBleGFjdGx5ICR7Q09OVEVOVF9LRVlfTEVOR1RIfSBieXRlcywgZ290ICR7cnVuS2V5TWF0ZXJpYWwuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRQdWJsaWNLZXlMZW5ndGgocHVibGljS2V5OiBVaW50OEFycmF5LCBsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChwdWJsaWNLZXkuYnl0ZUxlbmd0aCAhPT0gWDI1NTE5X0tFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgJHtsYWJlbH0gbXVzdCBiZSBleGFjdGx5ICR7WDI1NTE5X0tFWV9MRU5HVEh9IGJ5dGVzLCBnb3QgJHtwdWJsaWNLZXkuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgcGVyLXJ1biBYMjU1MTkga2V5cGFpciBmcm9tIHRoZSBydW4ncyAzMi1ieXRlIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBEZXRlcm1pbmlzdGljOiB0aGUgc2FtZSBrZXkgbWF0ZXJpYWwgYWx3YXlzIHlpZWxkcyB0aGUgc2FtZSBrZXlwYWlyLCB3aGljaFxuICogaXMgd2hhdCBsZXRzIHRoZSBvd25pbmcgZGVwbG95bWVudCByZS1kZXJpdmUgaXRzIHByaXZhdGUgc2NhbGFyIG9uIGRlbWFuZFxuICogKGZyb20gYFZFUkNFTF9ERVBMT1lNRU5UX0tFWWApIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBhbnl3aGVyZS5cbiAqXG4gKiBAcGFyYW0gcnVuS2V5TWF0ZXJpYWwgLSBUaGUgMzIgYnl0ZXMgcmV0dXJuZWQgYnkgYFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4oKWBcbiAqIEByZXR1cm5zIFRoZSBydW4ncyBYMjU1MTkgc2NhbGFyIGFuZCBwdWJsaWMga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVSdW5LZXlQYWlyKFxuICBydW5LZXlNYXRlcmlhbDogVWludDhBcnJheVxuKTogUHJvbWlzZTxSdW5LZXlQYWlyPiB7XG4gIGFzc2VydEtleU1hdGVyaWFsTGVuZ3RoKHJ1bktleU1hdGVyaWFsKTtcblxuICBjb25zdCBoa2RmS2V5ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAncmF3JyxcbiAgICBydW5LZXlNYXRlcmlhbCxcbiAgICAnSEtERicsXG4gICAgZmFsc2UsXG4gICAgWydkZXJpdmVCaXRzJ11cbiAgKTtcblxuICAvLyBaZXJvIHNhbHQgaXMgYWNjZXB0YWJsZSBwZXIgUkZDIDU4NjkgwqczLjE6IHRoZSBJS00gaGVyZSBpcyBpdHNlbGYgSEtERlxuICAvLyBvdXRwdXQgKG9yIGEgaGlnaC1lbnRyb3B5IEJZT0sgdmFsdWUpLCBzbyBpdCBpcyBhbHJlYWR5IHVuaWZvcm0uIFRoZVxuICAvLyBgaW5mb2AgbGFiZWwgcHJvdmlkZXMgZG9tYWluIHNlcGFyYXRpb24uXG4gIGNvbnN0IHNjYWxhckJpdHMgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhcbiAgICB7XG4gICAgICBuYW1lOiAnSEtERicsXG4gICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICBzYWx0OiBuZXcgVWludDhBcnJheSgzMiksXG4gICAgICBpbmZvOiBpbmZvRW5jb2Rlci5lbmNvZGUoU0NBTEFSX0lORk8pLFxuICAgIH0sXG4gICAgaGtkZktleSxcbiAgICBYMjU1MTlfS0VZX0xFTkdUSCAqIDhcbiAgKTtcbiAgY29uc3Qgc2NhbGFyID0gbmV3IFVpbnQ4QXJyYXkoc2NhbGFyQml0cyk7XG5cbiAgLy8gQW55IDMyLWJ5dGUgc3RyaW5nIGlzIGEgdmFsaWQgWDI1NTE5IHNjYWxhciAodGhlIGxvdy9oaWdoIGJpdHMgYXJlXG4gIC8vIGNsYW1wZWQgZHVyaW5nIHNjYWxhciBtdWx0aXBsaWNhdGlvbiksIHNvIHRoZSBIS0RGIG91dHB1dCBuZWVkcyBub1xuICAvLyByZWplY3Rpb24gc2FtcGxpbmcuXG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGRlcml2ZVB1YmxpY0tleUZyb21TY2FsYXIoc2NhbGFyKTtcbiAgcmV0dXJuIHsgc2NhbGFyLCBwdWJsaWNLZXkgfTtcbn1cblxuLyoqXG4gKiBSZWNvdmVyIHRoZSByYXcgcHVibGljIGtleSBmb3IgYSBzY2FsYXIuXG4gKlxuICogV2ViIENyeXB0byBleHBvc2VzIG5vIHNjYWxhci1tdWx0aXBsaWNhdGlvbiBwcmltaXRpdmUsIHNvIHRoZSBzY2FsYXIgaXNcbiAqIGltcG9ydGVkIGFzIGEgUEtDUyM4IHByaXZhdGUga2V5IGFuZCBpdHMgcHVibGljIGhhbGYgcmVhZCBiYWNrIG91dCBvZiB0aGVcbiAqIEpXSyBleHBvcnQgKGB4YCksIHdoaWNoIHRoZSBTZWN1cmUgQ3VydmVzIHNwZWMgZGVmaW5lcyBhcyB0aGUgYmFzZTY0dXJsXG4gKiByYXcgcHVibGljIGtleS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVyaXZlUHVibGljS2V5RnJvbVNjYWxhcihcbiAgc2NhbGFyOiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGltcG9ydFNjYWxhcihzY2FsYXIsIC8qIGV4dHJhY3RhYmxlICovIHRydWUpO1xuICBjb25zdCBqd2sgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCBwcml2YXRlS2V5KTtcbiAgaWYgKCFqd2sueCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICdYMjU1MTkgSldLIGV4cG9ydCBkaWQgbm90IGluY2x1ZGUgYSBwdWJsaWMga2V5IGNvbXBvbmVudCAoXCJ4XCIpJ1xuICAgICk7XG4gIH1cbiAgY29uc3QgcHVibGljS2V5ID0gYmFzZTY0VXJsVG9CeXRlcyhqd2sueCk7XG4gIC8vIEd1YXJkIHRoZSBvbmUgc3RlcCBpbiB0aGlzIG1vZHVsZSB0aGF0IHRydXN0cyBhbiBleHRlcm5hbCBlbmNvZGluZy4gQVxuICAvLyBzaG9ydCBvciBtYWxmb3JtZWQgdmFsdWUgaGVyZSB3b3VsZCBvdGhlcndpc2UgZmxvdyBvbndhcmQgYW5kIGZhaWwgbXVjaFxuICAvLyBsYXRlciwgaW5zaWRlIGtleSBhZ3JlZW1lbnQsIHdpdGggYSBmYXIgbGVzcyBvYnZpb3VzIG1lc3NhZ2UuXG4gIGlmIChwdWJsaWNLZXkuYnl0ZUxlbmd0aCAhPT0gWDI1NTE5X0tFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgWDI1NTE5IEpXSyBleHBvcnQgcHJvZHVjZWQgYSAke3B1YmxpY0tleS5ieXRlTGVuZ3RofS1ieXRlIHB1YmxpYyBrZXksIGV4cGVjdGVkICR7WDI1NTE5X0tFWV9MRU5HVEh9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHB1YmxpY0tleTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW1wb3J0U2NhbGFyKFxuICBzY2FsYXI6IFVpbnQ4QXJyYXksXG4gIGV4dHJhY3RhYmxlOiBib29sZWFuXG4pOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICBjb25zdCBwa2NzOCA9IG5ldyBVaW50OEFycmF5KFBLQ1M4X1gyNTUxOV9QUkVGSVgubGVuZ3RoICsgc2NhbGFyLmJ5dGVMZW5ndGgpO1xuICBwa2NzOC5zZXQoUEtDUzhfWDI1NTE5X1BSRUZJWCwgMCk7XG4gIHBrY3M4LnNldChzY2FsYXIsIFBLQ1M4X1gyNTUxOV9QUkVGSVgubGVuZ3RoKTtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3BrY3M4JyxcbiAgICBwa2NzOCxcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgZXh0cmFjdGFibGUsXG4gICAgWydkZXJpdmVCaXRzJ11cbiAgKTtcbn1cblxuZnVuY3Rpb24gaW1wb3J0UHVibGljS2V5KHB1YmxpY0tleTogVWludDhBcnJheSk6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIHB1YmxpY0tleSxcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgLyogZXh0cmFjdGFibGUgKi8gdHJ1ZSxcbiAgICAvLyBQdWJsaWMga2V5cyBjYXJyeSBubyB1c2FnZXMgZm9yIFgyNTUxOSDigJQgdGhlIHByaXZhdGUga2V5IGRvZXMgdGhlXG4gICAgLy8gZGVyaXZpbmc7IHRoZSBwdWJsaWMga2V5IGlzIG9ubHkgZXZlciBhbiBhcmd1bWVudCB0byBpdC5cbiAgICBbXVxuICApO1xufVxuXG5jb25zdCBCQVNFNjRfQ0hBUlMgPVxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbmNvbnN0IEJBU0U2NFVSTF9DSEFSUyA9XG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fJztcblxuLyoqXG4gKiBFbmNvZGUgYnl0ZXMgYXMgc3RhbmRhcmQgKHBhZGRlZCkgYmFzZTY0LlxuICpcbiAqIEhhbmQtcm9sbGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGJhc2U2NFVybFRvQnl0ZXN9OiB0aGlzIG1vZHVsZVxuICogcnVucyBpbiB0aGUgYnJvd3NlciAobzExeSBkZWNyeXB0aW9uKSBhbmQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSwgc28gbmVpdGhlclxuICogYEJ1ZmZlcmAgbm9yIGBidG9hYCBjYW4gYmUgYXNzdW1lZC4gVXNlZCBmb3IgdGhlIHdpcmUgZW5jb2Rpbmcgb2YgcnVuIHB1YmxpY1xuICoga2V5cywgbWF0Y2hpbmcgdGhlIGJhc2U2NCBjb252ZW50aW9uIGFscmVhZHkgdXNlZCBmb3IgYFZFUkNFTF9ERVBMT1lNRU5UX0tFWWBcbiAqIGFuZCB0aGUgYHJ1bi1rZXlgIEFQSSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9CYXNlNjQoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICBsZXQgb3V0ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBjb25zdCBiMCA9IGJ5dGVzW2ldO1xuICAgIGNvbnN0IGIxID0gaSArIDEgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpICsgMV0gOiAwO1xuICAgIGNvbnN0IGIyID0gaSArIDIgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpICsgMl0gOiAwO1xuXG4gICAgb3V0ICs9IEJBU0U2NF9DSEFSU1soYjAgPj4gMikgJiAweDNmXTtcbiAgICBvdXQgKz0gQkFTRTY0X0NIQVJTWygoYjAgJiAweDAzKSA8PCA0KSB8ICgoYjEgPj4gNCkgJiAweDBmKV07XG4gICAgb3V0ICs9XG4gICAgICBpICsgMSA8IGJ5dGVzLmxlbmd0aFxuICAgICAgICA/IEJBU0U2NF9DSEFSU1soKGIxICYgMHgwZikgPDwgMikgfCAoKGIyID4+IDYpICYgMHgwMyldXG4gICAgICAgIDogJz0nO1xuICAgIG91dCArPSBpICsgMiA8IGJ5dGVzLmxlbmd0aCA/IEJBU0U2NF9DSEFSU1tiMiAmIDB4M2ZdIDogJz0nO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGVjb2RlIHN0YW5kYXJkIGJhc2U2NCAocGFkZGluZyBvcHRpb25hbCkgdG8gYnl0ZXMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgbWFsZm9ybWVkIGlucHV0IHJhdGhlciB0aGFuIHRocm93aW5nOiBjYWxsZXJzIGRlY29kZVxuICogcHVibGljIGtleXMgdGhhdCBhcnJpdmUgZnJvbSBzdG9yYWdlIG9yIG92ZXIgdGhlIHdpcmUsIHdoZXJlIGEgY29ycnVwdCB2YWx1ZVxuICogc2hvdWxkIGRlZ3JhZGUgdG8gXCJ0aGlzIHJ1biBoYXMgbm8gdXNhYmxlIHB1YmxpYyBrZXlcIiAoYW5kIGZhbGwgYmFjayB0byB0aGVcbiAqIHN5bW1ldHJpYyBwYXRoKSByYXRoZXIgdGhhbiBjcmFzaCBhIHJlc3VtcHRpb24uXG4gKlxuICogVmFsaWRhdGlvbiBpcyBzdHJpY3QsIGJlY2F1c2UgYSBsZW5pZW50IGRlY29kZXIgaXMgd29yc2UgdGhhbiBhIHRocm93aW5nIG9uZVxuICogaGVyZSDigJQgc2lsZW50bHkgcmV0dXJuaW5nIGEgc2hvcnQgb3IgdHJ1bmNhdGVkIGtleSBtYWtlcyBhIGNvcnJ1cHQgdmFsdWUgbG9va1xuICogKnByZXNlbnQqLCBzbyB0aGUgY2FsbGVyIHNlYWxzIHRvIGdhcmJhZ2UgaW5zdGVhZCBvZiB0YWtpbmcgdGhlIGZhbGxiYWNrLlxuICogUmVqZWN0ZWQ6IGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgYWxwaGFiZXQsIGEgbGVuZ3RoIHRoYXQgY2Fubm90IGRlc2NyaWJlIGFcbiAqIHdob2xlIG51bWJlciBvZiBieXRlcyAoYGxlbmd0aCAlIDQgPT09IDFgKSwgcGFkZGluZyBhbnl3aGVyZSBidXQgdGhlIGVuZCwgYW5kXG4gKiBhIGZpbmFsIHF1YW50dW0gd2hvc2UgdW51c2VkIGxvdyBiaXRzIGFyZSBub3QgemVyby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXModmFsdWU6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAvLyBTdHJpcCB0cmFpbGluZyBwYWRkaW5nLCB0aGVuIHJlcXVpcmUgd2hhdCByZW1haW5zIHRvIGJlIHBhZGRpbmctZnJlZS5cbiAgbGV0IGVuZCA9IHZhbHVlLmxlbmd0aDtcbiAgd2hpbGUgKGVuZCA+IDAgJiYgdmFsdWVbZW5kIC0gMV0gPT09ICc9JykgZW5kLS07XG4gIGNvbnN0IGJvZHkgPSB2YWx1ZS5zbGljZSgwLCBlbmQpO1xuICBpZiAoYm9keS5pbmNsdWRlcygnPScpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIDQgY2hhcnMgLT4gMyBieXRlczsgMyAtPiAyOyAyIC0+IDEuIEEgcmVtYWluZGVyIG9mIDEgZW5jb2RlcyBubyBieXRlLlxuICBpZiAoYm9keS5sZW5ndGggJSA0ID09PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBQYWRkaW5nLCB3aGVuIHByZXNlbnQsIG11c3QgYnJpbmcgdGhlIHRvdGFsIHRvIGEgbXVsdGlwbGUgb2YgNC5cbiAgaWYgKGVuZCAhPT0gdmFsdWUubGVuZ3RoICYmIHZhbHVlLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgbGV0IGFjY3VtdWxhdG9yID0gMDtcbiAgbGV0IGJpdENvdW50ID0gMDtcbiAgY29uc3QgYnl0ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBCQVNFNjRfQ0hBUlMuaW5kZXhPZihib2R5W2ldKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGFjY3VtdWxhdG9yID0gKGFjY3VtdWxhdG9yIDw8IDYpIHwgaW5kZXg7XG4gICAgYml0Q291bnQgKz0gNjtcbiAgICBpZiAoYml0Q291bnQgPj0gOCkge1xuICAgICAgYml0Q291bnQgLT0gODtcbiAgICAgIGJ5dGVzLnB1c2goKGFjY3VtdWxhdG9yID4+IGJpdENvdW50KSAmIDB4ZmYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIExlZnRvdmVyIGJpdHMgYmVsb25nIHRvIG5vIGJ5dGUgYW5kIG11c3QgYmUgemVybyBpbiBjYW5vbmljYWwgYmFzZTY0LlxuICBpZiAoYml0Q291bnQgPiAwICYmIChhY2N1bXVsYXRvciAmICgoMSA8PCBiaXRDb3VudCkgLSAxKSkgIT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiYXNlNjR1cmwgc3RyaW5nIChKV0sgZW5jb2RpbmcpIHRvIGJ5dGVzLlxuICpcbiAqIEhhbmQtcm9sbGVkIHJhdGhlciB0aGFuIHVzaW5nIGBhdG9iYCBvciBgQnVmZmVyYDogdGhpcyBtb2R1bGUgYWxzbyBydW5zXG4gKiBpbnNpZGUgdGhlIHdvcmtmbG93IFZNLCB3aG9zZSBnbG9iYWwgc3VyZmFjZSBpcyBkZWxpYmVyYXRlbHkgbWluaW1hbCBhbmRcbiAqIGRvZXMgbm90IGluY2x1ZGUgZWl0aGVyLiBUaGUgaW5wdXRzIGhlcmUgYXJlIGZpeGVkLXNpemUgSldLIGtleSBjb21wb25lbnRzLFxuICogc28gYSBjb21wYWN0IGRlY29kZXIgaXMgc3VmZmljaWVudCDigJQgaXQgYWNjZXB0cyB1bnBhZGRlZCBiYXNlNjR1cmwgb25seSxcbiAqIHdoaWNoIGlzIHdoYXQgUkZDIDc1MTUgwqcyIG1hbmRhdGVzIGZvciBKV0sgbWVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0VXJsVG9CeXRlcyh2YWx1ZTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGxldCBhY2N1bXVsYXRvciA9IDA7XG4gIGxldCBiaXRDb3VudCA9IDA7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gdmFsdWVbaV07XG4gICAgaWYgKGNoYXIgPT09ICc9JykgYnJlYWs7XG4gICAgY29uc3QgaW5kZXggPSBCQVNFNjRVUkxfQ0hBUlMuaW5kZXhPZihjaGFyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGJhc2U2NHVybCBjaGFyYWN0ZXIgXCIke2NoYXJ9XCIgaW4gWDI1NTE5IEpXSyBrZXkgY29tcG9uZW50YFxuICAgICAgKTtcbiAgICB9XG4gICAgYWNjdW11bGF0b3IgPSAoYWNjdW11bGF0b3IgPDwgNikgfCBpbmRleDtcbiAgICBiaXRDb3VudCArPSA2O1xuICAgIGlmIChiaXRDb3VudCA+PSA4KSB7XG4gICAgICBiaXRDb3VudCAtPSA4O1xuICAgICAgYnl0ZXMucHVzaCgoYWNjdW11bGF0b3IgPj4gYml0Q291bnQpICYgMHhmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgdGhlIEFFUy0yNTYtR0NNIGNvbnRlbnQga2V5IGZyb20gYW4gWDI1NTE5IHNoYXJlZCBzZWNyZXQsIGJpbmRpbmdcbiAqIGl0IHRvIGJvdGggcHVibGljIGtleXMgKEhQS0UncyBga2VtX2NvbnRleHRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVyaXZlQ29udGVudEtleShcbiAgc2hhcmVkU2VjcmV0OiBVaW50OEFycmF5LFxuICBlcGhlbWVyYWxQdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gIHJlY2lwaWVudFB1YmxpY0tleTogVWludDhBcnJheSxcbiAgdXNhZ2VzOiBSZWFkb25seUFycmF5PCdlbmNyeXB0JyB8ICdkZWNyeXB0Jz5cbik6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gIGNvbnN0IGxhYmVsID0gaW5mb0VuY29kZXIuZW5jb2RlKENPTlRFTlRfS0VZX0lORk8pO1xuICBjb25zdCBpbmZvID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgbGFiZWwubGVuZ3RoICsgZXBoZW1lcmFsUHVibGljS2V5Lmxlbmd0aCArIHJlY2lwaWVudFB1YmxpY0tleS5sZW5ndGhcbiAgKTtcbiAgaW5mby5zZXQobGFiZWwsIDApO1xuICBpbmZvLnNldChlcGhlbWVyYWxQdWJsaWNLZXksIGxhYmVsLmxlbmd0aCk7XG4gIGluZm8uc2V0KHJlY2lwaWVudFB1YmxpY0tleSwgbGFiZWwubGVuZ3RoICsgZXBoZW1lcmFsUHVibGljS2V5Lmxlbmd0aCk7XG5cbiAgY29uc3QgaGtkZktleSA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3JhdycsXG4gICAgc2hhcmVkU2VjcmV0LFxuICAgICdIS0RGJyxcbiAgICBmYWxzZSxcbiAgICBbJ2Rlcml2ZUJpdHMnXVxuICApO1xuICBjb25zdCBjb250ZW50S2V5Qml0cyA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKFxuICAgIHsgbmFtZTogJ0hLREYnLCBoYXNoOiAnU0hBLTI1NicsIHNhbHQ6IG5ldyBVaW50OEFycmF5KDMyKSwgaW5mbyB9LFxuICAgIGhrZGZLZXksXG4gICAgQ09OVEVOVF9LRVlfTEVOR1RIICogOFxuICApO1xuXG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIG5ldyBVaW50OEFycmF5KGNvbnRlbnRLZXlCaXRzKSxcbiAgICAnQUVTLUdDTScsXG4gICAgZmFsc2UsXG4gICAgLy8gYEtleVVzYWdlYCBpcyBhIERPTS1saWIgdHlwZSB0aGF0IGlzIG5vdCBpbiBzY29wZSB1bmRlciBgZXMyMDIyYDsgdGhlXG4gICAgLy8gcGFyYW1ldGVyIHR5cGUgaXMgYSBzdHJpY3Qgc3Vic2V0IG9mIGl0LCBzbyB0aGlzIGNhc3QgaXMgc291bmQuXG4gICAgdXNhZ2VzIGFzICgnZW5jcnlwdCcgfCAnZGVjcnlwdCcpW11cbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd3JpdGVyIGhhbGYgb2YgdGhlIEtFTTogZ2VuZXJhdGUgYW4gZXBoZW1lcmFsIGtleXBhaXIgYW5kIGRlcml2ZSBhXG4gKiBjb250ZW50IGtleSBmb3IgYSByZWNpcGllbnQncyBwdWJsaWMga2V5LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gbWFueSBwYXlsb2FkcyBzaGFyZSBvbmUgS0VNIG9wZXJhdGlvbiDigJQgaS5lLiBzdHJlYW0gZnJhbWVzLlxuICogVGhlIHJldHVybmVkIGBjb250ZW50S2V5YCBjYW4gb25seSBlbmNyeXB0LCBzbyBhIHN0cmVhbSB3cml0ZXIgcHJvdmFibHlcbiAqIGNhbm5vdCByZWFkIHRoZSByZWNpcGllbnQgcnVuJ3MgZGF0YSBldmVuIGJ5IG1pc3Rha2UuXG4gKlxuICogKipDYWxsZXJzIG93biBub25jZSBkaXNjaXBsaW5lLioqIEVuY3J5cHQgZWFjaCBmcmFtZSB3aXRoIGEgZnJlc2ggcmFuZG9tXG4gKiBub25jZSwgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiBmb3IgZXZlcnkgbmV3IGNvbm5lY3Rpb24gYXR0ZW1wdCBvclxuICogcmVwbGF5IHNvIHRoYXQgYSByZXN0YXJ0ZWQgd3JpdGVyIG5ldmVyIHJldXNlcyBhIGNvbnRlbnQga2V5LiBGb3Igb25lLXNob3RcbiAqIHBheWxvYWRzIHByZWZlciB7QGxpbmsgc2VhbH0sIHdoaWNoIGhhbmRsZXMgdGhpcyBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRQdWJsaWNLZXkgLSBUaGUgcmVjaXBpZW50IHJ1bidzIHJhdyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyBUaGUgZXBoZW1lcmFsIHB1YmxpYyBrZXkgdG8gcHVibGlzaCBhbG9uZ3NpZGUgdGhlIGNpcGhlcnRleHQsIGFuZFxuICogICB0aGUgZW5jcnlwdC1vbmx5IGNvbnRlbnQga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNhcHN1bGF0ZShyZWNpcGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHtcbiAgZXBoZW1lcmFsUHVibGljS2V5OiBVaW50OEFycmF5O1xuICBjb250ZW50S2V5OiBDcnlwdG9LZXk7XG59PiB7XG4gIGFzc2VydFB1YmxpY0tleUxlbmd0aChyZWNpcGllbnRQdWJsaWNLZXksICdSZWNpcGllbnQgcHVibGljIGtleScpO1xuXG4gIGxldCByZWNpcGllbnRLZXk6IENyeXB0b0tleTtcbiAgdHJ5IHtcbiAgICByZWNpcGllbnRLZXkgPSBhd2FpdCBpbXBvcnRQdWJsaWNLZXkocmVjaXBpZW50UHVibGljS2V5KTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgSW52YWxpZCBYMjU1MTkgcmVjaXBpZW50IHB1YmxpYyBrZXk6ICR7Y2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpfWAsXG4gICAgICB7IGNhdXNlIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgZXBoZW1lcmFsID0gKGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgLyogZXh0cmFjdGFibGUgKi8gdHJ1ZSxcbiAgICBbJ2Rlcml2ZUJpdHMnXVxuICApKSBhcyB7IHByaXZhdGVLZXk6IENyeXB0b0tleTsgcHVibGljS2V5OiBDcnlwdG9LZXkgfTtcblxuICBjb25zdCBlcGhlbWVyYWxQdWJsaWNLZXkgPSBuZXcgVWludDhBcnJheShcbiAgICBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdyYXcnLCBlcGhlbWVyYWwucHVibGljS2V5KVxuICApO1xuXG4gIGxldCBzaGFyZWRTZWNyZXRCaXRzOiBBcnJheUJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBzaGFyZWRTZWNyZXRCaXRzID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoXG4gICAgICB7IG5hbWU6ICdYMjU1MTknLCBwdWJsaWM6IHJlY2lwaWVudEtleSB9LFxuICAgICAgZXBoZW1lcmFsLnByaXZhdGVLZXksXG4gICAgICBYMjU1MTlfS0VZX0xFTkdUSCAqIDhcbiAgICApO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIC8vIFdlYiBDcnlwdG8gdGhyb3dzIE9wZXJhdGlvbkVycm9yIHdoZW4gdGhlIHNoYXJlZCBzZWNyZXQgaXMgYWxsLXplcm8sXG4gICAgLy8gd2hpY2ggaGFwcGVucyBleGFjdGx5IHdoZW4gdGhlIHJlY2lwaWVudCBwdWJsaWMga2V5IGlzIGEgbG93LW9yZGVyXG4gICAgLy8gcG9pbnQuIFRoaXMgaXMgdGhlIHBsYXRmb3JtIGdpdmluZyB1cyBIUEtFJ3MgY29udHJpYnV0b3J5LWJlaGF2aW9yXG4gICAgLy8gY2hlY2sgZm9yIGZyZWUuXG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgJ1gyNTUxOSBrZXkgYWdyZWVtZW50IGZhaWxlZDogdGhlIHJlY2lwaWVudCBwdWJsaWMga2V5IGlzIG5vdCBhIHZhbGlkICcgK1xuICAgICAgICAnY3VydmUgcG9pbnQgKGxvdy1vcmRlciBwb2ludCBvciBjb3JydXB0ZWQga2V5IG1hdGVyaWFsKScsXG4gICAgICB7IGNhdXNlIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGVudEtleSA9IGF3YWl0IGRlcml2ZUNvbnRlbnRLZXkoXG4gICAgbmV3IFVpbnQ4QXJyYXkoc2hhcmVkU2VjcmV0Qml0cyksXG4gICAgZXBoZW1lcmFsUHVibGljS2V5LFxuICAgIHJlY2lwaWVudFB1YmxpY0tleSxcbiAgICBbJ2VuY3J5cHQnXVxuICApO1xuXG4gIHJldHVybiB7IGVwaGVtZXJhbFB1YmxpY0tleSwgY29udGVudEtleSB9O1xufVxuXG4vKipcbiAqIFRoZSByZWNpcGllbnQgaGFsZiBvZiB0aGUgS0VNOiByZWNvdmVyIHRoZSBjb250ZW50IGtleSBmb3IgYSBzZWFsZWRcbiAqIHBheWxvYWQgZnJvbSB0aGUgcnVuJ3Mgb3duIGtleXBhaXIgYW5kIHRoZSBzZW5kZXIncyBlcGhlbWVyYWwgcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0ga2V5UGFpciAtIFRoZSByZWNpcGllbnQgcnVuJ3Mga2V5cGFpciwgZnJvbSB7QGxpbmsgZGVyaXZlUnVuS2V5UGFpcn1cbiAqIEBwYXJhbSBlcGhlbWVyYWxQdWJsaWNLZXkgLSBUaGUgc2VuZGVyJ3MgcmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXksXG4gKiAgIHJlYWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgc2VhbGVkIGVudmVsb3BlXG4gKiBAcmV0dXJucyBBIGRlY3J5cHQtb25seSBjb250ZW50IGtleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjYXBzdWxhdGUoXG4gIGtleVBhaXI6IFJ1bktleVBhaXIsXG4gIGVwaGVtZXJhbFB1YmxpY0tleTogVWludDhBcnJheVxuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgaWYgKGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoICE9PSBYMjU1MTlfS0VZX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYFNlYWxlZCBwYXlsb2FkIGhhcyBhIG1hbGZvcm1lZCBlcGhlbWVyYWwgcHVibGljIGtleTogZXhwZWN0ZWQgJHtYMjU1MTlfS0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2VwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RofWAsXG4gICAgICB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbGV0IHNoYXJlZFNlY3JldEJpdHM6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNvbnN0IFtwcml2YXRlS2V5LCBzZW5kZXJLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW1wb3J0U2NhbGFyKGtleVBhaXIuc2NhbGFyLCAvKiBleHRyYWN0YWJsZSAqLyBmYWxzZSksXG4gICAgICBpbXBvcnRQdWJsaWNLZXkoZXBoZW1lcmFsUHVibGljS2V5KSxcbiAgICBdKTtcbiAgICBzaGFyZWRTZWNyZXRCaXRzID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoXG4gICAgICB7IG5hbWU6ICdYMjU1MTknLCBwdWJsaWM6IHNlbmRlcktleSB9LFxuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIFgyNTUxOV9LRVlfTEVOR1RIICogOFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgWDI1NTE5IGtleSBhZ3JlZW1lbnQgZmFpbGVkIHdoaWxlIG9wZW5pbmcgYSBzZWFsZWQgcGF5bG9hZDogJHtjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSl9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRlcml2ZUNvbnRlbnRLZXkoXG4gICAgbmV3IFVpbnQ4QXJyYXkoc2hhcmVkU2VjcmV0Qml0cyksXG4gICAgZXBoZW1lcmFsUHVibGljS2V5LFxuICAgIGtleVBhaXIucHVibGljS2V5LFxuICAgIFsnZGVjcnlwdCddXG4gICk7XG59XG5cbi8qKlxuICogU2VhbCBhIHBheWxvYWQgdG8gYSBydW4ncyBwdWJsaWMga2V5LlxuICpcbiAqIEVhY2ggY2FsbCBwZXJmb3JtcyBpdHMgb3duIEtFTSBvcGVyYXRpb24sIHNvIGV2ZXJ5IHNlYWxlZCBwYXlsb2FkIGdldHMgYW5cbiAqIGluZGVwZW5kZW50IGNvbnRlbnQga2V5IOKAlCBub25jZSByZXVzZSBhY3Jvc3MgY2FsbHMgaXMgaW1wb3NzaWJsZSBieVxuICogY29uc3RydWN0aW9uLlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRQdWJsaWNLZXkgLSBUaGUgcmVjaXBpZW50IHJ1bidzIHJhdyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5XG4gKiBAcGFyYW0gZGF0YSAtIFBsYWludGV4dCB0byBzZWFsXG4gKiBAcGFyYW0gYWFkIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEsIGNvdmVyZWQgYnkgdGhlIEdDTSB0YWdcbiAqICAgYnV0IG5vdCBlbmNyeXB0ZWQuIENhbGxlcnMgcGFzcyB0aGUgcmVjaXBpZW50J3MgYHByb2plY3RJZHxydW5JZGAgc28gYVxuICogICBzZWFsZWQgcGF5bG9hZCBjYW5ub3QgYmUgcmVwbGF5ZWQgYWdhaW5zdCBhIGRpZmZlcmVudCBydW4uXG4gKiBAcmV0dXJucyBgW2VwaGVtZXJhbCBwdWJsaWMga2V5ICgzMildW25vbmNlICgxMildW2NpcGhlcnRleHQgKyB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhbChcbiAgcmVjaXBpZW50UHVibGljS2V5OiBVaW50OEFycmF5LFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBhYWQ/OiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgeyBlcGhlbWVyYWxQdWJsaWNLZXksIGNvbnRlbnRLZXkgfSA9XG4gICAgYXdhaXQgZW5jYXBzdWxhdGUocmVjaXBpZW50UHVibGljS2V5KTtcbiAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgYWVzR2NtRW5jcnlwdChjb250ZW50S2V5LCBkYXRhLCBhYWQpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KFxuICAgIGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoICsgZW5jcnlwdGVkLmJ5dGVMZW5ndGhcbiAgKTtcbiAgcmVzdWx0LnNldChlcGhlbWVyYWxQdWJsaWNLZXksIDApO1xuICByZXN1bHQuc2V0KGVuY3J5cHRlZCwgZXBoZW1lcmFsUHVibGljS2V5LmJ5dGVMZW5ndGgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gYSBwYXlsb2FkIHNlYWxlZCB0byB0aGlzIHJ1bidzIHB1YmxpYyBrZXkuXG4gKlxuICogQHBhcmFtIGtleVBhaXIgLSBUaGUgcmVjaXBpZW50IHJ1bidzIGtleXBhaXIsIGZyb20ge0BsaW5rIGRlcml2ZVJ1bktleVBhaXJ9XG4gKiBAcGFyYW0gc2VhbGVkIC0gYFtlcGhlbWVyYWwgcHVibGljIGtleSAoMzIpXVtub25jZSAoMTIpXVtjaXBoZXJ0ZXh0ICsgdGFnXWBcbiAqIEBwYXJhbSBhYWQgLSBUaGUgZXhhY3QgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgcGFzc2VkIHRvIHtAbGluayBzZWFsfVxuICogQHJldHVybnMgVGhlIGRlY3J5cHRlZCBwbGFpbnRleHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW4oXG4gIGtleVBhaXI6IFJ1bktleVBhaXIsXG4gIHNlYWxlZDogVWludDhBcnJheSxcbiAgYWFkPzogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIC8vIEVwaGVtZXJhbCBwdWJsaWMga2V5ICsgQUVTLUdDTSBub25jZSArIEFFUy1HQ00gdGFnLlxuICBjb25zdCBtaW5MZW5ndGggPSBYMjU1MTlfS0VZX0xFTkdUSCArIE5PTkNFX0xFTkdUSCArIFRBR19CWVRFUztcbiAgaWYgKHNlYWxlZC5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgU2VhbGVkIHBheWxvYWQgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke3NlYWxlZC5ieXRlTGVuZ3RofWAsXG4gICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiAnZGVjcnlwdCcsIGJ5dGVMZW5ndGg6IHNlYWxlZC5ieXRlTGVuZ3RoIH0gfVxuICAgICk7XG4gIH1cblxuICBjb25zdCBlcGhlbWVyYWxQdWJsaWNLZXkgPSBzZWFsZWQuc3ViYXJyYXkoMCwgWDI1NTE5X0tFWV9MRU5HVEgpO1xuICBjb25zdCBlbmNyeXB0ZWQgPSBzZWFsZWQuc3ViYXJyYXkoWDI1NTE5X0tFWV9MRU5HVEgpO1xuICBjb25zdCBjb250ZW50S2V5ID0gYXdhaXQgZGVjYXBzdWxhdGUoa2V5UGFpciwgZXBoZW1lcmFsUHVibGljS2V5KTtcbiAgcmV0dXJuIGFlc0djbURlY3J5cHQoY29udGVudEtleSwgZW5jcnlwdGVkLCBhYWQpO1xufVxuXG4vKipcbiAqIEEgd3JpdGVyLXNpZGUgc2Vzc2lvbiB0aGF0IGFtb3J0aXplcyBvbmUgS0VNIG9wZXJhdGlvbiBhY3Jvc3MgbWFueSBzZWFsZWRcbiAqIHBheWxvYWRzIOKAlCB1c2UgaXQgZm9yIHN0cmVhbXMsIHdoZXJlIG9uZS1zaG90IHtAbGluayBzZWFsfSB3b3VsZCBwZXJmb3JtIGFcbiAqIGZyZXNoIGtleWdlbiArIEVDREggKyBIS0RGIGZvciBldmVyeSBmcmFtZS5cbiAqXG4gKiBTYWZldHkgcmVzdHMgb24gdHdvIHByb3BlcnRpZXM6XG4gKlxuICogLSBFdmVyeSBwYXlsb2FkIHN0aWxsIGdldHMgYSAqKmZyZXNoIHJhbmRvbSBub25jZSoqIGZyb20gYGFlc0djbUVuY3J5cHRgLCBzb1xuICogICBzaGFyaW5nIHRoZSBjb250ZW50IGtleSBkb2VzIG5vdCByaXNrIGAoa2V5LCBub25jZSlgIHJldXNlLiAoQSBjb3VudGVyXG4gKiAgIHdvdWxkOiBpdCByZXN0YXJ0cyBhdCB6ZXJvIHdoZW5ldmVyIGEgd3JpdGVyIHJlc3RhcnRzLilcbiAqIC0gVGhlIHNlc3Npb24gaXMgYm91bmQgdG8gb25lIHdyaXRlciBpbnN0YW5jZS4gQSByZWNvbm5lY3Qgb3IgYSBkdXJhYmxlXG4gKiAgIHJlcGxheSBjb25zdHJ1Y3RzIGEgbmV3IHNlc3Npb24sIHNvIGEgcmVzdGFydGVkIHdyaXRlciBuZXZlciBpbmhlcml0cyBhXG4gKiAgIHByZXZpb3VzIGluY2FybmF0aW9uJ3MgY29udGVudCBrZXkuXG4gKlxuICogVGhlIGVudmVsb3BlIGxheW91dCBpcyBieXRlLWlkZW50aWNhbCB0byB7QGxpbmsgc2VhbH0sIHNvIGEgcmVhZGVyIGNhbm5vdFxuICogdGVsbCB3aGljaCB3YXMgdXNlZCBhbmQgbmVlZHMgbm8gbWF0Y2hpbmcgc2Vzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYWxTZXNzaW9uKFxuICByZWNpcGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IHsgc2VhbChkYXRhOiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PiB9IHtcbiAgbGV0IGVuY2Fwc3VsYXRpb246XG4gICAgfCBQcm9taXNlPHsgZXBoZW1lcmFsUHVibGljS2V5OiBVaW50OEFycmF5OyBjb250ZW50S2V5OiBDcnlwdG9LZXkgfT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHNlYWwoZGF0YTogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgLy8gTGF6aWx5LCBzbyBjb25zdHJ1Y3RpbmcgYSBzZXNzaW9uIGZvciBhIHN0cmVhbSB0aGF0IGlzIG5ldmVyIHdyaXR0ZW5cbiAgICAgIC8vIHRvIGNvc3RzIG5vdGhpbmcuXG4gICAgICBlbmNhcHN1bGF0aW9uID8/PSBlbmNhcHN1bGF0ZShyZWNpcGllbnRQdWJsaWNLZXkpO1xuICAgICAgY29uc3QgeyBlcGhlbWVyYWxQdWJsaWNLZXksIGNvbnRlbnRLZXkgfSA9IGF3YWl0IGVuY2Fwc3VsYXRpb247XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGNvbnRlbnRLZXksIGRhdGEsIGFhZCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCArIGVuY3J5cHRlZC5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgICAgcmVzdWx0LnNldChlcGhlbWVyYWxQdWJsaWNLZXksIDApO1xuICAgICAgcmVzdWx0LnNldChlbmNyeXB0ZWQsIGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHJlYWRlci1zaWRlIHNlc3Npb24gdGhhdCBjYWNoZXMgZGVjYXBzdWxhdGlvbiBwZXIgc2VuZGVyLlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIGNyZWF0ZVNlYWxTZXNzaW9ufTogYmVjYXVzZSBldmVyeSBmcmFtZSBmcm9tIG9uZSB3cml0ZXJcbiAqIGNhcnJpZXMgdGhlIHNhbWUgZXBoZW1lcmFsIHB1YmxpYyBrZXksIHRoaXMgdHVybnMgYW4gRUNESCBwZXIgZnJhbWUgaW50byBhblxuICogRUNESCBwZXIgd3JpdGVyLiBDb3JyZWN0bmVzcyBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHdyaXRlciBoYXZpbmcgdXNlZCBhXG4gKiBzZXNzaW9uIOKAlCBhIHN0cmVhbSBvZiBpbmRlcGVuZGVudGx5IHNlYWxlZCBwYXlsb2FkcyBzaW1wbHkgbWlzc2VzIHRoZSBjYWNoZVxuICogb24gZWFjaCBuZXcgZXBoZW1lcmFsIGtleS5cbiAqXG4gKiBUaGUgY2FjaGUgaXMga2V5ZWQgYnkgdGhlIGVwaGVtZXJhbCBwdWJsaWMga2V5IGFuZCBob2xkcyBvbmUgZW50cnksIHdoaWNoIGlzXG4gKiB0aGUgY29tbW9uIGNhc2UgKG9uZSB3cml0ZXIgcGVyIHN0cmVhbSkuIEEgc2Vjb25kIHdyaXRlciBldmljdHMgdGhlIGZpcnN0XG4gKiByYXRoZXIgdGhhbiBncm93aW5nIHdpdGhvdXQgYm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcGVuU2Vzc2lvbihcbiAga2V5UGFpcjogUnVuS2V5UGFpcixcbiAgYWFkPzogVWludDhBcnJheVxuKTogeyBvcGVuKHNlYWxlZDogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4gfSB7XG4gIGxldCBjYWNoZWRTZW5kZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGNhY2hlZEtleTogUHJvbWlzZTxDcnlwdG9LZXk+IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgb3BlbihzZWFsZWQ6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgIGNvbnN0IG1pbkxlbmd0aCA9IFgyNTUxOV9LRVlfTEVOR1RIICsgTk9OQ0VfTEVOR1RIICsgVEFHX0JZVEVTO1xuICAgICAgaWYgKHNlYWxlZC5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgICAgIGBTZWFsZWQgcGF5bG9hZCB0b28gc2hvcnQ6IGV4cGVjdGVkIGF0IGxlYXN0ICR7bWluTGVuZ3RofSBieXRlcywgZ290ICR7c2VhbGVkLmJ5dGVMZW5ndGh9YCxcbiAgICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiAnZGVjcnlwdCcsIGJ5dGVMZW5ndGg6IHNlYWxlZC5ieXRlTGVuZ3RoIH0gfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcGhlbWVyYWxQdWJsaWNLZXkgPSBzZWFsZWQuc3ViYXJyYXkoMCwgWDI1NTE5X0tFWV9MRU5HVEgpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkID0gc2VhbGVkLnN1YmFycmF5KFgyNTUxOV9LRVlfTEVOR1RIKTtcblxuICAgICAgY29uc3Qgc2VuZGVyID0ga2V5Q2FjaGVJZChlcGhlbWVyYWxQdWJsaWNLZXkpO1xuICAgICAgaWYgKHNlbmRlciAhPT0gY2FjaGVkU2VuZGVyIHx8ICFjYWNoZWRLZXkpIHtcbiAgICAgICAgY2FjaGVkU2VuZGVyID0gc2VuZGVyO1xuICAgICAgICBjYWNoZWRLZXkgPSBkZWNhcHN1bGF0ZShrZXlQYWlyLCBlcGhlbWVyYWxQdWJsaWNLZXkpO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29udGVudEtleTogQ3J5cHRvS2V5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29udGVudEtleSA9IGF3YWl0IGNhY2hlZEtleTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIERvIG5vdCBsZXQgb25lIGJhZCBmcmFtZSBwb2lzb24gdGhlIGNhY2hlIGZvciBzdWJzZXF1ZW50IGZyYW1lcy5cbiAgICAgICAgY2FjaGVkU2VuZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICBjYWNoZWRLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWVzR2NtRGVjcnlwdChjb250ZW50S2V5LCBlbmNyeXB0ZWQsIGFhZCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFN0YWJsZSBjYWNoZSBrZXkgZm9yIGEgMzItYnl0ZSBwdWJsaWMga2V5LiAqL1xuZnVuY3Rpb24ga2V5Q2FjaGVJZChwdWJsaWNLZXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICBsZXQgaWQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwdWJsaWNLZXkubGVuZ3RoOyBpKyspIHtcbiAgICBpZCArPSBwdWJsaWNLZXlbaV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH1cbiAgcmV0dXJuIGlkO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YSB0aGF0IGJpbmRzIGEgc2VhbGVkIHBheWxvYWQgdG8gYVxuICogc3BlY2lmaWMgcnVuLlxuICpcbiAqIE1pcnJvcnMgdGhlIGBpbmZvYCB1c2VkIGZvciBzeW1tZXRyaWMgcGVyLXJ1biBrZXkgZGVyaXZhdGlvbiBzbyB0aGUgdHdvXG4gKiBzY2hlbWVzIGFncmVlIG9uIHdoYXQgXCJ0aGlzIHJ1blwiIG1lYW5zLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgc2VhbGVkLWJveCBjb25zdHJ1Y3Rpb24gYWxyZWFkeSBiaW5kcyBhIHBheWxvYWQgdG8gaXRzXG4gKiByZWNpcGllbnQgd2l0aG91dCBhbnkgQUFEOiB0aGUgY29udGVudCBrZXkgaXMgZGVyaXZlZCBvdmVyXG4gKiBgZXBoZW1lcmFsUHVibGljS2V5IOKAliByZWNpcGllbnRQdWJsaWNLZXlgLCBhbmQgYSByZWNpcGllbnQgcHVibGljIGtleSBpc1xuICogdW5pcXVlIHBlciAoZGVwbG95bWVudCBrZXkgw5cgcHJvamVjdCDDlyBydW4pLiBSZXBsYXlpbmcgYSBzZWFsZWQgcGF5bG9hZCBhdFxuICogYSBkaWZmZXJlbnQgcnVuIHRoZXJlZm9yZSBmYWlscyBhdCBrZXkgYWdyZWVtZW50IHJlZ2FyZGxlc3MuIEFBRCBpc1xuICogYXZhaWxhYmxlIGZvciBjYWxsZXJzIHRoYXQgd2FudCBhbiBhZGRpdGlvbmFsLCBLREYtaW5kZXBlbmRlbnQgYmluZGluZyDigJRcbiAqIGJvdGggc2lkZXMgbXVzdCBzdXBwbHkgYnl0ZS1pZGVudGljYWwgdmFsdWVzIG9yIHRoZSBwYXlsb2FkIHdpbGwgbm90IG9wZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5BYWQocHJvamVjdElkOiBzdHJpbmcsIHJ1bklkOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGluZm9FbmNvZGVyLmVuY29kZShgJHtwcm9qZWN0SWR9fCR7cnVuSWR9YCk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgcnVuJ3MgcHVibGlzaGVkIHB1YmxpYyBrZXksIHZhbGlkYXRpbmcgYm90aCBlbmNvZGluZyBhbmQgbGVuZ3RoLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmFsdWUgaXMgYWJzZW50LCBub3QgdmFsaWQgYmFzZTY0LCBvciBub3RcbiAqIGV4YWN0bHkgMzIgYnl0ZXMuIENhbGxlcnMgdHJlYXQgdGhhdCBhcyBcInRoaXMgcnVuIGhhcyBubyB1c2FibGUgcHVibGljIGtleVwiXG4gKiBhbmQgZmFsbCBiYWNrIHRvIHRoZSBzeW1tZXRyaWMgcGF0aCwgc28gYSBjb3JydXB0IG9yIHRydW5jYXRlZCBzdG9yZWQgdmFsdWVcbiAqIGRlZ3JhZGVzIHRvIHRoZSBwcmUtZXhpc3RpbmcgYmVoYXZpb3IgaW5zdGVhZCBvZiBmYWlsaW5nIGEgcmVzdW1wdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVJ1blB1YmxpY0tleShcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJ5dGVzID0gYmFzZTY0VG9CeXRlcyh2YWx1ZSk7XG4gIGlmICghYnl0ZXMgfHwgYnl0ZXMuYnl0ZUxlbmd0aCAhPT0gWDI1NTE5X0tFWV9MRU5HVEgpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBieXRlcztcbn1cbiJdfQ==
571
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhbGVkLWJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZWFsZWQtYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixZQUFZLEVBQ1osU0FBUyxHQUNWLE1BQU0saUJBQWlCLENBQUM7QUFFekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVGRztBQUVILG1FQUFtRTtBQUNuRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qix3RUFBd0U7QUFDeEUsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFOUI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDO0FBRTlDOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxVQUFVLENBQUM7SUFDekMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUM1RSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQWV0QyxTQUFTLHVCQUF1QixDQUFDLGNBQTBCO0lBQ3pELElBQUksY0FBYyxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsRUFB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Q2hDLEtBQXlCO0lBRXpCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxpQkFBaUI7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgZGVjcnlwdCBhcyBhZXNHY21EZWNyeXB0LFxuICBlbmNyeXB0IGFzIGFlc0djbUVuY3J5cHQsXG4gIHR5cGUgQ3J5cHRvS2V5LFxuICBOT05DRV9MRU5HVEgsXG4gIFRBR19CWVRFUyxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcblxuLyoqXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgc2VhbGVkLWJveCAoYXN5bW1ldHJpYykgZW5jcnlwdGlvbiBmb3IgY3Jvc3MtcnVuIHdyaXRlcy5cbiAqXG4gKiAjIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBUaGUgc3ltbWV0cmljIGBlbmNyYCBwYXRoIHJlcXVpcmVzIHRoZSB3cml0ZXIgdG8gaG9sZCB0aGUgcmVjaXBpZW50IHJ1bidzXG4gKiBrZXksIHdoaWNoIGFsc28gZ3JhbnRzIGRlY3J5cHQgY2FwYWJpbGl0eS4gRm9yICpjcm9zcy1ydW4qIHdyaXRlcyAoYSBob29rXG4gKiByZXN1bXB0aW9uIHRhcmdldGluZyBhbm90aGVyIHJ1biwgb3IgYSBjaGlsZCB3b3JrZmxvdyB3cml0aW5nIGludG8gYVxuICogcGFyZW50J3MgZm9yd2FyZGVkIGBXcml0YWJsZVN0cmVhbWApIHRoYXQgaXMgbW9yZSBhdXRob3JpdHkgdGhhbiB0aGUgd3JpdGVyXG4gKiBuZWVkcywgYW5kIG9idGFpbmluZyB0aGUgc3ltbWV0cmljIGtleSBhY3Jvc3MgYSBkZXBsb3ltZW50IGJvdW5kYXJ5IGNvc3RzIGFcbiAqIHJvdW5kIHRyaXAgdG8gdGhlIFZlcmNlbCBBUEkuXG4gKlxuICogQSBzZWFsZWQgYm94IGZpeGVzIGJvdGg6IHRoZSB3cml0ZXIgbmVlZHMgb25seSB0aGUgcmVjaXBpZW50J3MgKipwdWJsaWMqKlxuICoga2V5LCB3aGljaCBpcyBub3Qgc2VjcmV0IGFuZCB0aGVyZWZvcmUgdHJhdmVscyBvbiB0aGUgcnVuIGVudGl0eSAoYW5kIGluXG4gKiBzdHJlYW0gZGVzY3JpcHRvcnMpIGF0IG5vIGNvc3QuIFwiRW5jcnlwdC1vbmx5XCIgc3RvcHMgYmVpbmcgYW4gaG9ub3Itc3lzdGVtXG4gKiBjb252ZW50aW9uIGVuZm9yY2VkIGJ5IGBpbXBvcnRLZXkocmF3LCBbJ2VuY3J5cHQnXSlgIGFuZCBiZWNvbWVzIGFcbiAqIGNyeXB0b2dyYXBoaWMgZ3VhcmFudGVlOiBhIHdyaXRlciBob2xkaW5nIG9ubHkgdGhlIHB1YmxpYyBrZXkgcHJvdmFibHlcbiAqIGNhbm5vdCByZWFkIGFueXRoaW5nLlxuICpcbiAqICMjIEtleSBoaWVyYXJjaHlcbiAqXG4gKiBCb3RoIGtleXMgZGVzY2VuZCBmcm9tIHRoZSBzYW1lIHBlci1ydW4ga2V5IG1hdGVyaWFsIGBLYCB0aGF0XG4gKiBgV29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYCBhbHJlYWR5IHJldHVybnMgdG9kYXksIHNvIG5vdGhpbmcgYWJvdXRcbiAqIGtleSBhY3F1aXNpdGlvbiwgdGhlIFdvcmxkIGludGVyZmFjZSwgb3IgdGhlIFZlcmNlbCBBUEkgY2hhbmdlczpcbiAqXG4gKiBgYGBcbiAqIEsgICgzMiBieXRlcywgcGVyLXJ1biwgPSBIS0RGKFZFUkNFTF9ERVBMT1lNRU5UX0tFWSwgXCJwcm9qZWN0SWR8cnVuSWRcIikpXG4gKiDilJzilIDilIAgQUVTLTI1NiBrZXkgPSBLIHVzZWQgZGlyZWN0bHkgICAgICAgICAgICDihpIgJ2VuY3InIGVudmVsb3BlcyAodW5jaGFuZ2VkKVxuICog4pSU4pSA4pSAIFgyNTUxOSBzY2FsYXIgPSBIS0RGKEssIFNDQUxBUl9JTkZPKSAgICAg4oaSICdlbmNwJyBlbnZlbG9wZXNcbiAqICAgICDilJTilIDilIAgcHVibGljIGtleSA9IFgyNTUxOSBiYXNlcG9pbnQgwrcgc2NhbGFyICAgKHB1Ymxpc2hlZCwgbm90IHNlY3JldClcbiAqIGBgYFxuICpcbiAqIGBLYCBpcyB0aGVyZWZvcmUgYm90aCBhbiBBRUFEIGtleSBhbmQgYSBrZXktZGVyaXZhdGlvbiBrZXkuIFRoaXMgaXMgc291bmQ6XG4gKiBBRVMtR0NNIG5ldmVyIGV4cG9zZXMgaXRzIGtleSwgYW5kIEhLREYtU0hBMjU2IG91dHB1dCBpcyBjb21wdXRhdGlvbmFsbHlcbiAqIGluZGVwZW5kZW50IG9mIHRoZSBBRVMga2V5c3RyZWFtLiBBIHN0cmljdCByZWFkaW5nIG9mIE5JU1QgU1AgODAwLTEwOFxuICogcHJlZmVycyB0aGVzZSByb2xlcyBiZSBzZXBhcmF0ZWQsIGJ1dCBgS2AncyBkaXJlY3QgQUVTIHVzZSBpcyBmaXhlZCBieVxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV2ZXJ5IGBlbmNyYCBwYXlsb2FkIGFscmVhZHkgd3JpdHRlbi5cbiAqXG4gKiAjIyBDb25zdHJ1Y3Rpb25cbiAqXG4gKiBBbiBFQ0lFUy1zdHlsZSBzZWFsZWQgYm94IHVzaW5nIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgSFBLRSAoUkZDIDkxODApXG4gKiBiYXNlIG1vZGUgd2l0aCBESEtFTShYMjU1MTksIEhLREYtU0hBMjU2KSBhbmQgQUVTLTI1Ni1HQ00sIGJ1dCB3aXRob3V0IHRoZVxuICogZnVsbCBgTGFiZWxlZEV4dHJhY3RgL2BMYWJlbGVkRXhwYW5kYCBzdWl0ZS1JRCBjZXJlbW9ueTpcbiAqXG4gKiBgYGBcbiAqIGVwaGVtZXJhbCAgICA9IFgyNTUxOSBrZXlwYWlyLCBmcmVzaGx5IGdlbmVyYXRlZCBwZXIgZW5jcnlwdGlvbiBjb250ZXh0XG4gKiBzaGFyZWRTZWNyZXQgPSBYMjU1MTkoZXBoZW1lcmFsUHJpdmF0ZSwgcmVjaXBpZW50UHVibGljKVxuICogY29udGVudEtleSAgID0gSEtERi1TSEEyNTYoXG4gKiAgICAgICAgICAgICAgICAgIGlrbSAgPSBzaGFyZWRTZWNyZXQsXG4gKiAgICAgICAgICAgICAgICAgIHNhbHQgPSB6ZXJvcygzMiksXG4gKiAgICAgICAgICAgICAgICAgIGluZm8gPSBDT05URU5UX0tFWV9JTkZPIOKAliBlcGhlbWVyYWxQdWJsaWMg4oCWIHJlY2lwaWVudFB1YmxpYyxcbiAqICAgICAgICAgICAgICAgIClcbiAqIGBgYFxuICpcbiAqIEJpbmRpbmcgYm90aCBwdWJsaWMga2V5cyBpbnRvIGBpbmZvYCBpcyB0aGUgc2VjdXJpdHktY3JpdGljYWwgcGFydCAoaXQgaXNcbiAqIEhQS0UncyBga2VtX2NvbnRleHRgKTogaXQgcHJldmVudHMga2V5LXN1YnN0aXR1dGlvbi91bmtub3duLWtleS1zaGFyZVxuICogYXR0YWNrcyBpbiB3aGljaCBhbiBhZHZlcnNhcnkgcmVwbGF5cyBhIGNpcGhlcnRleHQgYXMgdGhvdWdoIGl0IGhhZCBiZWVuXG4gKiBzZWFsZWQgdG8gYSBkaWZmZXJlbnQgcmVjaXBpZW50LiBEZXZpYXRpbmcgZnJvbSBzdHJpY3QgUkZDIDkxODAgZnJhbWluZyBpc1xuICogYSBkZWxpYmVyYXRlLCBkb2N1bWVudGVkIGNob2ljZTogdGhlIGVudmVsb3BlIGlzIHZlcnNpb25lZCB2aWEgaXRzIGZvcm1hdFxuICogcHJlZml4IGFuZCB0aGUgSEtERiBsYWJlbHMgYmVsb3csIHNvIGEgY29uZm9ybWFudCBwcm9maWxlIGNhbiBiZSBhZGRlZFxuICogbGF0ZXIgYXMgYSBuZXcgdmVyc2lvbiB3aXRob3V0IHRvdWNoaW5nIGV4aXN0aW5nIHBheWxvYWRzLlxuICpcbiAqIFdpcmUgZm9ybWF0ICh0aGUgYGVuY3BgIGZvcm1hdCBwcmVmaXggaXMgYXR0YWNoZWQgYnkgdGhlIHNlcmlhbGl6YXRpb25cbiAqIGxheWVyLCBub3QgYnkgdGhpcyBtb2R1bGUpOlxuICpcbiAqIGBgYFxuICogW2VwaGVtZXJhbCBwdWJsaWMga2V5ICgzMiBieXRlcyldW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gdGFnICgxNiBieXRlcyldXG4gKiBgYGBcbiAqXG4gKiAjIyBOb25jZSBkaXNjaXBsaW5lXG4gKlxuICogT25lLXNob3Qge0BsaW5rIHNlYWx9IGdlbmVyYXRlcyBhIGZyZXNoIGVwaGVtZXJhbCBrZXlwYWlyIChhbmQgdGhlcmVmb3JlIGFcbiAqIGZyZXNoIGNvbnRlbnQga2V5KSBmb3IgZXZlcnkgY2FsbCwgc28gbm9uY2UgcmV1c2UgaXMgaW1wb3NzaWJsZS5cbiAqXG4gKiBDYWxsZXJzIHRoYXQgYW1vcnRpemUgdGhlIEtFTSBhY3Jvc3MgbWFueSBmcmFtZXMgdmlhIHtAbGluayBlbmNhcHN1bGF0ZX1cbiAqIHRha2Ugb24gbm9uY2UgZGlzY2lwbGluZSB0aGVtc2VsdmVzLCBiZWNhdXNlIHRoZSBjb250ZW50IGtleSB0aGVuIG91dGxpdmVzIGFcbiAqIHNpbmdsZSBtZXNzYWdlLiBUd28gcnVsZXMgYXBwbHk6XG4gKlxuICogMS4gRXZlcnkgZnJhbWUgTVVTVCB1c2UgYSBmcmVzaCByYW5kb20gbm9uY2UgKHdoaWNoIGBhZXNHY21FbmNyeXB0YCBkb2VzKS5cbiAqICAgIE5ldmVyIGEgY291bnRlcjogYSBjb3VudGVyIHJlc3RhcnRzIGF0IHplcm8gYWZ0ZXIgYSBzdHJlYW0gcmVjb25uZWN0IG9yIGFcbiAqICAgIGR1cmFibGUgcmVwbGF5LCByZXVzaW5nIGAoY29udGVudEtleSwgbm9uY2UpYCwgd2hpY2ggdW5kZXIgQUVTLUdDTSBsZWFrc1xuICogICAgdGhlIHBsYWludGV4dCBYT1Igb2YgdGhlIHR3byBmcmFtZXMgYW5kIHRoZSBHQ00gYXV0aCBzdWJrZXkuXG4gKiAyLiBBIHdyaXRlciBtdXN0IG5vdCBpbmhlcml0IGEgcHJldmlvdXMgaW5jYXJuYXRpb24ncyBjb250ZW50IGtleSwgc29cbiAqICAgIHtAbGluayBlbmNhcHN1bGF0ZX0gaXMgcmUtcnVuIHBlciB3cml0ZXIgaW5zdGFuY2UuXG4gKlxuICogTm90aGluZyBpbiB0aGlzIG1vZHVsZSBlbmZvcmNlcyBlaXRoZXIgcnVsZTsgaXQgaXMgdGhlIHN0cmVhbWluZyBjYWxsZXInc1xuICogY29udHJhY3QuXG4gKi9cblxuLyoqIExlbmd0aCBvZiBhbiBYMjU1MTkgcHJpdmF0ZSBzY2FsYXIgYW5kIHB1YmxpYyBrZXksIGluIGJ5dGVzLiAqL1xuY29uc3QgWDI1NTE5X0tFWV9MRU5HVEggPSAzMjtcblxuLyoqIExlbmd0aCBvZiB0aGUgQUVTLTI1NiBjb250ZW50IGtleSBkZXJpdmVkIGZyb20gdGhlIHNoYXJlZCBzZWNyZXQuICovXG5jb25zdCBDT05URU5UX0tFWV9MRU5HVEggPSAzMjtcblxuLyoqXG4gKiBIS0RGIGBpbmZvYCBsYWJlbCBmb3IgZGVyaXZpbmcgdGhlIHBlci1ydW4gWDI1NTE5IHNjYWxhciBmcm9tIHRoZSBwZXItcnVuXG4gKiBrZXkgbWF0ZXJpYWwuXG4gKlxuICogVmVyc2lvbmVkIGFuZCBuYW1lc3BhY2VkIHNvIHRoYXQgYW55IGZ1dHVyZSBkZXJpdmF0aW9uIGZyb20gdGhlIHNhbWUgYEtgXG4gKiAoYSBzZWNvbmQga2V5cGFpciwgYSBNQUMga2V5LCBhIGRpZmZlcmVudCBjdXJ2ZSkgY2FuIG5ldmVyIGNvbGxpZGUgd2l0aFxuICogdGhpcyBvbmUuXG4gKi9cbmNvbnN0IFNDQUxBUl9JTkZPID0gJ3dvcmtmbG93L2VuY3AveDI1NTE5L3YxJztcblxuLyoqXG4gKiBIS0RGIGBpbmZvYCBwcmVmaXggZm9yIGRlcml2aW5nIHRoZSBBRVMtMjU2LUdDTSBjb250ZW50IGtleSBmcm9tIGFuIFgyNTUxOVxuICogc2hhcmVkIHNlY3JldC4gVGhlIGVwaGVtZXJhbCBhbmQgcmVjaXBpZW50IHB1YmxpYyBrZXlzIGFyZSBhcHBlbmRlZCB0byB0aGlzXG4gKiBsYWJlbCB0byBmb3JtIHRoZSBmdWxsIGBpbmZvYCAoSFBLRSdzIGBrZW1fY29udGV4dGApLlxuICovXG5jb25zdCBDT05URU5UX0tFWV9JTkZPID0gJ3dvcmtmbG93L2VuY3AvYWVzMjU2Z2NtL3YxJztcblxuLyoqXG4gKiBERVIgcHJlZml4IGZvciBhbiBSRkMgODQxMCBgUHJpdmF0ZUtleUluZm9gIHdyYXBwaW5nIGEgcmF3IFgyNTUxOSBzY2FsYXIuXG4gKlxuICogV2ViIENyeXB0byBjYW5ub3QgaW1wb3J0IGEgcmF3IFgyNTUxOSBwcml2YXRlIGtleSAoYGltcG9ydEtleSgncmF3JywgLi4uKWBcbiAqIGlzIG9ubHkgZGVmaW5lZCBmb3IgcHVibGljIGtleXMgb24gdGhlIFNlY3VyZSBDdXJ2ZXMgYWxnb3JpdGhtcyksIHNvIGFcbiAqIGRlcml2ZWQgc2NhbGFyIGhhcyB0byBiZSB3cmFwcGVkIGluIFBLQ1MjOCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIFRoZVxuICogc3RydWN0dXJlIGlzIGZ1bGx5IGRldGVybWluZWQgZm9yIGEgMzItYnl0ZSBYMjU1MTkga2V5OlxuICpcbiAqIGBgYFxuICogU0VRVUVOQ0UgKDQ2IGJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAzMCAyZVxuICogICBJTlRFR0VSIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiAwMSAwMFxuICogICBTRVFVRU5DRSAoNSBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAzMCAwNVxuICogICAgIE9CSkVDVCBJREVOVElGSUVSIDEuMy4xMDEuMTEwIChYMjU1MTkpICAwNiAwMyAyYiA2NSA2ZVxuICogICBPQ1RFVCBTVFJJTkcgKDM0IGJ5dGVzKSAgICAgICAgICAgICAgICAgICAwNCAyMlxuICogICAgIE9DVEVUIFNUUklORyAoMzIgYnl0ZXMpICAgICAgICAgICAgICAgICAwNCAyMFxuICogICAgICAgPHNjYWxhcj5cbiAqIGBgYFxuICovXG5jb25zdCBQS0NTOF9YMjU1MTlfUFJFRklYID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAweDMwLCAweDJlLCAweDAyLCAweDAxLCAweDAwLCAweDMwLCAweDA1LCAweDA2LCAweDAzLCAweDJiLCAweDY1LCAweDZlLCAweDA0LFxuICAweDIyLCAweDA0LCAweDIwLFxuXSk7XG5cbmNvbnN0IGluZm9FbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qKlxuICogQSBwZXItcnVuIFgyNTUxOSBrZXlwYWlyLCBkZXJpdmVkIGZyb20gdGhlIHJ1bidzIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBDYWxsZXJzIHNob3VsZCBkZXJpdmUgdGhpcyBvbmNlIHBlciBydW4gYW5kIG1lbW9pemUgaXQgYWxvbmdzaWRlIHRoZVxuICogc3ltbWV0cmljIGtleSwgc2luY2UgZGVyaXZhdGlvbiBjb3N0cyBzZXZlcmFsIFdlYiBDcnlwdG8gcm91bmQgdHJpcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuS2V5UGFpciB7XG4gIC8qKiBSYXcgMzItYnl0ZSBYMjU1MTkgcHJpdmF0ZSBzY2FsYXIuIFNlY3JldC4gKi9cbiAgcmVhZG9ubHkgc2NhbGFyOiBVaW50OEFycmF5O1xuICAvKiogUmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXkuIFNhZmUgdG8gcHVibGlzaC4gKi9cbiAgcmVhZG9ubHkgcHVibGljS2V5OiBVaW50OEFycmF5O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRLZXlNYXRlcmlhbExlbmd0aChydW5LZXlNYXRlcmlhbDogVWludDhBcnJheSk6IHZvaWQge1xuICBpZiAocnVuS2V5TWF0ZXJpYWwuYnl0ZUxlbmd0aCAhPT0gQ09OVEVOVF9LRVlfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgYFJ1biBrZXkgbWF0ZXJpYWwgbXVzdCBiZSBleGFjdGx5ICR7Q09OVEVOVF9LRVlfTEVOR1RIfSBieXRlcywgZ290ICR7cnVuS2V5TWF0ZXJpYWwuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRQdWJsaWNLZXlMZW5ndGgocHVibGljS2V5OiBVaW50OEFycmF5LCBsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChwdWJsaWNLZXkuYnl0ZUxlbmd0aCAhPT0gWDI1NTE5X0tFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgJHtsYWJlbH0gbXVzdCBiZSBleGFjdGx5ICR7WDI1NTE5X0tFWV9MRU5HVEh9IGJ5dGVzLCBnb3QgJHtwdWJsaWNLZXkuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgcGVyLXJ1biBYMjU1MTkga2V5cGFpciBmcm9tIHRoZSBydW4ncyAzMi1ieXRlIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBEZXRlcm1pbmlzdGljOiB0aGUgc2FtZSBrZXkgbWF0ZXJpYWwgYWx3YXlzIHlpZWxkcyB0aGUgc2FtZSBrZXlwYWlyLCB3aGljaFxuICogaXMgd2hhdCBsZXRzIHRoZSBvd25pbmcgZGVwbG95bWVudCByZS1kZXJpdmUgaXRzIHByaXZhdGUgc2NhbGFyIG9uIGRlbWFuZFxuICogKGZyb20gYFZFUkNFTF9ERVBMT1lNRU5UX0tFWWApIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBhbnl3aGVyZS5cbiAqXG4gKiBAcGFyYW0gcnVuS2V5TWF0ZXJpYWwgLSBUaGUgMzIgYnl0ZXMgcmV0dXJuZWQgYnkgYFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4oKWBcbiAqIEByZXR1cm5zIFRoZSBydW4ncyBYMjU1MTkgc2NhbGFyIGFuZCBwdWJsaWMga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXJpdmVSdW5LZXlQYWlyKFxuICBydW5LZXlNYXRlcmlhbDogVWludDhBcnJheVxuKTogUHJvbWlzZTxSdW5LZXlQYWlyPiB7XG4gIGFzc2VydEtleU1hdGVyaWFsTGVuZ3RoKHJ1bktleU1hdGVyaWFsKTtcblxuICBjb25zdCBoa2RmS2V5ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAncmF3JyxcbiAgICBydW5LZXlNYXRlcmlhbCxcbiAgICAnSEtERicsXG4gICAgZmFsc2UsXG4gICAgWydkZXJpdmVCaXRzJ11cbiAgKTtcblxuICAvLyBaZXJvIHNhbHQgaXMgYWNjZXB0YWJsZSBwZXIgUkZDIDU4NjkgwqczLjE6IHRoZSBJS00gaGVyZSBpcyBpdHNlbGYgSEtERlxuICAvLyBvdXRwdXQgKG9yIGEgaGlnaC1lbnRyb3B5IEJZT0sgdmFsdWUpLCBzbyBpdCBpcyBhbHJlYWR5IHVuaWZvcm0uIFRoZVxuICAvLyBgaW5mb2AgbGFiZWwgcHJvdmlkZXMgZG9tYWluIHNlcGFyYXRpb24uXG4gIGNvbnN0IHNjYWxhckJpdHMgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhcbiAgICB7XG4gICAgICBuYW1lOiAnSEtERicsXG4gICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICBzYWx0OiBuZXcgVWludDhBcnJheSgzMiksXG4gICAgICBpbmZvOiBpbmZvRW5jb2Rlci5lbmNvZGUoU0NBTEFSX0lORk8pLFxuICAgIH0sXG4gICAgaGtkZktleSxcbiAgICBYMjU1MTlfS0VZX0xFTkdUSCAqIDhcbiAgKTtcbiAgY29uc3Qgc2NhbGFyID0gbmV3IFVpbnQ4QXJyYXkoc2NhbGFyQml0cyk7XG5cbiAgLy8gQW55IDMyLWJ5dGUgc3RyaW5nIGlzIGEgdmFsaWQgWDI1NTE5IHNjYWxhciAodGhlIGxvdy9oaWdoIGJpdHMgYXJlXG4gIC8vIGNsYW1wZWQgZHVyaW5nIHNjYWxhciBtdWx0aXBsaWNhdGlvbiksIHNvIHRoZSBIS0RGIG91dHB1dCBuZWVkcyBub1xuICAvLyByZWplY3Rpb24gc2FtcGxpbmcuXG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGRlcml2ZVB1YmxpY0tleUZyb21TY2FsYXIoc2NhbGFyKTtcbiAgcmV0dXJuIHsgc2NhbGFyLCBwdWJsaWNLZXkgfTtcbn1cblxuLyoqXG4gKiBSZWNvdmVyIHRoZSByYXcgcHVibGljIGtleSBmb3IgYSBzY2FsYXIuXG4gKlxuICogV2ViIENyeXB0byBleHBvc2VzIG5vIHNjYWxhci1tdWx0aXBsaWNhdGlvbiBwcmltaXRpdmUsIHNvIHRoZSBzY2FsYXIgaXNcbiAqIGltcG9ydGVkIGFzIGEgUEtDUyM4IHByaXZhdGUga2V5IGFuZCBpdHMgcHVibGljIGhhbGYgcmVhZCBiYWNrIG91dCBvZiB0aGVcbiAqIEpXSyBleHBvcnQgKGB4YCksIHdoaWNoIHRoZSBTZWN1cmUgQ3VydmVzIHNwZWMgZGVmaW5lcyBhcyB0aGUgYmFzZTY0dXJsXG4gKiByYXcgcHVibGljIGtleS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVyaXZlUHVibGljS2V5RnJvbVNjYWxhcihcbiAgc2NhbGFyOiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IGltcG9ydFNjYWxhcihzY2FsYXIsIC8qIGV4dHJhY3RhYmxlICovIHRydWUpO1xuICBjb25zdCBqd2sgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdqd2snLCBwcml2YXRlS2V5KTtcbiAgaWYgKCFqd2sueCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICdYMjU1MTkgSldLIGV4cG9ydCBkaWQgbm90IGluY2x1ZGUgYSBwdWJsaWMga2V5IGNvbXBvbmVudCAoXCJ4XCIpJ1xuICAgICk7XG4gIH1cbiAgY29uc3QgcHVibGljS2V5ID0gYmFzZTY0VXJsVG9CeXRlcyhqd2sueCk7XG4gIC8vIEd1YXJkIHRoZSBvbmUgc3RlcCBpbiB0aGlzIG1vZHVsZSB0aGF0IHRydXN0cyBhbiBleHRlcm5hbCBlbmNvZGluZy4gQVxuICAvLyBzaG9ydCBvciBtYWxmb3JtZWQgdmFsdWUgaGVyZSB3b3VsZCBvdGhlcndpc2UgZmxvdyBvbndhcmQgYW5kIGZhaWwgbXVjaFxuICAvLyBsYXRlciwgaW5zaWRlIGtleSBhZ3JlZW1lbnQsIHdpdGggYSBmYXIgbGVzcyBvYnZpb3VzIG1lc3NhZ2UuXG4gIGlmIChwdWJsaWNLZXkuYnl0ZUxlbmd0aCAhPT0gWDI1NTE5X0tFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgWDI1NTE5IEpXSyBleHBvcnQgcHJvZHVjZWQgYSAke3B1YmxpY0tleS5ieXRlTGVuZ3RofS1ieXRlIHB1YmxpYyBrZXksIGV4cGVjdGVkICR7WDI1NTE5X0tFWV9MRU5HVEh9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHB1YmxpY0tleTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW1wb3J0U2NhbGFyKFxuICBzY2FsYXI6IFVpbnQ4QXJyYXksXG4gIGV4dHJhY3RhYmxlOiBib29sZWFuXG4pOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICBjb25zdCBwa2NzOCA9IG5ldyBVaW50OEFycmF5KFBLQ1M4X1gyNTUxOV9QUkVGSVgubGVuZ3RoICsgc2NhbGFyLmJ5dGVMZW5ndGgpO1xuICBwa2NzOC5zZXQoUEtDUzhfWDI1NTE5X1BSRUZJWCwgMCk7XG4gIHBrY3M4LnNldChzY2FsYXIsIFBLQ1M4X1gyNTUxOV9QUkVGSVgubGVuZ3RoKTtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3BrY3M4JyxcbiAgICBwa2NzOCxcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgZXh0cmFjdGFibGUsXG4gICAgWydkZXJpdmVCaXRzJ11cbiAgKTtcbn1cblxuZnVuY3Rpb24gaW1wb3J0UHVibGljS2V5KHB1YmxpY0tleTogVWludDhBcnJheSk6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIHB1YmxpY0tleSxcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgLyogZXh0cmFjdGFibGUgKi8gdHJ1ZSxcbiAgICAvLyBQdWJsaWMga2V5cyBjYXJyeSBubyB1c2FnZXMgZm9yIFgyNTUxOTogdGhlIHByaXZhdGUga2V5IGRvZXMgdGhlXG4gICAgLy8gZGVyaXZpbmc7IHRoZSBwdWJsaWMga2V5IGlzIG9ubHkgZXZlciBhbiBhcmd1bWVudCB0byBpdC5cbiAgICBbXVxuICApO1xufVxuXG5jb25zdCBCQVNFNjRfQ0hBUlMgPVxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbmNvbnN0IEJBU0U2NFVSTF9DSEFSUyA9XG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fJztcblxuLyoqXG4gKiBFbmNvZGUgYnl0ZXMgYXMgc3RhbmRhcmQgKHBhZGRlZCkgYmFzZTY0LlxuICpcbiAqIEhhbmQtcm9sbGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGJhc2U2NFVybFRvQnl0ZXN9OiB0aGlzIG1vZHVsZVxuICogcnVucyBpbiB0aGUgYnJvd3NlciAobzExeSBkZWNyeXB0aW9uKSBhbmQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSwgc28gbmVpdGhlclxuICogYEJ1ZmZlcmAgbm9yIGBidG9hYCBjYW4gYmUgYXNzdW1lZC4gVXNlZCBmb3IgdGhlIHdpcmUgZW5jb2Rpbmcgb2YgcnVuIHB1YmxpY1xuICoga2V5cywgbWF0Y2hpbmcgdGhlIGJhc2U2NCBjb252ZW50aW9uIGFscmVhZHkgdXNlZCBmb3IgYFZFUkNFTF9ERVBMT1lNRU5UX0tFWWBcbiAqIGFuZCB0aGUgYHJ1bi1rZXlgIEFQSSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9CYXNlNjQoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICBsZXQgb3V0ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBjb25zdCBiMCA9IGJ5dGVzW2ldO1xuICAgIGNvbnN0IGIxID0gaSArIDEgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpICsgMV0gOiAwO1xuICAgIGNvbnN0IGIyID0gaSArIDIgPCBieXRlcy5sZW5ndGggPyBieXRlc1tpICsgMl0gOiAwO1xuXG4gICAgb3V0ICs9IEJBU0U2NF9DSEFSU1soYjAgPj4gMikgJiAweDNmXTtcbiAgICBvdXQgKz0gQkFTRTY0X0NIQVJTWygoYjAgJiAweDAzKSA8PCA0KSB8ICgoYjEgPj4gNCkgJiAweDBmKV07XG4gICAgb3V0ICs9XG4gICAgICBpICsgMSA8IGJ5dGVzLmxlbmd0aFxuICAgICAgICA/IEJBU0U2NF9DSEFSU1soKGIxICYgMHgwZikgPDwgMikgfCAoKGIyID4+IDYpICYgMHgwMyldXG4gICAgICAgIDogJz0nO1xuICAgIG91dCArPSBpICsgMiA8IGJ5dGVzLmxlbmd0aCA/IEJBU0U2NF9DSEFSU1tiMiAmIDB4M2ZdIDogJz0nO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGVjb2RlIHN0YW5kYXJkIGJhc2U2NCAocGFkZGluZyBvcHRpb25hbCkgdG8gYnl0ZXMuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgbWFsZm9ybWVkIGlucHV0IHJhdGhlciB0aGFuIHRocm93aW5nOiBjYWxsZXJzIGRlY29kZVxuICogcHVibGljIGtleXMgdGhhdCBhcnJpdmUgZnJvbSBzdG9yYWdlIG9yIG92ZXIgdGhlIHdpcmUsIHdoZXJlIGEgY29ycnVwdCB2YWx1ZVxuICogc2hvdWxkIGRlZ3JhZGUgdG8gXCJ0aGlzIHJ1biBoYXMgbm8gdXNhYmxlIHB1YmxpYyBrZXlcIiAoYW5kIGZhbGwgYmFjayB0byB0aGVcbiAqIHN5bW1ldHJpYyBwYXRoKSByYXRoZXIgdGhhbiBjcmFzaCBhIHJlc3VtcHRpb24uXG4gKlxuICogVmFsaWRhdGlvbiBpcyBzdHJpY3QsIGJlY2F1c2UgYSBsZW5pZW50IGRlY29kZXIgaXMgd29yc2UgdGhhbiBhIHRocm93aW5nIG9uZVxuICogaGVyZTogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2hvcnQgb3IgdHJ1bmNhdGVkIGtleSBtYWtlcyBhIGNvcnJ1cHQgdmFsdWUgbG9va1xuICogKnByZXNlbnQqLCBzbyB0aGUgY2FsbGVyIHNlYWxzIHRvIGdhcmJhZ2UgaW5zdGVhZCBvZiB0YWtpbmcgdGhlIGZhbGxiYWNrLlxuICogUmVqZWN0ZWQ6IGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgYWxwaGFiZXQsIGEgbGVuZ3RoIHRoYXQgY2Fubm90IGRlc2NyaWJlIGFcbiAqIHdob2xlIG51bWJlciBvZiBieXRlcyAoYGxlbmd0aCAlIDQgPT09IDFgKSwgcGFkZGluZyBhbnl3aGVyZSBidXQgdGhlIGVuZCwgYW5kXG4gKiBhIGZpbmFsIHF1YW50dW0gd2hvc2UgdW51c2VkIGxvdyBiaXRzIGFyZSBub3QgemVyby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXModmFsdWU6IHN0cmluZyk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAvLyBTdHJpcCB0cmFpbGluZyBwYWRkaW5nLCB0aGVuIHJlcXVpcmUgd2hhdCByZW1haW5zIHRvIGJlIHBhZGRpbmctZnJlZS5cbiAgbGV0IGVuZCA9IHZhbHVlLmxlbmd0aDtcbiAgd2hpbGUgKGVuZCA+IDAgJiYgdmFsdWVbZW5kIC0gMV0gPT09ICc9JykgZW5kLS07XG4gIGNvbnN0IGJvZHkgPSB2YWx1ZS5zbGljZSgwLCBlbmQpO1xuICBpZiAoYm9keS5pbmNsdWRlcygnPScpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIDQgY2hhcnMgLT4gMyBieXRlczsgMyAtPiAyOyAyIC0+IDEuIEEgcmVtYWluZGVyIG9mIDEgZW5jb2RlcyBubyBieXRlLlxuICBpZiAoYm9keS5sZW5ndGggJSA0ID09PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBQYWRkaW5nLCB3aGVuIHByZXNlbnQsIG11c3QgYnJpbmcgdGhlIHRvdGFsIHRvIGEgbXVsdGlwbGUgb2YgNC5cbiAgaWYgKGVuZCAhPT0gdmFsdWUubGVuZ3RoICYmIHZhbHVlLmxlbmd0aCAlIDQgIT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgbGV0IGFjY3VtdWxhdG9yID0gMDtcbiAgbGV0IGJpdENvdW50ID0gMDtcbiAgY29uc3QgYnl0ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBCQVNFNjRfQ0hBUlMuaW5kZXhPZihib2R5W2ldKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGFjY3VtdWxhdG9yID0gKGFjY3VtdWxhdG9yIDw8IDYpIHwgaW5kZXg7XG4gICAgYml0Q291bnQgKz0gNjtcbiAgICBpZiAoYml0Q291bnQgPj0gOCkge1xuICAgICAgYml0Q291bnQgLT0gODtcbiAgICAgIGJ5dGVzLnB1c2goKGFjY3VtdWxhdG9yID4+IGJpdENvdW50KSAmIDB4ZmYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIExlZnRvdmVyIGJpdHMgYmVsb25nIHRvIG5vIGJ5dGUgYW5kIG11c3QgYmUgemVybyBpbiBjYW5vbmljYWwgYmFzZTY0LlxuICBpZiAoYml0Q291bnQgPiAwICYmIChhY2N1bXVsYXRvciAmICgoMSA8PCBiaXRDb3VudCkgLSAxKSkgIT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiYXNlNjR1cmwgc3RyaW5nIChKV0sgZW5jb2RpbmcpIHRvIGJ5dGVzLlxuICpcbiAqIEhhbmQtcm9sbGVkIHJhdGhlciB0aGFuIHVzaW5nIGBhdG9iYCBvciBgQnVmZmVyYDogdGhpcyBtb2R1bGUgYWxzbyBydW5zXG4gKiBpbnNpZGUgdGhlIHdvcmtmbG93IFZNLCB3aG9zZSBnbG9iYWwgc3VyZmFjZSBpcyBkZWxpYmVyYXRlbHkgbWluaW1hbCBhbmRcbiAqIGRvZXMgbm90IGluY2x1ZGUgZWl0aGVyLiBUaGUgaW5wdXRzIGhlcmUgYXJlIGZpeGVkLXNpemUgSldLIGtleSBjb21wb25lbnRzLFxuICogc28gYSBjb21wYWN0IGRlY29kZXIgaXMgc3VmZmljaWVudDogaXQgYWNjZXB0cyB1bnBhZGRlZCBiYXNlNjR1cmwgb25seSxcbiAqIHdoaWNoIGlzIHdoYXQgUkZDIDc1MTUgwqcyIG1hbmRhdGVzIGZvciBKV0sgbWVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0VXJsVG9CeXRlcyh2YWx1ZTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGxldCBhY2N1bXVsYXRvciA9IDA7XG4gIGxldCBiaXRDb3VudCA9IDA7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gdmFsdWVbaV07XG4gICAgaWYgKGNoYXIgPT09ICc9JykgYnJlYWs7XG4gICAgY29uc3QgaW5kZXggPSBCQVNFNjRVUkxfQ0hBUlMuaW5kZXhPZihjaGFyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGJhc2U2NHVybCBjaGFyYWN0ZXIgXCIke2NoYXJ9XCIgaW4gWDI1NTE5IEpXSyBrZXkgY29tcG9uZW50YFxuICAgICAgKTtcbiAgICB9XG4gICAgYWNjdW11bGF0b3IgPSAoYWNjdW11bGF0b3IgPDwgNikgfCBpbmRleDtcbiAgICBiaXRDb3VudCArPSA2O1xuICAgIGlmIChiaXRDb3VudCA+PSA4KSB7XG4gICAgICBiaXRDb3VudCAtPSA4O1xuICAgICAgYnl0ZXMucHVzaCgoYWNjdW11bGF0b3IgPj4gYml0Q291bnQpICYgMHhmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgdGhlIEFFUy0yNTYtR0NNIGNvbnRlbnQga2V5IGZyb20gYW4gWDI1NTE5IHNoYXJlZCBzZWNyZXQsIGJpbmRpbmdcbiAqIGl0IHRvIGJvdGggcHVibGljIGtleXMgKEhQS0UncyBga2VtX2NvbnRleHRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVyaXZlQ29udGVudEtleShcbiAgc2hhcmVkU2VjcmV0OiBVaW50OEFycmF5LFxuICBlcGhlbWVyYWxQdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gIHJlY2lwaWVudFB1YmxpY0tleTogVWludDhBcnJheSxcbiAgdXNhZ2VzOiBSZWFkb25seUFycmF5PCdlbmNyeXB0JyB8ICdkZWNyeXB0Jz5cbik6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gIGNvbnN0IGxhYmVsID0gaW5mb0VuY29kZXIuZW5jb2RlKENPTlRFTlRfS0VZX0lORk8pO1xuICBjb25zdCBpbmZvID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgbGFiZWwubGVuZ3RoICsgZXBoZW1lcmFsUHVibGljS2V5Lmxlbmd0aCArIHJlY2lwaWVudFB1YmxpY0tleS5sZW5ndGhcbiAgKTtcbiAgaW5mby5zZXQobGFiZWwsIDApO1xuICBpbmZvLnNldChlcGhlbWVyYWxQdWJsaWNLZXksIGxhYmVsLmxlbmd0aCk7XG4gIGluZm8uc2V0KHJlY2lwaWVudFB1YmxpY0tleSwgbGFiZWwubGVuZ3RoICsgZXBoZW1lcmFsUHVibGljS2V5Lmxlbmd0aCk7XG5cbiAgY29uc3QgaGtkZktleSA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3JhdycsXG4gICAgc2hhcmVkU2VjcmV0LFxuICAgICdIS0RGJyxcbiAgICBmYWxzZSxcbiAgICBbJ2Rlcml2ZUJpdHMnXVxuICApO1xuICBjb25zdCBjb250ZW50S2V5Qml0cyA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKFxuICAgIHsgbmFtZTogJ0hLREYnLCBoYXNoOiAnU0hBLTI1NicsIHNhbHQ6IG5ldyBVaW50OEFycmF5KDMyKSwgaW5mbyB9LFxuICAgIGhrZGZLZXksXG4gICAgQ09OVEVOVF9LRVlfTEVOR1RIICogOFxuICApO1xuXG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIG5ldyBVaW50OEFycmF5KGNvbnRlbnRLZXlCaXRzKSxcbiAgICAnQUVTLUdDTScsXG4gICAgZmFsc2UsXG4gICAgLy8gYEtleVVzYWdlYCBpcyBhIERPTS1saWIgdHlwZSB0aGF0IGlzIG5vdCBpbiBzY29wZSB1bmRlciBgZXMyMDIyYDsgdGhlXG4gICAgLy8gcGFyYW1ldGVyIHR5cGUgaXMgYSBzdHJpY3Qgc3Vic2V0IG9mIGl0LCBzbyB0aGlzIGNhc3QgaXMgc291bmQuXG4gICAgdXNhZ2VzIGFzICgnZW5jcnlwdCcgfCAnZGVjcnlwdCcpW11cbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd3JpdGVyIGhhbGYgb2YgdGhlIEtFTTogZ2VuZXJhdGUgYW4gZXBoZW1lcmFsIGtleXBhaXIgYW5kIGRlcml2ZSBhXG4gKiBjb250ZW50IGtleSBmb3IgYSByZWNpcGllbnQncyBwdWJsaWMga2V5LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gbWFueSBwYXlsb2FkcyBzaGFyZSBvbmUgS0VNIG9wZXJhdGlvbiwgaS5lLiBzdHJlYW0gZnJhbWVzLlxuICogVGhlIHJldHVybmVkIGBjb250ZW50S2V5YCBjYW4gb25seSBlbmNyeXB0LCBzbyBhIHN0cmVhbSB3cml0ZXIgcHJvdmFibHlcbiAqIGNhbm5vdCByZWFkIHRoZSByZWNpcGllbnQgcnVuJ3MgZGF0YSBldmVuIGJ5IG1pc3Rha2UuXG4gKlxuICogKipDYWxsZXJzIG93biBub25jZSBkaXNjaXBsaW5lLioqIEVuY3J5cHQgZWFjaCBmcmFtZSB3aXRoIGEgZnJlc2ggcmFuZG9tXG4gKiBub25jZSwgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiBmb3IgZXZlcnkgbmV3IGNvbm5lY3Rpb24gYXR0ZW1wdCBvclxuICogcmVwbGF5IHNvIHRoYXQgYSByZXN0YXJ0ZWQgd3JpdGVyIG5ldmVyIHJldXNlcyBhIGNvbnRlbnQga2V5LiBGb3Igb25lLXNob3RcbiAqIHBheWxvYWRzIHByZWZlciB7QGxpbmsgc2VhbH0sIHdoaWNoIGhhbmRsZXMgdGhpcyBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRQdWJsaWNLZXkgLSBUaGUgcmVjaXBpZW50IHJ1bidzIHJhdyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5XG4gKiBAcmV0dXJucyBUaGUgZXBoZW1lcmFsIHB1YmxpYyBrZXkgdG8gcHVibGlzaCBhbG9uZ3NpZGUgdGhlIGNpcGhlcnRleHQsIGFuZFxuICogICB0aGUgZW5jcnlwdC1vbmx5IGNvbnRlbnQga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNhcHN1bGF0ZShyZWNpcGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHtcbiAgZXBoZW1lcmFsUHVibGljS2V5OiBVaW50OEFycmF5O1xuICBjb250ZW50S2V5OiBDcnlwdG9LZXk7XG59PiB7XG4gIGFzc2VydFB1YmxpY0tleUxlbmd0aChyZWNpcGllbnRQdWJsaWNLZXksICdSZWNpcGllbnQgcHVibGljIGtleScpO1xuXG4gIGxldCByZWNpcGllbnRLZXk6IENyeXB0b0tleTtcbiAgdHJ5IHtcbiAgICByZWNpcGllbnRLZXkgPSBhd2FpdCBpbXBvcnRQdWJsaWNLZXkocmVjaXBpZW50UHVibGljS2V5KTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgSW52YWxpZCBYMjU1MTkgcmVjaXBpZW50IHB1YmxpYyBrZXk6ICR7Y2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpfWAsXG4gICAgICB7IGNhdXNlIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgZXBoZW1lcmFsID0gKGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICB7IG5hbWU6ICdYMjU1MTknIH0sXG4gICAgLyogZXh0cmFjdGFibGUgKi8gdHJ1ZSxcbiAgICBbJ2Rlcml2ZUJpdHMnXVxuICApKSBhcyB7IHByaXZhdGVLZXk6IENyeXB0b0tleTsgcHVibGljS2V5OiBDcnlwdG9LZXkgfTtcblxuICBjb25zdCBlcGhlbWVyYWxQdWJsaWNLZXkgPSBuZXcgVWludDhBcnJheShcbiAgICBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdyYXcnLCBlcGhlbWVyYWwucHVibGljS2V5KVxuICApO1xuXG4gIGxldCBzaGFyZWRTZWNyZXRCaXRzOiBBcnJheUJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBzaGFyZWRTZWNyZXRCaXRzID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoXG4gICAgICB7IG5hbWU6ICdYMjU1MTknLCBwdWJsaWM6IHJlY2lwaWVudEtleSB9LFxuICAgICAgZXBoZW1lcmFsLnByaXZhdGVLZXksXG4gICAgICBYMjU1MTlfS0VZX0xFTkdUSCAqIDhcbiAgICApO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIC8vIFdlYiBDcnlwdG8gdGhyb3dzIE9wZXJhdGlvbkVycm9yIHdoZW4gdGhlIHNoYXJlZCBzZWNyZXQgaXMgYWxsLXplcm8sXG4gICAgLy8gd2hpY2ggaGFwcGVucyBleGFjdGx5IHdoZW4gdGhlIHJlY2lwaWVudCBwdWJsaWMga2V5IGlzIGEgbG93LW9yZGVyXG4gICAgLy8gcG9pbnQuIFRoaXMgaXMgdGhlIHBsYXRmb3JtIGdpdmluZyB1cyBIUEtFJ3MgY29udHJpYnV0b3J5LWJlaGF2aW9yXG4gICAgLy8gY2hlY2sgZm9yIGZyZWUuXG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgJ1gyNTUxOSBrZXkgYWdyZWVtZW50IGZhaWxlZDogdGhlIHJlY2lwaWVudCBwdWJsaWMga2V5IGlzIG5vdCBhIHZhbGlkICcgK1xuICAgICAgICAnY3VydmUgcG9pbnQgKGxvdy1vcmRlciBwb2ludCBvciBjb3JydXB0ZWQga2V5IG1hdGVyaWFsKScsXG4gICAgICB7IGNhdXNlIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGVudEtleSA9IGF3YWl0IGRlcml2ZUNvbnRlbnRLZXkoXG4gICAgbmV3IFVpbnQ4QXJyYXkoc2hhcmVkU2VjcmV0Qml0cyksXG4gICAgZXBoZW1lcmFsUHVibGljS2V5LFxuICAgIHJlY2lwaWVudFB1YmxpY0tleSxcbiAgICBbJ2VuY3J5cHQnXVxuICApO1xuXG4gIHJldHVybiB7IGVwaGVtZXJhbFB1YmxpY0tleSwgY29udGVudEtleSB9O1xufVxuXG4vKipcbiAqIFRoZSByZWNpcGllbnQgaGFsZiBvZiB0aGUgS0VNOiByZWNvdmVyIHRoZSBjb250ZW50IGtleSBmb3IgYSBzZWFsZWRcbiAqIHBheWxvYWQgZnJvbSB0aGUgcnVuJ3Mgb3duIGtleXBhaXIgYW5kIHRoZSBzZW5kZXIncyBlcGhlbWVyYWwgcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0ga2V5UGFpciAtIFRoZSByZWNpcGllbnQgcnVuJ3Mga2V5cGFpciwgZnJvbSB7QGxpbmsgZGVyaXZlUnVuS2V5UGFpcn1cbiAqIEBwYXJhbSBlcGhlbWVyYWxQdWJsaWNLZXkgLSBUaGUgc2VuZGVyJ3MgcmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXksXG4gKiAgIHJlYWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgc2VhbGVkIGVudmVsb3BlXG4gKiBAcmV0dXJucyBBIGRlY3J5cHQtb25seSBjb250ZW50IGtleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjYXBzdWxhdGUoXG4gIGtleVBhaXI6IFJ1bktleVBhaXIsXG4gIGVwaGVtZXJhbFB1YmxpY0tleTogVWludDhBcnJheVxuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgaWYgKGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoICE9PSBYMjU1MTlfS0VZX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYFNlYWxlZCBwYXlsb2FkIGhhcyBhIG1hbGZvcm1lZCBlcGhlbWVyYWwgcHVibGljIGtleTogZXhwZWN0ZWQgJHtYMjU1MTlfS0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2VwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RofWAsXG4gICAgICB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbGV0IHNoYXJlZFNlY3JldEJpdHM6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNvbnN0IFtwcml2YXRlS2V5LCBzZW5kZXJLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW1wb3J0U2NhbGFyKGtleVBhaXIuc2NhbGFyLCAvKiBleHRyYWN0YWJsZSAqLyBmYWxzZSksXG4gICAgICBpbXBvcnRQdWJsaWNLZXkoZXBoZW1lcmFsUHVibGljS2V5KSxcbiAgICBdKTtcbiAgICBzaGFyZWRTZWNyZXRCaXRzID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoXG4gICAgICB7IG5hbWU6ICdYMjU1MTknLCBwdWJsaWM6IHNlbmRlcktleSB9LFxuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIFgyNTUxOV9LRVlfTEVOR1RIICogOFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgWDI1NTE5IGtleSBhZ3JlZW1lbnQgZmFpbGVkIHdoaWxlIG9wZW5pbmcgYSBzZWFsZWQgcGF5bG9hZDogJHtjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSl9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdkZWNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRlcml2ZUNvbnRlbnRLZXkoXG4gICAgbmV3IFVpbnQ4QXJyYXkoc2hhcmVkU2VjcmV0Qml0cyksXG4gICAgZXBoZW1lcmFsUHVibGljS2V5LFxuICAgIGtleVBhaXIucHVibGljS2V5LFxuICAgIFsnZGVjcnlwdCddXG4gICk7XG59XG5cbi8qKlxuICogU2VhbCBhIHBheWxvYWQgdG8gYSBydW4ncyBwdWJsaWMga2V5LlxuICpcbiAqIEVhY2ggY2FsbCBwZXJmb3JtcyBpdHMgb3duIEtFTSBvcGVyYXRpb24sIHNvIGV2ZXJ5IHNlYWxlZCBwYXlsb2FkIGdldHMgYW5cbiAqIGluZGVwZW5kZW50IGNvbnRlbnQga2V5OiBub25jZSByZXVzZSBhY3Jvc3MgY2FsbHMgaXMgaW1wb3NzaWJsZSBieVxuICogY29uc3RydWN0aW9uLlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRQdWJsaWNLZXkgLSBUaGUgcmVjaXBpZW50IHJ1bidzIHJhdyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5XG4gKiBAcGFyYW0gZGF0YSAtIFBsYWludGV4dCB0byBzZWFsXG4gKiBAcGFyYW0gYWFkIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEsIGNvdmVyZWQgYnkgdGhlIEdDTSB0YWdcbiAqICAgYnV0IG5vdCBlbmNyeXB0ZWQuIENhbGxlcnMgcGFzcyB0aGUgcmVjaXBpZW50J3MgYHByb2plY3RJZHxydW5JZGAgc28gYVxuICogICBzZWFsZWQgcGF5bG9hZCBjYW5ub3QgYmUgcmVwbGF5ZWQgYWdhaW5zdCBhIGRpZmZlcmVudCBydW4uXG4gKiBAcmV0dXJucyBgW2VwaGVtZXJhbCBwdWJsaWMga2V5ICgzMildW25vbmNlICgxMildW2NpcGhlcnRleHQgKyB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhbChcbiAgcmVjaXBpZW50UHVibGljS2V5OiBVaW50OEFycmF5LFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBhYWQ/OiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgeyBlcGhlbWVyYWxQdWJsaWNLZXksIGNvbnRlbnRLZXkgfSA9XG4gICAgYXdhaXQgZW5jYXBzdWxhdGUocmVjaXBpZW50UHVibGljS2V5KTtcbiAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgYWVzR2NtRW5jcnlwdChjb250ZW50S2V5LCBkYXRhLCBhYWQpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KFxuICAgIGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoICsgZW5jcnlwdGVkLmJ5dGVMZW5ndGhcbiAgKTtcbiAgcmVzdWx0LnNldChlcGhlbWVyYWxQdWJsaWNLZXksIDApO1xuICByZXN1bHQuc2V0KGVuY3J5cHRlZCwgZXBoZW1lcmFsUHVibGljS2V5LmJ5dGVMZW5ndGgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gYSBwYXlsb2FkIHNlYWxlZCB0byB0aGlzIHJ1bidzIHB1YmxpYyBrZXkuXG4gKlxuICogQHBhcmFtIGtleVBhaXIgLSBUaGUgcmVjaXBpZW50IHJ1bidzIGtleXBhaXIsIGZyb20ge0BsaW5rIGRlcml2ZVJ1bktleVBhaXJ9XG4gKiBAcGFyYW0gc2VhbGVkIC0gYFtlcGhlbWVyYWwgcHVibGljIGtleSAoMzIpXVtub25jZSAoMTIpXVtjaXBoZXJ0ZXh0ICsgdGFnXWBcbiAqIEBwYXJhbSBhYWQgLSBUaGUgZXhhY3QgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgcGFzc2VkIHRvIHtAbGluayBzZWFsfVxuICogQHJldHVybnMgVGhlIGRlY3J5cHRlZCBwbGFpbnRleHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW4oXG4gIGtleVBhaXI6IFJ1bktleVBhaXIsXG4gIHNlYWxlZDogVWludDhBcnJheSxcbiAgYWFkPzogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIC8vIEVwaGVtZXJhbCBwdWJsaWMga2V5ICsgQUVTLUdDTSBub25jZSArIEFFUy1HQ00gdGFnLlxuICBjb25zdCBtaW5MZW5ndGggPSBYMjU1MTlfS0VZX0xFTkdUSCArIE5PTkNFX0xFTkdUSCArIFRBR19CWVRFUztcbiAgaWYgKHNlYWxlZC5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgU2VhbGVkIHBheWxvYWQgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke3NlYWxlZC5ieXRlTGVuZ3RofWAsXG4gICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiAnZGVjcnlwdCcsIGJ5dGVMZW5ndGg6IHNlYWxlZC5ieXRlTGVuZ3RoIH0gfVxuICAgICk7XG4gIH1cblxuICBjb25zdCBlcGhlbWVyYWxQdWJsaWNLZXkgPSBzZWFsZWQuc3ViYXJyYXkoMCwgWDI1NTE5X0tFWV9MRU5HVEgpO1xuICBjb25zdCBlbmNyeXB0ZWQgPSBzZWFsZWQuc3ViYXJyYXkoWDI1NTE5X0tFWV9MRU5HVEgpO1xuICBjb25zdCBjb250ZW50S2V5ID0gYXdhaXQgZGVjYXBzdWxhdGUoa2V5UGFpciwgZXBoZW1lcmFsUHVibGljS2V5KTtcbiAgcmV0dXJuIGFlc0djbURlY3J5cHQoY29udGVudEtleSwgZW5jcnlwdGVkLCBhYWQpO1xufVxuXG4vKipcbiAqIEEgd3JpdGVyLXNpZGUgc2Vzc2lvbiB0aGF0IGFtb3J0aXplcyBvbmUgS0VNIG9wZXJhdGlvbiBhY3Jvc3MgbWFueSBzZWFsZWRcbiAqIHBheWxvYWRzLiBVc2UgaXQgZm9yIHN0cmVhbXMsIHdoZXJlIG9uZS1zaG90IHtAbGluayBzZWFsfSB3b3VsZCBwZXJmb3JtIGFcbiAqIGZyZXNoIGtleWdlbiArIEVDREggKyBIS0RGIGZvciBldmVyeSBmcmFtZS5cbiAqXG4gKiBTYWZldHkgcmVzdHMgb24gdHdvIHByb3BlcnRpZXM6XG4gKlxuICogLSBFdmVyeSBwYXlsb2FkIHN0aWxsIGdldHMgYSAqKmZyZXNoIHJhbmRvbSBub25jZSoqIGZyb20gYGFlc0djbUVuY3J5cHRgLCBzb1xuICogICBzaGFyaW5nIHRoZSBjb250ZW50IGtleSBkb2VzIG5vdCByaXNrIGAoa2V5LCBub25jZSlgIHJldXNlLiAoQSBjb3VudGVyXG4gKiAgIHdvdWxkOiBpdCByZXN0YXJ0cyBhdCB6ZXJvIHdoZW5ldmVyIGEgd3JpdGVyIHJlc3RhcnRzLilcbiAqIC0gVGhlIHNlc3Npb24gaXMgYm91bmQgdG8gb25lIHdyaXRlciBpbnN0YW5jZS4gQSByZWNvbm5lY3Qgb3IgYSBkdXJhYmxlXG4gKiAgIHJlcGxheSBjb25zdHJ1Y3RzIGEgbmV3IHNlc3Npb24sIHNvIGEgcmVzdGFydGVkIHdyaXRlciBuZXZlciBpbmhlcml0cyBhXG4gKiAgIHByZXZpb3VzIGluY2FybmF0aW9uJ3MgY29udGVudCBrZXkuXG4gKlxuICogVGhlIGVudmVsb3BlIGxheW91dCBpcyBieXRlLWlkZW50aWNhbCB0byB7QGxpbmsgc2VhbH0sIHNvIGEgcmVhZGVyIGNhbm5vdFxuICogdGVsbCB3aGljaCB3YXMgdXNlZCBhbmQgbmVlZHMgbm8gbWF0Y2hpbmcgc2Vzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlYWxTZXNzaW9uKFxuICByZWNpcGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IHsgc2VhbChkYXRhOiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PiB9IHtcbiAgbGV0IGVuY2Fwc3VsYXRpb246XG4gICAgfCBQcm9taXNlPHsgZXBoZW1lcmFsUHVibGljS2V5OiBVaW50OEFycmF5OyBjb250ZW50S2V5OiBDcnlwdG9LZXkgfT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHNlYWwoZGF0YTogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgLy8gTGF6aWx5LCBzbyBjb25zdHJ1Y3RpbmcgYSBzZXNzaW9uIGZvciBhIHN0cmVhbSB0aGF0IGlzIG5ldmVyIHdyaXR0ZW5cbiAgICAgIC8vIHRvIGNvc3RzIG5vdGhpbmcuXG4gICAgICBlbmNhcHN1bGF0aW9uID8/PSBlbmNhcHN1bGF0ZShyZWNpcGllbnRQdWJsaWNLZXkpO1xuICAgICAgY29uc3QgeyBlcGhlbWVyYWxQdWJsaWNLZXksIGNvbnRlbnRLZXkgfSA9IGF3YWl0IGVuY2Fwc3VsYXRpb247XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGNvbnRlbnRLZXksIGRhdGEsIGFhZCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgICBlcGhlbWVyYWxQdWJsaWNLZXkuYnl0ZUxlbmd0aCArIGVuY3J5cHRlZC5ieXRlTGVuZ3RoXG4gICAgICApO1xuICAgICAgcmVzdWx0LnNldChlcGhlbWVyYWxQdWJsaWNLZXksIDApO1xuICAgICAgcmVzdWx0LnNldChlbmNyeXB0ZWQsIGVwaGVtZXJhbFB1YmxpY0tleS5ieXRlTGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHJlYWRlci1zaWRlIHNlc3Npb24gdGhhdCBjYWNoZXMgZGVjYXBzdWxhdGlvbiBwZXIgc2VuZGVyLlxuICpcbiAqIFRoZSBtaXJyb3Igb2Yge0BsaW5rIGNyZWF0ZVNlYWxTZXNzaW9ufTogYmVjYXVzZSBldmVyeSBmcmFtZSBmcm9tIG9uZSB3cml0ZXJcbiAqIGNhcnJpZXMgdGhlIHNhbWUgZXBoZW1lcmFsIHB1YmxpYyBrZXksIHRoaXMgdHVybnMgYW4gRUNESCBwZXIgZnJhbWUgaW50byBhblxuICogRUNESCBwZXIgd3JpdGVyLiBDb3JyZWN0bmVzcyBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHdyaXRlciBoYXZpbmcgdXNlZCBhXG4gKiBzZXNzaW9uOiBhIHN0cmVhbSBvZiBpbmRlcGVuZGVudGx5IHNlYWxlZCBwYXlsb2FkcyBtaXNzZXMgdGhlIGNhY2hlXG4gKiBvbiBlYWNoIG5ldyBlcGhlbWVyYWwga2V5LlxuICpcbiAqIFRoZSBjYWNoZSBpcyBrZXllZCBieSB0aGUgZXBoZW1lcmFsIHB1YmxpYyBrZXkgYW5kIGhvbGRzIG9uZSBlbnRyeSwgd2hpY2ggaXNcbiAqIHRoZSBjb21tb24gY2FzZSAob25lIHdyaXRlciBwZXIgc3RyZWFtKS4gQSBzZWNvbmQgd3JpdGVyIGV2aWN0cyB0aGUgZmlyc3RcbiAqIHJhdGhlciB0aGFuIGdyb3dpbmcgd2l0aG91dCBib3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wZW5TZXNzaW9uKFxuICBrZXlQYWlyOiBSdW5LZXlQYWlyLFxuICBhYWQ/OiBVaW50OEFycmF5XG4pOiB7IG9wZW4oc2VhbGVkOiBVaW50OEFycmF5KTogUHJvbWlzZTxVaW50OEFycmF5PiB9IHtcbiAgbGV0IGNhY2hlZFNlbmRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgY2FjaGVkS2V5OiBQcm9taXNlPENyeXB0b0tleT4gfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBvcGVuKHNlYWxlZDogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgY29uc3QgbWluTGVuZ3RoID0gWDI1NTE5X0tFWV9MRU5HVEggKyBOT05DRV9MRU5HVEggKyBUQUdfQllURVM7XG4gICAgICBpZiAoc2VhbGVkLmJ5dGVMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICAgICAgYFNlYWxlZCBwYXlsb2FkIHRvbyBzaG9ydDogZXhwZWN0ZWQgYXQgbGVhc3QgJHttaW5MZW5ndGh9IGJ5dGVzLCBnb3QgJHtzZWFsZWQuYnl0ZUxlbmd0aH1gLFxuICAgICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246ICdkZWNyeXB0JywgYnl0ZUxlbmd0aDogc2VhbGVkLmJ5dGVMZW5ndGggfSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVwaGVtZXJhbFB1YmxpY0tleSA9IHNlYWxlZC5zdWJhcnJheSgwLCBYMjU1MTlfS0VZX0xFTkdUSCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBzZWFsZWQuc3ViYXJyYXkoWDI1NTE5X0tFWV9MRU5HVEgpO1xuXG4gICAgICBjb25zdCBzZW5kZXIgPSBrZXlDYWNoZUlkKGVwaGVtZXJhbFB1YmxpY0tleSk7XG4gICAgICBpZiAoc2VuZGVyICE9PSBjYWNoZWRTZW5kZXIgfHwgIWNhY2hlZEtleSkge1xuICAgICAgICBjYWNoZWRTZW5kZXIgPSBzZW5kZXI7XG4gICAgICAgIGNhY2hlZEtleSA9IGRlY2Fwc3VsYXRlKGtleVBhaXIsIGVwaGVtZXJhbFB1YmxpY0tleSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb250ZW50S2V5OiBDcnlwdG9LZXk7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50S2V5ID0gYXdhaXQgY2FjaGVkS2V5O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRG8gbm90IGxldCBvbmUgYmFkIGZyYW1lIHBvaXNvbiB0aGUgY2FjaGUgZm9yIHN1YnNlcXVlbnQgZnJhbWVzLlxuICAgICAgICBjYWNoZWRTZW5kZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNhY2hlZEtleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhZXNHY21EZWNyeXB0KGNvbnRlbnRLZXksIGVuY3J5cHRlZCwgYWFkKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiogU3RhYmxlIGNhY2hlIGtleSBmb3IgYSAzMi1ieXRlIHB1YmxpYyBrZXkuICovXG5mdW5jdGlvbiBrZXlDYWNoZUlkKHB1YmxpY0tleTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGxldCBpZCA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHB1YmxpY0tleS5sZW5ndGg7IGkrKykge1xuICAgIGlkICs9IHB1YmxpY0tleVtpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuICByZXR1cm4gaWQ7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGFkZGl0aW9uYWwgYXV0aGVudGljYXRlZCBkYXRhIHRoYXQgYmluZHMgYSBzZWFsZWQgcGF5bG9hZCB0byBhXG4gKiBzcGVjaWZpYyBydW4uXG4gKlxuICogTWlycm9ycyB0aGUgYGluZm9gIHVzZWQgZm9yIHN5bW1ldHJpYyBwZXItcnVuIGtleSBkZXJpdmF0aW9uIHNvIHRoZSB0d29cbiAqIHNjaGVtZXMgYWdyZWUgb24gd2hhdCBcInRoaXMgcnVuXCIgbWVhbnMuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBzZWFsZWQtYm94IGNvbnN0cnVjdGlvbiBhbHJlYWR5IGJpbmRzIGEgcGF5bG9hZCB0byBpdHNcbiAqIHJlY2lwaWVudCB3aXRob3V0IGFueSBBQUQ6IHRoZSBjb250ZW50IGtleSBpcyBkZXJpdmVkIG92ZXJcbiAqIGBlcGhlbWVyYWxQdWJsaWNLZXkg4oCWIHJlY2lwaWVudFB1YmxpY0tleWAsIGFuZCBhIHJlY2lwaWVudCBwdWJsaWMga2V5IGlzXG4gKiB1bmlxdWUgcGVyIChkZXBsb3ltZW50IGtleSDDlyBwcm9qZWN0IMOXIHJ1bikuIFJlcGxheWluZyBhIHNlYWxlZCBwYXlsb2FkIGF0XG4gKiBhIGRpZmZlcmVudCBydW4gdGhlcmVmb3JlIGZhaWxzIGF0IGtleSBhZ3JlZW1lbnQgcmVnYXJkbGVzcy4gQUFEIGlzXG4gKiBhdmFpbGFibGUgZm9yIGNhbGxlcnMgdGhhdCB3YW50IGFuIGFkZGl0aW9uYWwsIEtERi1pbmRlcGVuZGVudCBiaW5kaW5nOlxuICogYm90aCBzaWRlcyBtdXN0IHN1cHBseSBieXRlLWlkZW50aWNhbCB2YWx1ZXMgb3IgdGhlIHBheWxvYWQgd2lsbCBub3Qgb3Blbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFhZChwcm9qZWN0SWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gaW5mb0VuY29kZXIuZW5jb2RlKGAke3Byb2plY3RJZH18JHtydW5JZH1gKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBydW4ncyBwdWJsaXNoZWQgcHVibGljIGtleSwgdmFsaWRhdGluZyBib3RoIGVuY29kaW5nIGFuZCBsZW5ndGguXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2YWx1ZSBpcyBhYnNlbnQsIG5vdCB2YWxpZCBiYXNlNjQsIG9yIG5vdFxuICogZXhhY3RseSAzMiBieXRlcy4gQ2FsbGVycyB0cmVhdCB0aGF0IGFzIFwidGhpcyBydW4gaGFzIG5vIHVzYWJsZSBwdWJsaWMga2V5XCJcbiAqIGFuZCBmYWxsIGJhY2sgdG8gdGhlIHN5bW1ldHJpYyBwYXRoLCBzbyBhIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkIHN0b3JlZCB2YWx1ZVxuICogZGVncmFkZXMgdG8gdGhlIHByZS1leGlzdGluZyBiZWhhdmlvciBpbnN0ZWFkIG9mIGZhaWxpbmcgYSByZXN1bXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUnVuUHVibGljS2V5KFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYnl0ZXMgPSBiYXNlNjRUb0J5dGVzKHZhbHVlKTtcbiAgaWYgKCFieXRlcyB8fCBieXRlcy5ieXRlTGVuZ3RoICE9PSBYMjU1MTlfS0VZX0xFTkdUSCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGJ5dGVzO1xufVxuIl19
@@ -18,7 +18,7 @@ export async function serialize(value, encryptionKey, options) {
18
18
  try {
19
19
  const payload = devalueCodec.serialize(value, 'client', options);
20
20
  const prefixed = encodeWithFormatPrefix(SerializationFormat.DEVALUE_V1, payload);
21
- // Compress before encrypting encrypted bytes don't compress.
21
+ // Compress before encrypting, since encrypted bytes don't compress.
22
22
  const compressed = await compress(prefixed, options?.compression === true, options?.compressionStats);
23
23
  return encryptData(compressed, encryptionKey);
24
24
  }
@@ -45,4 +45,4 @@ export async function deserialize(data, encryptionKey, options) {
45
45
  }
46
46
  throw new Error(`Unsupported serialization format: ${format}`);
47
47
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUNMLE9BQU8sSUFBSSxXQUFXLEVBQ3RCLE9BQU8sSUFBSSxXQUFXLEdBRXZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBYyxFQUNkLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FDckMsbUJBQW1CLENBQUMsVUFBVSxFQUM5QixPQUFPLENBQ00sQ0FBQztRQUNoQiwrREFBK0Q7UUFDL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQy9CLFFBQVEsRUFDUixPQUFPLEVBQUUsV0FBVyxLQUFLLElBQUksRUFDN0IsT0FBTyxFQUFFLGdCQUFnQixDQUMxQixDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLElBQTBCLEVBQzFCLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUNoQyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FDMUIsQ0FBQztJQUVGLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkMsT0FBTyxZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTFELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsaWVudCAoZXh0ZXJuYWwpIG1vZGUgc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBVc2VkIHdoZW4gc3RhcnRpbmcgd29ya2Zsb3dzIGZyb20gdGhlIGNsaWVudCBzaWRlIChzZXJpYWxpemluZyB3b3JrZmxvd1xuICogYXJndW1lbnRzKSBhbmQgd2hlbiByZWNlaXZpbmcgd29ya2Zsb3cgcmV0dXJuIHZhbHVlcy4gU3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqL1xuXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgQ29kZWNPcHRpb25zIH0gZnJvbSAnLi9jb2RlYy5qcyc7XG5pbXBvcnQgeyBkZXZhbHVlQ29kZWMgfSBmcm9tICcuL2NvZGVjLWRldmFsdWUuanMnO1xuaW1wb3J0IHsgY29tcHJlc3MsIGRlY29tcHJlc3MgfSBmcm9tICcuL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgZGVjcnlwdERhdGEsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdERhdGEsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvciwgcmV0aHJvd0lmUnVudGltZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVjb2RlRm9ybWF0UHJlZml4LCBlbmNvZGVXaXRoRm9ybWF0UHJlZml4IH0gZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkZvcm1hdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZhbHVlIGZyb20gdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyBhcmd1bWVudHMpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZW5jcnlwdGlvbktleT86IFBheWxvYWRLZXksXG4gIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gZGV2YWx1ZUNvZGVjLnNlcmlhbGl6ZSh2YWx1ZSwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBwcmVmaXhlZCxcbiAgICAgIG9wdGlvbnM/LmNvbXByZXNzaW9uID09PSB0cnVlLFxuICAgICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgcmV0dXJuIGVuY3J5cHREYXRhKGNvbXByZXNzZWQsIGVuY3J5cHRpb25LZXkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ2NsaWVudCB2YWx1ZScsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgYSB2YWx1ZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyByZXR1cm4gdmFsdWUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzZXJpYWxpemUoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBlbmNyeXB0aW9uS2V5PzogUGF5bG9hZEtleSxcbiAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdERhdGEoZGF0YSwgZW5jcnlwdGlvbktleSksXG4gICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICApO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgaWYgKGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeSkge1xuICAgICAgcmV0dXJuIGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeShkZWNyeXB0ZWQsICdjbGllbnQnLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBkZXNlcmlhbGl6ZSBub24tYmluYXJ5IGRhdGEgd2l0aG91dCBsZWdhY3kgc3VwcG9ydCdcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIHJldHVybiBkZXZhbHVlQ29kZWMuZGVzZXJpYWxpemUocGF5bG9hZCwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG4iXX0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUNMLE9BQU8sSUFBSSxXQUFXLEVBQ3RCLE9BQU8sSUFBSSxXQUFXLEdBRXZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBYyxFQUNkLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FDckMsbUJBQW1CLENBQUMsVUFBVSxFQUM5QixPQUFPLENBQ00sQ0FBQztRQUNoQixvRUFBb0U7UUFDcEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQy9CLFFBQVEsRUFDUixPQUFPLEVBQUUsV0FBVyxLQUFLLElBQUksRUFDN0IsT0FBTyxFQUFFLGdCQUFnQixDQUMxQixDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLElBQTBCLEVBQzFCLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUNoQyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FDMUIsQ0FBQztJQUVGLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkMsT0FBTyxZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTFELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsaWVudCAoZXh0ZXJuYWwpIG1vZGUgc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBVc2VkIHdoZW4gc3RhcnRpbmcgd29ya2Zsb3dzIGZyb20gdGhlIGNsaWVudCBzaWRlIChzZXJpYWxpemluZyB3b3JrZmxvd1xuICogYXJndW1lbnRzKSBhbmQgd2hlbiByZWNlaXZpbmcgd29ya2Zsb3cgcmV0dXJuIHZhbHVlcy4gU3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqL1xuXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgQ29kZWNPcHRpb25zIH0gZnJvbSAnLi9jb2RlYy5qcyc7XG5pbXBvcnQgeyBkZXZhbHVlQ29kZWMgfSBmcm9tICcuL2NvZGVjLWRldmFsdWUuanMnO1xuaW1wb3J0IHsgY29tcHJlc3MsIGRlY29tcHJlc3MgfSBmcm9tICcuL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgZGVjcnlwdERhdGEsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdERhdGEsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvciwgcmV0aHJvd0lmUnVudGltZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVjb2RlRm9ybWF0UHJlZml4LCBlbmNvZGVXaXRoRm9ybWF0UHJlZml4IH0gZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkZvcm1hdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZhbHVlIGZyb20gdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyBhcmd1bWVudHMpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZW5jcnlwdGlvbktleT86IFBheWxvYWRLZXksXG4gIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gZGV2YWx1ZUNvZGVjLnNlcmlhbGl6ZSh2YWx1ZSwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcsIHNpbmNlIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBwcmVmaXhlZCxcbiAgICAgIG9wdGlvbnM/LmNvbXByZXNzaW9uID09PSB0cnVlLFxuICAgICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgcmV0dXJuIGVuY3J5cHREYXRhKGNvbXByZXNzZWQsIGVuY3J5cHRpb25LZXkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ2NsaWVudCB2YWx1ZScsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgYSB2YWx1ZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyByZXR1cm4gdmFsdWUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzZXJpYWxpemUoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBlbmNyeXB0aW9uS2V5PzogUGF5bG9hZEtleSxcbiAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdERhdGEoZGF0YSwgZW5jcnlwdGlvbktleSksXG4gICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICApO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgaWYgKGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeSkge1xuICAgICAgcmV0dXJuIGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeShkZWNyeXB0ZWQsICdjbGllbnQnLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBkZXNlcmlhbGl6ZSBub24tYmluYXJ5IGRhdGEgd2l0aG91dCBsZWdhY3kgc3VwcG9ydCdcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIHJldHVybiBkZXZhbHVlQ29kZWMuZGVzZXJpYWxpemUocGF5bG9hZCwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG4iXX0=
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { Codec } from './codec.js';
8
8
  /**
9
- * The workflow-mode reducer/reviver key sets exported for the QuickJS
9
+ * The workflow-mode reducer/reviver key sets, exported for the QuickJS
10
10
  * host serde's exhaustiveness test (quickjs-serde.test.ts), which pins
11
11
  * that the handle-space codec implements exactly these.
12
12
  */
@@ -15,8 +15,8 @@ const decoder = new TextDecoder();
15
15
  // Mirrors the node:vm engine's workflow-context abort reducers/revivers in
16
16
  // serialization.ts: reduce by reading the stream/hook symbols stamped at
17
17
  // controller construction; revive to the bootstrap's WorkflowAbortSignal
18
- // class (looked up lazily on globalThis the serde bundle is evaluated
19
- // before the bootstrap defines it).
18
+ // class (looked up lazily on globalThis, since the serde bundle is
19
+ // evaluated before the bootstrap defines it).
20
20
  const ABORT_STREAM_NAME = Symbol.for('WORKFLOW_ABORT_STREAM_NAME');
21
21
  const ABORT_HOOK_TOKEN = Symbol.for('WORKFLOW_ABORT_HOOK_TOKEN');
22
22
  function reduceAbortBySymbol(signal, holder) {
@@ -118,7 +118,7 @@ function getReviversForMode(mode) {
118
118
  }
119
119
  }
120
120
  /**
121
- * The workflow-mode reducer/reviver key sets exported for the QuickJS
121
+ * The workflow-mode reducer/reviver key sets, exported for the QuickJS
122
122
  * host serde's exhaustiveness test (quickjs-serde.test.ts), which pins
123
123
  * that the handle-space codec implements exactly these.
124
124
  */
@@ -145,4 +145,4 @@ export const devalueVmCodec = {
145
145
  return unflatten(data, revivers);
146
146
  },
147
147
  };
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMtZGV2YWx1ZS12bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2NvZGVjLWRldmFsdWUtdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0UsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQWdDLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9FLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVsQyxnRUFBZ0U7QUFDaEUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsd0VBQXdFO0FBQ3hFLG9DQUFvQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNuRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQVNqRSxTQUFTLG1CQUFtQixDQUMxQixNQUE4QyxFQUM5QyxNQUFXO0lBRVgsTUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQ2IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLE1B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QU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLFFBQStDLENBQ2hELENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFnQixFQUFFLElBQXVCO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQStDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBYSxFQUFFLElBQXVCO1FBQ3RELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE9BQU8sU0FBUyxDQUNkLElBQWEsRUFDYixRQUErQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNLWNvbXBhdGlibGUgZGV2YWx1ZSBjb2RlYy5cbiAqXG4gKiBTYW1lIGFzIGNvZGVjLWRldmFsdWUudHMgYnV0IHVzZXMgVk0tY29tcGF0aWJsZSByZWR1Y2Vycy9yZXZpdmVyc1xuICogKG5vIE5vZGUuanMgQnVmZmVyLCBubyBub2RlOnV0aWwpLiBTYWZlIHRvIGJ1bmRsZSBpbnRvIHRoZSBRdWlja0pTIFZNLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHR5cGUgeyBDb2RlYywgU2VyaWFsaXphdGlvbk1vZGUgfSBmcm9tICcuL2NvZGVjLmpzJztcbmltcG9ydCB7IGdldENsYXNzUmVkdWNlcnMsIGdldENsYXNzUmV2aXZlcnMgfSBmcm9tICcuL3JlZHVjZXJzL2NsYXNzLXZtLmpzJztcbmltcG9ydCB7IGdldENvbW1vblJlZHVjZXJzLCBnZXRDb21tb25SZXZpdmVycyB9IGZyb20gJy4vcmVkdWNlcnMvY29tbW9uLXZtLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi12bS5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZHVjZXJzLCB0eXBlIFJldml2ZXJzLCBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gLS0tLSBBYm9ydENvbnRyb2xsZXIgLyBBYm9ydFNpZ25hbCAod29ya2Zsb3cgVk0gY29udGV4dCkgLS0tLVxuLy8gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyB3b3JrZmxvdy1jb250ZXh0IGFib3J0IHJlZHVjZXJzL3Jldml2ZXJzIGluXG4vLyBzZXJpYWxpemF0aW9uLnRzOiByZWR1Y2UgYnkgcmVhZGluZyB0aGUgc3RyZWFtL2hvb2sgc3ltYm9scyBzdGFtcGVkIGF0XG4vLyBjb250cm9sbGVyIGNvbnN0cnVjdGlvbjsgcmV2aXZlIHRvIHRoZSBib290c3RyYXAncyBXb3JrZmxvd0Fib3J0U2lnbmFsXG4vLyBjbGFzcyAobG9va2VkIHVwIGxhemlseSBvbiBnbG9iYWxUaGlzIOKAlCB0aGUgc2VyZGUgYnVuZGxlIGlzIGV2YWx1YXRlZFxuLy8gYmVmb3JlIHRoZSBib290c3RyYXAgZGVmaW5lcyBpdCkuXG5jb25zdCBBQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0FCT1JUX1NUUkVBTV9OQU1FJyk7XG5jb25zdCBBQk9SVF9IT09LX1RPS0VOID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTicpO1xuXG50eXBlIEFib3J0U2VyaWFsaXplZCA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbn07XG5cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogYW55XG4pOiBBYm9ydFNlcmlhbGl6ZWQge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW4sXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsVk0odmFsdWU6IEFib3J0U2VyaWFsaXplZCkge1xuICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgaWYgKHR5cGVvZiBDbHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnV29ya2Zsb3dBYm9ydFNpZ25hbCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgVk0gKGJvb3RzdHJhcCBub3QgZXZhbHVhdGVkKSdcbiAgICApO1xuICB9XG4gIGNvbnN0IHNpZ25hbCA9IG5ldyBDbHModmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG5mdW5jdGlvbiBnZXRBYm9ydFJlZHVjZXJzVk0oKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlLnNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICB2YWx1ZVtBQk9SVF9TVFJFQU1fTkFNRV0gPz8gdmFsdWUuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgaWYgKGhhc0Fib3J0U3ltYm9sID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLnNpZ25hbCwgdmFsdWUpO1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKHZhbHVlIGFzIGFueSlbQUJPUlRfU1RSRUFNX05BTUVdID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlIGFzIGFueSwgdmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEFib3J0UmV2aXZlcnNWTSgpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IEFib3J0U2VyaWFsaXplZCkgPT4gKHtcbiAgICAgIFtBQk9SVF9TVFJFQU1fTkFNRV06IHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgIHNpZ25hbDogcmV2aXZlQWJvcnRTaWduYWxWTSh2YWx1ZSksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgfSksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZTogQWJvcnRTZXJpYWxpemVkKSA9PiByZXZpdmVBYm9ydFNpZ25hbFZNKHZhbHVlKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICd3b3JrZmxvdyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRBYm9ydFJlZHVjZXJzVk0oKSxcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgICAgIC4uLmdldENvbW1vblJlZHVjZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgICBjYXNlICdjbGllbnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZTogU2VyaWFsaXphdGlvbk1vZGUpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ3dvcmtmbG93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmdldEFib3J0UmV2aXZlcnNWTSgpLFxuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldFN0ZXBGdW5jdGlvblJldml2ZXIoKSxcbiAgICAgICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoKSxcbiAgICAgIH07XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdy1tb2RlIHJlZHVjZXIvcmV2aXZlciBrZXkgc2V0cyDigJQgZXhwb3J0ZWQgZm9yIHRoZSBRdWlja0pTXG4gKiBob3N0IHNlcmRlJ3MgZXhoYXVzdGl2ZW5lc3MgdGVzdCAocXVpY2tqcy1zZXJkZS50ZXN0LnRzKSwgd2hpY2ggcGluc1xuICogdGhhdCB0aGUgaGFuZGxlLXNwYWNlIGNvZGVjIGltcGxlbWVudHMgZXhhY3RseSB0aGVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93TW9kZVJlZHVjZXJLZXlzKCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGdldFJlZHVjZXJzRm9yTW9kZSgnd29ya2Zsb3cnKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dNb2RlUmV2aXZlcktleXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZ2V0UmV2aXZlcnNGb3JNb2RlKCd3b3JrZmxvdycpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRldmFsdWVWbUNvZGVjOiBDb2RlYyA9IHtcbiAgZm9ybWF0UHJlZml4OiBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5cbiAgc2VyaWFsaXplKHZhbHVlOiB1bmtub3duLCBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlZHVjZXJzID0gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGUpO1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgcmVkdWNlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT5cbiAgICApO1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXksIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgY29uc3Qgc3RyID0gZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4pO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplTGVnYWN5KGRhdGE6IHVua25vd24sIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihcbiAgICAgIGRhdGEgYXMgYW55W10sXG4gICAgICByZXZpdmVycyBhcyBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PlxuICAgICk7XG4gIH0sXG59O1xuIl19
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMtZGV2YWx1ZS12bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2NvZGVjLWRldmFsdWUtdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0UsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQWdDLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9FLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVsQyxnRUFBZ0U7QUFDaEUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLDhDQUE4QztBQUM5QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNuRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQVNqRSxTQUFTLG1CQUFtQixDQUMxQixNQUE4QyxFQUM5QyxNQUFXO0lBRVgsTUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQ2IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTztRQUNMLFVBQVU7UUFDVixTQUFTO1FBQ1QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ25ELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFzQjtJQUNqRCxNQUFNLEdBQUcsR0FBSSxVQUFrQixDQUFDLHFCQUFxQixDQUFDO0lBQ3RELElBQUksT0FBTyxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyRUFBMkUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxJQUFJLEtBQUssQ0FBQyxPQUFPO1FBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU87UUFDTCxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3ZFLE1BQU0sY0FBYyxHQUNsQixLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNoRSxJQUFJLGNBQWMsS0FBSyxTQUFTO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQy9DLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3RELElBQUssS0FBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssU0FBUztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNsRSxPQUFPLG1CQUFtQixDQUFDLEtBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtCQUFrQjtJQUN6QixPQUFPO1FBQ0wsZUFBZSxFQUFFLENBQUMsS0FBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDckMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQ25DLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7WUFDbEMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7U0FDaEIsQ0FBQztRQUNGLFdBQVcsRUFBRSxDQUFDLEtBQXNCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztLQUNwRSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBdUI7SUFDakQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssVUFBVTtZQUNiLE9BQU87Z0JBQ0wsR0FBRyxrQkFBa0IsRUFBRTtnQkFDdkIsR0FBRyxnQkFBZ0IsRUFBRTtnQkFDckIsR0FBRyxzQkFBc0IsRUFBRTtnQkFDM0IsR0FBRyxpQkFBaUIsRUFBRTthQUN2QixDQUFDO1FBQ0osS0FBSyxNQUFNO1lBQ1QsT0FBTztnQkFDTCxHQUFHLGdCQUFnQixFQUFFO2dCQUNyQixHQUFHLGlCQUFpQixFQUFFO2FBQ3ZCLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLEdBQUcsZ0JBQWdCLEVBQUU7Z0JBQ3JCLEdBQUcsaUJBQWlCLEVBQUU7YUFDdkIsQ0FBQztJQUNOLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUF1QjtJQUNqRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsT0FBTztnQkFDTCxHQUFHLGtCQUFrQixFQUFFO2dCQUN2QixHQUFHLGdCQUFnQixFQUFFO2dCQUNyQixHQUFHLHNCQUFzQixFQUFFO2dCQUMzQixHQUFHLGlCQUFpQixFQUFFO2FBQ3ZCLENBQUM7UUFDSixLQUFLLE1BQU07WUFDVCxPQUFPO2dCQUNMLEdBQUcsZ0JBQWdCLEVBQUU7Z0JBQ3JCLEdBQUcsaUJBQWlCLEVBQUU7YUFDdkIsQ0FBQztRQUNKLEtBQUssUUFBUTtZQUNYLE9BQU87Z0JBQ0wsR0FBRyxnQkFBZ0IsRUFBRTtnQkFDckIsR0FBRyxpQkFBaUIsRUFBRTtnQkFDdEIsWUFBWSxFQUFFLEdBQUcsRUFBRTtvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwREFBMEQsQ0FDM0QsQ0FBQztnQkFDSixDQUFDO2FBQ0YsQ0FBQztJQUNOLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUNELE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBVTtJQUNuQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtJQUU1QyxTQUFTLENBQUMsS0FBYyxFQUFFLElBQXVCO1FBQy9DLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLFFBQStDLENBQ2hELENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFnQixFQUFFLElBQXVCO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQStDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBYSxFQUFFLElBQXVCO1FBQ3RELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE9BQU8sU0FBUyxDQUNkLElBQWEsRUFDYixRQUErQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNLWNvbXBhdGlibGUgZGV2YWx1ZSBjb2RlYy5cbiAqXG4gKiBTYW1lIGFzIGNvZGVjLWRldmFsdWUudHMgYnV0IHVzZXMgVk0tY29tcGF0aWJsZSByZWR1Y2Vycy9yZXZpdmVyc1xuICogKG5vIE5vZGUuanMgQnVmZmVyLCBubyBub2RlOnV0aWwpLiBTYWZlIHRvIGJ1bmRsZSBpbnRvIHRoZSBRdWlja0pTIFZNLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHR5cGUgeyBDb2RlYywgU2VyaWFsaXphdGlvbk1vZGUgfSBmcm9tICcuL2NvZGVjLmpzJztcbmltcG9ydCB7IGdldENsYXNzUmVkdWNlcnMsIGdldENsYXNzUmV2aXZlcnMgfSBmcm9tICcuL3JlZHVjZXJzL2NsYXNzLXZtLmpzJztcbmltcG9ydCB7IGdldENvbW1vblJlZHVjZXJzLCBnZXRDb21tb25SZXZpdmVycyB9IGZyb20gJy4vcmVkdWNlcnMvY29tbW9uLXZtLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi12bS5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZHVjZXJzLCB0eXBlIFJldml2ZXJzLCBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gLS0tLSBBYm9ydENvbnRyb2xsZXIgLyBBYm9ydFNpZ25hbCAod29ya2Zsb3cgVk0gY29udGV4dCkgLS0tLVxuLy8gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyB3b3JrZmxvdy1jb250ZXh0IGFib3J0IHJlZHVjZXJzL3Jldml2ZXJzIGluXG4vLyBzZXJpYWxpemF0aW9uLnRzOiByZWR1Y2UgYnkgcmVhZGluZyB0aGUgc3RyZWFtL2hvb2sgc3ltYm9scyBzdGFtcGVkIGF0XG4vLyBjb250cm9sbGVyIGNvbnN0cnVjdGlvbjsgcmV2aXZlIHRvIHRoZSBib290c3RyYXAncyBXb3JrZmxvd0Fib3J0U2lnbmFsXG4vLyBjbGFzcyAobG9va2VkIHVwIGxhemlseSBvbiBnbG9iYWxUaGlzLCBzaW5jZSB0aGUgc2VyZGUgYnVuZGxlIGlzXG4vLyBldmFsdWF0ZWQgYmVmb3JlIHRoZSBib290c3RyYXAgZGVmaW5lcyBpdCkuXG5jb25zdCBBQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0FCT1JUX1NUUkVBTV9OQU1FJyk7XG5jb25zdCBBQk9SVF9IT09LX1RPS0VOID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTicpO1xuXG50eXBlIEFib3J0U2VyaWFsaXplZCA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbn07XG5cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogYW55XG4pOiBBYm9ydFNlcmlhbGl6ZWQge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW4sXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsVk0odmFsdWU6IEFib3J0U2VyaWFsaXplZCkge1xuICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgaWYgKHR5cGVvZiBDbHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnV29ya2Zsb3dBYm9ydFNpZ25hbCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgVk0gKGJvb3RzdHJhcCBub3QgZXZhbHVhdGVkKSdcbiAgICApO1xuICB9XG4gIGNvbnN0IHNpZ25hbCA9IG5ldyBDbHModmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG5mdW5jdGlvbiBnZXRBYm9ydFJlZHVjZXJzVk0oKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlLnNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICB2YWx1ZVtBQk9SVF9TVFJFQU1fTkFNRV0gPz8gdmFsdWUuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgaWYgKGhhc0Fib3J0U3ltYm9sID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLnNpZ25hbCwgdmFsdWUpO1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKHZhbHVlIGFzIGFueSlbQUJPUlRfU1RSRUFNX05BTUVdID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlIGFzIGFueSwgdmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEFib3J0UmV2aXZlcnNWTSgpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IEFib3J0U2VyaWFsaXplZCkgPT4gKHtcbiAgICAgIFtBQk9SVF9TVFJFQU1fTkFNRV06IHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgIHNpZ25hbDogcmV2aXZlQWJvcnRTaWduYWxWTSh2YWx1ZSksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgfSksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZTogQWJvcnRTZXJpYWxpemVkKSA9PiByZXZpdmVBYm9ydFNpZ25hbFZNKHZhbHVlKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICd3b3JrZmxvdyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRBYm9ydFJlZHVjZXJzVk0oKSxcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgICAgIC4uLmdldENvbW1vblJlZHVjZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgICBjYXNlICdjbGllbnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZTogU2VyaWFsaXphdGlvbk1vZGUpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ3dvcmtmbG93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmdldEFib3J0UmV2aXZlcnNWTSgpLFxuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldFN0ZXBGdW5jdGlvblJldml2ZXIoKSxcbiAgICAgICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoKSxcbiAgICAgIH07XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdy1tb2RlIHJlZHVjZXIvcmV2aXZlciBrZXkgc2V0cywgZXhwb3J0ZWQgZm9yIHRoZSBRdWlja0pTXG4gKiBob3N0IHNlcmRlJ3MgZXhoYXVzdGl2ZW5lc3MgdGVzdCAocXVpY2tqcy1zZXJkZS50ZXN0LnRzKSwgd2hpY2ggcGluc1xuICogdGhhdCB0aGUgaGFuZGxlLXNwYWNlIGNvZGVjIGltcGxlbWVudHMgZXhhY3RseSB0aGVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93TW9kZVJlZHVjZXJLZXlzKCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGdldFJlZHVjZXJzRm9yTW9kZSgnd29ya2Zsb3cnKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dNb2RlUmV2aXZlcktleXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZ2V0UmV2aXZlcnNGb3JNb2RlKCd3b3JrZmxvdycpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRldmFsdWVWbUNvZGVjOiBDb2RlYyA9IHtcbiAgZm9ybWF0UHJlZml4OiBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5cbiAgc2VyaWFsaXplKHZhbHVlOiB1bmtub3duLCBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlZHVjZXJzID0gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGUpO1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgcmVkdWNlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT5cbiAgICApO1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXksIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgY29uc3Qgc3RyID0gZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4pO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplTGVnYWN5KGRhdGE6IHVua25vd24sIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihcbiAgICAgIGRhdGEgYXMgYW55W10sXG4gICAgICByZXZpdmVycyBhcyBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PlxuICAgICk7XG4gIH0sXG59O1xuIl19
@@ -5,7 +5,7 @@
5
5
  * reducers (serialize) and revivers (deserialize) which are composed
6
6
  * internally based on the serialization mode.
7
7
  *
8
- * The reducer/reviver pattern is specific to devalue other codecs
8
+ * The reducer/reviver pattern is specific to devalue: other codecs
9
9
  * (CBOR, JSON) would handle types differently (e.g. CBOR supports Date,
10
10
  * typed arrays, Map, Set natively).
11
11
  */